簡介
- 同為
C4遇到的問題:模擬各種網絡流量時,若使用真實環境下流量,需要對真實環境報文進行抓取。 - 學長推薦使用
Scapy進行抓取,於是做了一點筆記。
Sniff
參數
| 參數名 | 用途 | 默認值 |
|---|---|---|
| count | 抓包的個數,0為無限 |
0 |
| store | 是否存儲抓到的包 | 1 |
| offline | 從pcap文件讀取 |
None |
| prn | 回調函數(一般是lambda) |
None |
| session | 流處理器 | TCPSession |
| filter | BPF過濾規則 |
None |
| L2socket | 特定的L2socket | None |
| timeout | 設置中斷計時器 | None |
| opened_socket | 使用recv讀取打開的socket |
None |
| stop_filter | 設置中斷過濾規則 | None |
| iface | 指定網卡,None則代表所有網卡 |
None |
回調函數:一個高層調用底層,底層再回過頭來調用高層的過程。
BPF:柏克萊封包過濾器(
Berkeley Packet Filter,縮寫BPF),是類Unix系統上數據鏈路層的一種原始接口,提供原始鏈路層封包的收發。
常規使用
TCP
from scapy.all import *
def CallBack(packet):
print ( packet.show() )
if packet.haslayer('TCP'):
print (packet['TCP'].sport)
print (packet['TCP'].dport)
print (packet['TCP'].seq)
print (packet['TCP'].dataofs)
filter="tcp"
sniff(filter=filter, prn=callback, iface='WLAN', count=0)
ARP
from scapy.all import *
def CallBack(packet):
print ( packet.show() )
if packet.haslayer('ARP'):
print (packet['ARP'].psrc)
print (packet['ARP'].pdst)
print (packet['ARP'].hwsrc)
print (packet['ARP'].hwdst)
time.sleep(2)
filter="arp"
sniff(filter=filter, prn=CallBack, iface='WLAN', count=0)
HTTP
from scapy.all import *
def CallBack(packet):
if packet.haslayer('HTTP'):
http = packet.payload.payload.payload
print(http.show())
sniff(prn=CallBack, iface='WLAN', count=0)
原始的
Scapy對http抓包的支持不夠友好,數據包的分割只能到TCP級別,需要編碼將TCP包合並為HTTP數據包,故無法對應用層數據包進行篩選。
packet是在網卡抓到的幀,每取一次payload就相當於向上解封裝一次。
