Python 黑帽程式設計 4.2 Sniffer 之資料本地儲存和載入

玄魂發表於2019-03-02

在上一節,我們完成了編寫一個簡易的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方法將資料儲存到本地。執行結果如下:

Python 黑帽程式設計 4.2 Sniffer 之資料本地儲存和載入

下面我們看看如何從磁碟讀取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檔案,之後就可以
迴圈處理每一個資料包了。執行結果如下:

Python 黑帽程式設計 4.2 Sniffer 之資料本地儲存和載入

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方法將資料包寫入檔案。執行結果如下:

Python 黑帽程式設計 4.2 Sniffer 之資料本地儲存和載入

另外一種方式為配置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方法接收一個檔案路徑引數,返回所有的資料包。執行結果如下:

Python 黑帽程式設計 4.2 Sniffer 之資料本地儲存和載入

4.2.3 小結

讀取和儲存資料的方法很多,這裡結合本教程例項,只介紹這兩種較為簡單的方法。


檢視更多Python黑客程式設計及安全類文章,請關注玄魂工作室微信訂閱號(xuanhun521)。

Python 黑帽程式設計 4.2 Sniffer 之資料本地儲存和載入

相關文章