python之用scapy分層解析pcap報文(Ethernet幀、IP數據包、TCP數據包、UDP數據包、Raw數據包)

一、工具準備

  下載安裝scapy庫(https://blog.csdn.net/qq_23977687/article/details/88046257)

  安裝完後: 

  ls()  命令可以查看所有支持的協議
  ls(IP) 命令列出ip協議頭部字段格式,只要想查看哪個協議的參數,括號裏就填哪個協議
  IP().show() 列出ip包的信息
  lsc() 命令列出scapy的所有命令 
  conf 命令列出scapy 的配置參數

二、scapy用法

   scapy是python中一個可用於網絡嗅探的非常強大的第三方庫,可以用它來做 packet 嗅探和僞造 packet。 scapy已經在內部實現了大量的網絡協議。如DNS、ARP、IP、TCP、UDP等等,可以用它來編寫非常靈活實用的工具。

換言之,Scapy 是一個強大的操縱報文的交互程序。它可以僞造或者解析多種協議的報文,還具有發送、捕獲、匹配請求和響應這些報文以及更多的功能。Scapy 可以輕鬆地做到像掃描(scanning)、路由跟蹤(tracerouting)、探測(probing)、單元測試(unit tests)、攻擊(attacks)和發現網絡(network discorvery)這樣的傳統任務。它可以代替 hping 、arpspoof 、arp-sk、arping,p0f 甚至是部分的Namp、tcpdump 和 tshark 的功能。

1.1、得到數據

  有兩種方式,實時抓包,讀取 pcap文件
  1.1.1 實時抓包:scapy抓包使用 sniff() 函數,這個函數有很多參數

def sniff(count=0, store=1, offline=None, prn=None,filter=None, L2socket=None, timeout=None, opened_socket=None, stop_filter=None, iface=None,*args,**kargs)

  count:抓包的數量,0表示無限制;
  store:保存抓取的數據包或者丟棄,1保存,0丟棄
  offline:從 pcap 文件讀取數據包,而不進行嗅探,默認爲None
  prn:爲每一個數據包定義一個函數,如果返回了什麼,則顯示。例如:prn = lambda x: x.summary();    (  packct.summar()函數返回的是對包的統計性信息 )
  filter:過濾規則,使用wireshark裏面的過濾語法
  L2socket:使用給定的 L2socket
  timeout:在給定的時間後停止嗅探,默認爲 None
  opened_socket:對指定的對象使用 .recv() 進行讀取;
  stop_filter:定義一個函數,決定在抓到指定數據包後停止抓包,如:stop_filter = lambda x: x.haslayer(TCP);
  iface:指定抓包的接口

   實例:(eth0是要檢測的網卡名,count是抓包的數量)

from scapy.all import *
packets = sniff(iface=eth0, count=1)

  1.1.2 讀取pcap文件:利用這個庫中的 rdpcap()方法來實現

import scapy.all as scapy
packets = scapy.rdpcap(xx.pcap)


 2.1、解析結果

  2.1.1 使用scapy的內置函數 show() 打印結果

for p in packets:
    p.show()

  輸出: 

###[ Ethernet ]### 
  dst       = 14:43:d0:65:ae:a2
  src       = 88:b8:5d:bd:0d:7f
  type      = IPv4
###[ IP ]### 
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 40
     id        = 28350
     flags     = 
     frag      = 0
     ttl       = 128
     proto     = udp
     chksum    = 0x0
     src       = 192.168.1.56
     dst       = 192.144.236.192
     \options   \
###[ UDP ]### 
        sport     = 59297
        dport     = ms_wbt_server
        len       = 20
        chksum    = 0x6f27
###[ Raw ]### 
           load      = '\xae;\xf8\x01\x04\x00\x04\x04\x00\x01\x07\x00'

  通過上述輸出結果,我們可以看得出每個層的數據包有哪些屬性可以取出。
  這裏P代表的是Ethernet層。P.dst (取出dst屬性)、P.src (取出src屬性)、P.type (取出type屬性)

  每一層都有一個 payload 屬性,可以不斷進入下一層。

  p.payload:IP層(可用 p.payload.*  取出IP層的屬性)
  p.payload.payload:TCP/UDP層(可用 p.payload.payload.*  取出TCP/UDP層的屬性)
  p.payload.payload.payload:RAW層(可用 p.payload.payload.payload.*  取出RAW層的屬性)

  
  2.2 根據列表標籤查找輸出

  我們可以查看第一個數據包:package[0]是查看第一個數據包的數據,package[0].show()是查看第一個數據包的詳細信息,scapy是按照按照 TCP/IP 四層參考模型顯示詳細包信息的,即:鏈路層 [Ethernet]、網絡層[IP]、傳輸層[TCP/UDP]、應用層[RAW] 。我們還可以通過協議來查看指定的包:

  package[UDP][0].show() ,因爲我們這裏只有UDP的數據包,所以就沒有這樣使用。,而我們也可以直接只獲取指定層的數據,如: pcap[UDP][1][Ether].dst   這個包裏面是等於ff:ff:ff:ff:ff:ff

from scapy.all import *
package=sniff(iface='eth0',count=10)  #掃描eth0網卡的數據包,總數爲10個
print(package)
print(package[0])   #查看第一個數據包的數據
print(package[0].show())  #查看第一個數據包的詳情 
######################################################################
<Sniffed: TCP:0 UDP:9 ICMP:0 Other:1>
 
b"\xff\xff\xff\xff\xff\xff\xc8[v\xec5\xed\x08\x00E\x00\x01#8G\x00\x00@\x11\x17=\n`\n\x88\n`\n\xff\xd6\x83\xd6\x83\x01\x0fN\xa0\x00qu-PC\x00\x00H\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x1dF\x02\x00\x00\x00\x00\xd0\xb5\x1d\x07\x00\x00\x00\x003'\x00\x00\x00\x00\x00\x00\xd0\x1dF\x02\x00\x00\x00\x00\xc02\xc5\x05\x00\x00\x00\x00|j\x85`\x00\x00\x00\x00p\xa4/a\x00\x00\x00\x00\xf9\xb9\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\xfe\xcc\x05\x00\x00\x00\x00D\xb6\x1d\x07\x00\x00\x00\x00`\xb6\x1d\x07\x00\x00\x00\x00H\xaa {efdced0c-1ada-40e0-a13e-2968030599d4}\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00@\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x00\xc5\xac"
 
###[ Ethernet ]### 
  dst       = ff:ff:ff:ff:ff:ff
  src       = c8:5b:76:ec:35:ed
  type      = 0x800
###[ IP ]### 
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 291
     id        = 14407
     flags     = 
     frag      = 0
     ttl       = 64
     proto     = udp
     chksum    = 0x173d
     src       = 10.96.10.136
     dst       = 10.96.10.255
     \options   \
###[ UDP ]### 
        sport     = 54915
        dport     = 54915
        len       = 271
        chksum    = 0x4ea0
###[ Raw ]### 
           load      = "\x00qu-PC\x00\x00H\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x1dF\x02\x00\x00\x00\x00\xd0\xb5\x1d\x07\x00\x00\x00\x003'\x00\x00\x00\x00\x00\x00\xd0\x1dF\x02\x00\x00\x00\x00\xc02\xc5\x05\x00\x00\x00\x00|j\x85`\x00\x00\x00\x00p\xa4/a\x00\x00\x00\x00\xf9\xb9\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\xfe\xcc\x05\x00\x00\x00\x00D\xb6\x1d\x07\x00\x00\x00\x00`\xb6\x1d\x07\x00\x00\x00\x00H\xaa {efdced0c-1ada-40e0-a13e-2968030599d4}\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00@\xb6\x1d\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00n\x00\xc5\xac"

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章