Scapy之sniff抓包


簡介

  • 同為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)

原始的Scapyhttp抓包的支持不夠友好,數據包的分割只能到TCP級別,需要編碼將TCP包合並為HTTP數據包,故無法對應用層數據包進行篩選。

packet是在網卡抓到的幀,每取一次payload就相當於向上解封裝一次。

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM