在上一節,我們完成了編寫一個簡易的Sniffer的第一步——數據捕獲。
很多時候,我們需要將捕獲的數據先保存到磁盤上,之后再使用工具或者自己編寫代碼來進行詳細分析。
本節我們在上一節的基礎上來講解保存捕獲數據的方式,當然使用tcpdump或者WireShark都可以
很方便的存儲數據包。
4.2.1 使用pcapy保存和讀取數據
前文我們使用 pcapy的open_live方法,可以獲取pcapy的一個實例對象,通過該對象的dump_open
方法可以獲取一個dump對象,通過dump對象可以保存數據包到本地磁盤。示例如下:
#!/usr/bin/python
import pcapy
dev = "eth0"
filter = "tcp and port 80"
def save_packet(hdr, data):
dumper.dump(hdr, data)
pcap = pcapy.open_live(dev, 1500, 0, 100)
dumper = pcap.dump_open('sniffer.pcap')
pcap.setfilter(filter)
pcap.loop(0, save_packet)
上面的代碼中,我們首先通過dump_open方法獲取dumper對象,隨后在循環捕獲數據的時候
調用save_packet方法,該方法中調用dump方法將數據保存到本地。運行結果如下:
下面我們看看如何從磁盤讀取pcap文件。
#!/usr/bin/python
import pcapy
dev = "eth0"
filter = "tcp and port 80"
def read_packet(hdr, data):
print data
pcap = pcapy.open_offline('sniffer.pcap')
pcap.loop(0, read_packet)
在上面的帶碼中,我們使用pcapy的open_offline方法從本地打開一個pcap文件,之后就可以
循環處理每一個數據包了。運行結果如下:
4.2.2 使用Scapy保存和讀取數據
上一節我們講了Scapy的基礎用法,Scapy支持將捕獲的數據保存成多種數據格式,比如hex,base64等,
利用Scapy來保存捕獲的數據到pcap文件,有兩種方式,第一種為使用PcapWriter模塊,例如:
from scapy.all import *
from scapy.utils import PcapWriter
def packetHandler(pkt):
pktdump.write(pkt)
pktdump = PcapWriter("ssss.pcap", append=True, sync=True)
sniff(filter='tcp and port 80',prn=packetHandler,iface='eth0')
初始化PcapWriter對象需要傳入三個參數,要保存的文件名、是否追加數據,是否同步順序添加。
之后在packetHandler方法中,調用write方法將數據包寫入文件。運行結果如下:
另外一種方式為配置sniff方法的offline參數。例如:
sniff(filter='tcp and port 80',iface='eth0',offline="temp.cap")
讀取pcap文件可以使用scapy.all 模塊中的rdpcap方法。例如:
from scapy.all import *
packets = rdpcap('ssss.pcap')
for packet in packets:
print packet
如上,rdpcap方法接收一個文件路徑參數,返回所有的數據包。運行結果如下:
4.2.3 小結
讀取和保存數據的方法很多,這里結合本教程實例,只介紹這兩種較為簡單的方法。
查看更多Python黑客編程及安全類文章,請關注玄魂工作室微信訂閱號(xuanhun521)。