python 進行抓包嗅探

一、緒論

最近一直想弄一個代理,並且對數據包進行解讀,從而完成來往流量的嗅探。於是今天學習了一下如何使用Python抓包並進行解包。

首先要用到兩個模塊

dpkt(我這邊ubuntu16.04 LTS)Python2.7中默認安裝的

pcap安裝

1 pip install pypcap

然後來說一下,pypcap主要用來抓包或者說是sniffer的,dpkt用來解包的,我對dpkt的認知是解包傳輸層以及傳輸層一下的數據比較不錯,但是對於應用層數據的解讀就是渣渣。尤其是HTTP,所以HTTP部分解包,是我自己重寫的,並沒有使用dpkt.http.Request和dpkt.http.Response。(總他媽報錯).

二、目前做到:

(1)正常解碼請求和響應數據包。

(2)對於長連接傳輸數據的數據包解讀失敗。

三、先來講抓包

複製代碼
 1 import pcap
 2 import dpkt
 3 
 4 sniffer = pcap.pcap(name="eth1")   #name parameter => interface name
 5 sniffer.setfilter("tcp")                         #filter sentence
 6 for packet_time packet_data in sniifer:
 7     pass
 8 
 9 # packet_time  => packet receive time
10 # packet_data  => ethernet level data
複製代碼

四、解包:

1 packet = dpkt.ethernet.Ethernet(pdata)#二層數據報文嘛
2 print "SRC IP:%d.%d.%d.%d"%tuple(map(ord,list(packet.data.src)))
3 print "DST IP:%d.%d.%d.%d"%tuple(map(ord,list(packet.data.dst)))
4 print "SRC PORT:%s"%packet.data.data.sport
5 print "DST PORT:%s"%packet.data.data.dport

五、HTTP部分是我自己解的包:

複製代碼
 1 def http_request_analyst(string):
 2         string = string[1:-1]
 3         method = string.split(" ")[0]
 4         print "Method:",method
 5         path = string.split(" ")[1]
 6         print "Path:",urllib.unquote(path)
 7         protover = string.split(" ")[2].split("\\r\\n")[0]
 8         print "Protocol Version:",protover
 9         headers = string.split("\\r\\n\\r\\n")[0].split("\\r\\n")[1:]
10         print "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
11         print "Header:"
12         for header in headers:
13                 header = header.split(":")
14                 try:
15                         hstr = "%s:%s"%(str(header[0]),str(header[1])) if header[0] not in ["Referer"] else "%s:%s:%s"%(str(header[0]),str(header[1]),str(header[2]))
16                 except Exception,ex:
17                         print "[*]",ex
18                         print header
19                         raw_input()
20                 print hstr
21         print "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
22         print "Data:",string.split("\\r\\n")[-1]
複製代碼
複製代碼
 1 def http_response_analyst(string):
 2         string = string[1:-1]
 3         protover = string.split(" ")[0]
 4         print "Protocol Version:",protover
 5         status_code = string.split(" ")[1]
 6         print "Response Code:",status_code
 7         status_string = string.split(" ")[2].split("\\r\\n")[0]
 8         print "Reposne String:",status_string
 9         headers = string.split("\\r\\n\\r\\n")[0].split("\\r\\n")[1:]
10         print repr(headers)
11         print repr(string)
12         print "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
13         print "Header:"
14         for header in headers:
15                 header = header.split(":")
16                 try:
17                         hstr = "%s:%s"%(str(header[0]),str(header[1])) if header[0] not in ["Referer"] else "%s:%s:%s"%(str(header[0]),str(header[1]),str(header[2]))
18                 except Exception,ex:
19                         print "[*]",ex
20                         print header
21                         raw_input()
22                 print hstr
23         print "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
24         print "Data:",string.split("\\r\\n")[-1]
複製代碼

六、效果如圖了:

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