Python使用scapy模塊發(fā)包收包
眾所周知,我們每天上網(wǎng)都會有很多數(shù)據(jù)包需要發(fā)送,然后處理在接受在發(fā)送,這樣一個循環(huán)往復的過程
這里就顯示了很多數(shù)據(jù)包的發(fā)送接收數(shù)據(jù),那什么是包呢?下面一起看看
包( packet )是網(wǎng)絡通信傳輸中的數(shù)據(jù)單位,一般稱之為數(shù)據(jù)包,其主要由源地址,目標地址,凈載數(shù)據(jù)組成
它包括包頭和包體,包頭是固定長度,包體長度不變
簡單了解下包的定義,下面我們來看看發(fā)包利器 scapy 的用法吧
一、常用命令1、ls():顯示所有支持的數(shù)據(jù)包對象,可帶參數(shù)也可不帶,參數(shù)可以是任意具體的包
可以看出,它包含了全部的內(nèi)容,如果我們想詳細查看某個模塊中的內(nèi)容,比如說我想查看 ARP ,tcp 的話了,可以這樣:
在這里要告訴大家的是,我們必須要注意大小寫,ls(ARP)這樣才可以得出正確結果,ls(arp)是錯誤的。
2、lsc():列出所有函數(shù)
滿屏的英文,我頭都是大的,不知道大家此時此刻是什么樣的心情,哈哈哈哈
3、hide_defaults():用來刪除一些用戶提供的那些和 default value 相同的項目
a=IP()print(a.hide_defaults())
4.display():可以簡單查看當前 packet 的各個參數(shù)的取值情況,
a=IP()a.display()
5.更多命令
命令 作用show_interfaces() 顯示網(wǎng)卡信息str(pkt) 組裝數(shù)據(jù)包hexdump(pkt)十六進制轉(zhuǎn)儲ls(pkt) 顯示出字段值的列表pkt.summary()一行摘要pkt.show() 針對數(shù)據(jù)包的展開視圖pkt.show2() 顯示聚合的數(shù)據(jù)包(例如,計算好了的校驗和)pkt.sprintf() 用數(shù)據(jù)包字段填充格式字符串pkt.decode_payload_as() 改變payload的decode方式pkt.psdump()繪制一個解釋說明的PostScript圖表pkt.pdfdump() 繪制一個解釋說明的PDFpkt.command() 返回可以生成數(shù)據(jù)包的Scapy命令nsummary() 同上,但規(guī)定了數(shù)據(jù)包數(shù)量conversations() 顯示一個會話圖表filter() 返回一個lambda過濾后的數(shù)據(jù)包列表hexdump() 返回所有數(shù)據(jù)包的一個hexdumpimport_hexcap() 將hexdump重新導入到Scapy中hexraw() 返回所有數(shù)據(jù)包Raw layer的hexdumppadding() 返回一個帶填充的數(shù)據(jù)包的hexdumpnzpadding() 返回一個具有非零填充的數(shù)據(jù)包的hexdumpplot() 規(guī)劃一個應用到數(shù)據(jù)包列表的lambda函數(shù)make table() 根據(jù)lambda函數(shù)來顯示表格traceroute('baidu.com') 查看IP路徑的traceroute功能export_object() 數(shù)據(jù)包轉(zhuǎn)換成base64編碼的Python數(shù)據(jù)結構import_object() 可以將輸出重新導入save_session() 保存所有的session變量load_session() 讀取保存的sessionfuzz() 更改一些默認的不被計算的值(比如校驗和checksums),更改的值是隨機的,但是是符合字段的值的。二、嗅探數(shù)據(jù)包
from scapy.all import *pkt = sniff(iface = 'Realtek PCIe GBE Family Controller',count = 3 ,filter=’tcp’,prn = lambda x: x.sprintf(’{IP:%IP.src%->%IP.dst%n}{Raw:%Raw.load%n}’))filter:過濾條件iface:網(wǎng)卡接口名稱count:數(shù)據(jù)包數(shù)量prn:回調(diào)函數(shù),通常與lambda搭配使用sprintf()函數(shù)控制輸入信息抓取源地址為192.168.3.3的端口為80的tcp報文:sniff(filter='ip src 192.168.3.3 and tcp and tcp port 80', prn=lambda x:x.summary())抓取目的地址網(wǎng)段為192.168.3.3/24的報文:sniff(filter='dst net 192.168', prn=lambda x:x.summary())抓取非ICMP的報文:sniff(filter='not icmp', prn=lambda x:x.summary())將抓取到的報文的summary打印出來:sniff(filter='icmp', prn=lambda x:x.summary(), count=10)將所有IP報文的源地址打印出來:sniff(filter='icmp', prn=lambda x:x[IP].src, count=10)三、構造數(shù)據(jù)包
pkt= Ether()/IP(dst=’192.168.1.2’)/TCP(dport=80)
提到數(shù)據(jù)包,不得不說各個協(xié)議了,提到協(xié)議,又自然而然想到了 osi 七層模型
OSI 七層網(wǎng)絡模型 TCP/IP 四層概念模型 對應網(wǎng)絡協(xié)議 應用層(Application) 應用層 HTTP、TFTP, FTP, NFS, WAIS、SMTP 表示層(Presentation) 應用層 Telnet, Rlogin, SNMP, Gopher 會話層(Session) 應用層 SMTP, DNS 傳輸層(Transport) 傳輸層 TCP, UDP 網(wǎng)絡層(Network) 網(wǎng)絡層 IP, ICMP, ARP, RARP, AKP, UUCP 數(shù)據(jù)鏈路層(Data Link) 數(shù)據(jù)鏈路層 FDDI, Ethernet, Arpanet, PDN, SLIP, PPP 物理層(Physical) 數(shù)據(jù)鏈路層 IEEE 802.1A, IEEE 802.2到IEEE 802.11以上便是各個網(wǎng)絡協(xié)議對應的 osi 模型,那么各個協(xié)議的用法是怎樣的了,下面我們一起來看下
四、各個協(xié)議用法1、構造一個 IP 包,并傳入一些參數(shù)
#構造一個 IP 包,并傳入一些參數(shù)pkt = IP(dst='192.168.1.2',ttl=10)ls(pkt) version:版本號ihl:頭長度tos:服務類型len:IP數(shù)據(jù)包總長id:標識符flags:標記flag:片偏移ttl:生存時間proto:協(xié)議類型chksum:頭部校驗src:源IP地址dst:目的IP地址options:可選項
2、構造ARP包
#構造ARP包ARP(op=1, hwdst='ff:ff:ff:ff:ff:ff', pdst=ip_address)#arp類的構造函數(shù)列表:ls(ARP)hwtype : XShortField = (1) 值為1表示以太網(wǎng)地址,其它還可能表示令牌環(huán)地址ptype : XShortEnumField = (2048) 0x0800表示IP地址,其它還可能是ICMP/IGMPhwlen : ByteField = (6) ARP報文中,它的值為6plen : ByteField = (4) ARP報文中,它的值為4op : ShortEnumField = (1) 取值為1或者2,代表ARP請求或者響應包。1.ARP請求,2.ARP應答,3.RARP請求,4.RARP應答 hwsrc : ARPSourceMACField = (None) 發(fā)送方Mac地址。psrc : SourceIPField= (None) 發(fā)送方IP地址。hwdst : MACField = (’00:00:00:00:00:00’) 目標Mac地址。pdst : IPField = (’0.0.0.0’) 目標IP地址。
3、構造Ether
#構造EtherEther(dst='ff:ff:ff:ff:ff:ff')ls(Ether)dst: DestMACField = (None) 目的MACsrc: SourceMACField = (None) 源MACtype : XShortEnumField = (36864)構造一個以太網(wǎng)數(shù)據(jù)包通常需要指定目標和源MAC地址,如果不指定,默認發(fā)出的就是廣播包ff:ff:ff:ff:ff:ff
4、構造TCP包
#構造TCP包sport : ShortEnumField = 20 (20) 目標端口dport : ShortEnumField = 80 (80) 源端口seq: IntField = 0 (0)ack: IntField = 0 (0)dataofs : BitField (4 bits) = None (None)reserved : BitField (3 bits) = 0 (0)flags : FlagsField (9 bits) = <Flag 2 (S)> (<Flag 2 (S)>)window : ShortField = 8192 (8192)chksum : XShortField = None (None)urgptr : ShortField = 0 (0)options : TCPOptionsField = [] (b’’)五、發(fā)包,收包
可分為兩種情況,用法如下:
1、只發(fā)不收
send(pkt, inter=0, loop=0, count=1, iface=N) pkt:數(shù)據(jù)包inter:發(fā)包間隔時間count:發(fā)包數(shù)量iface:網(wǎng)卡接口名稱send(),在第三層發(fā)包,沒有接收功能;send(IP(dst='www.baidu.com',ttl=2)/ICMP())sendp(),在第二層發(fā)包,沒有接收功能。sr(Ether()/IP(dst=www.baidu.com))
2、發(fā)包且收包
sr()和sr1()都是在第三層發(fā)包,sr1表示只接收第一個回復。sr(IP(dst='www.baidu.com',ttl=(1,4))/TCP(dport=[21,23,80],flags='S')) 返回兩個值sr1(IP(dst='www.baidu.com',ttl=(1,4))/ICMP()) srloop(IP(dst='www.baidu.com',ttl=1)/ICMP()) #不停的ping百度srloop(IP(dst='www.baidu.com',ttl=1)/ICMP(),inter=3,count=2) #每隔3秒ping一次,一共執(zhí)行兩次#inter表示間隔,count記錄次數(shù)srp()和srp1()都是根據(jù)第二層發(fā)包,srp1表示只接收第一個回復srp(Ether()/IP(dst='www.baidu.com'))srp1(Ether()/IP(dst=www.baidu.com))六、SYN半開式掃描
當 TCP 鏈接指定端口時,flags 參數(shù)設為 S 時則為半開式掃描,若此時該端口處于監(jiān)聽狀態(tài),返回 syn/ack,否則返回 rst/ack
sr1(IP(dst='192.168.1.2')/TCP(dport=80,flags='S'))七、數(shù)據(jù)包序列化,反序列化
序列化:將數(shù)據(jù)包對象保存為 pcap 文件
反序列化:讀取 pcap 文件中的內(nèi)容
pkt= Ether()/IP(dst=’192.168.1.2’)/TCP(dport=80)#將嗅探到的數(shù)據(jù)包內(nèi)容寫到pcap文件中 wrpcap('hw.pcap',pkt)#讀取pcap文件。read=rdpcap(’hw.pcap’)print(read[1])#打印嗅探到的包的數(shù)據(jù)八、數(shù)據(jù)包與字符串轉(zhuǎn)換
更加直觀清晰的分析數(shù)據(jù)。
zfc= str(pkts[0]) z= Ether(zfc)九、導入導出 base64 編碼
為了方便我們對數(shù)據(jù)進行加密而發(fā)明的一種方式
export_object(str(pkts[0])) 導出數(shù)據(jù)包new_Pkt = import_object() #將上一步導出的字符串填入十、離線數(shù)據(jù)包的解析
如果我們捕獲到數(shù)據(jù)包,未聯(lián)網(wǎng)的情況下如何解析呢?
現(xiàn)在就可以使用我們的離線數(shù)據(jù)包分析數(shù)據(jù)了:
sniff(offline = 'hw.pcap')#離線數(shù)據(jù)包總結
通過上面的學習,我們對 scapy 算是有了一個基礎性的認識了,scapy 的確很強大,簡單的幾行命令就能實現(xiàn)發(fā)包收包,極大的節(jié)省了我們的開發(fā)時間
如果你深入學習它的每個命令,你會發(fā)現(xiàn)更多有趣的事情,當然這么強大的工具可不要拿來做壞事哦!
以上就是Python使用scapy模塊發(fā)包收包的詳細內(nèi)容,更多關于Python用scapy模塊發(fā)包收包的資料請關注好吧啦網(wǎng)其它相關文章!
相關文章:
