1、緒論ubuntu
最近一直想弄一個代理,而且對數據包進行解讀,從而完成來往流量的嗅探。因而今天學習了一下如何使用Python抓包並進行解包。tcp
首先要用到兩個模塊學習
dpkt(我這邊ubuntu16.04 LTS)Python2.7中默認安裝的url
pcap安裝spa
1 pip install pypcap
而後來講一下,pypcap主要用來抓包或者說是sniffer的,dpkt用來解包的,我對dpkt的認知是解包傳輸層以及傳輸層一下的數據比較不錯,可是對於應用層數據的解讀就是渣渣。尤爲是HTTP,因此HTTP部分解包,是我本身重寫的,並無使用dpkt.http.Request和dpkt.http.Response。(總他媽報錯).代理
2、目前作到:code
(1)正常解碼請求和響應數據包。blog
(2)對於長鏈接傳輸數據的數據包解讀失敗。ip
3、先來說抓包input
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
4、解包:
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
5、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]
6、效果如圖了: