scapy 是 python 處理網(wǎng)絡包最常用且靈活的工具,適用于嗅探、分析和協(xié)議解析。其核心使用方法包括:1. 安裝 scapy 并確保以管理員權(quán)限運行;2. 使用 sniff() 函數(shù)捕獲數(shù)據(jù)包并實時或按數(shù)量處理;3. 通過 haslayer() 和 getlayer() 提取特定協(xié)議字段進行深度分析;4. 利用 Filter 參數(shù)實現(xiàn)流量過濾提升效率;5. 使用 wrpcap() 將數(shù)據(jù)包保存為 .pcap 文件以便后續(xù)分析。
python 要處理網(wǎng)絡包,特別是做嗅探和分析這類底層操作,最常用也最靈活的工具之一就是 Scapy。它不僅能構(gòu)造、發(fā)送和捕獲數(shù)據(jù)包,還能解析各種協(xié)議結(jié)構(gòu),非常適合做網(wǎng)絡調(diào)試、安全測試或者學習網(wǎng)絡協(xié)議。
下面我從幾個常見使用場景出發(fā),講講怎么用 Scapy 嗅探和分析網(wǎng)絡包。
安裝 Scapy 和權(quán)限準備
Scapy 是一個 Python 庫,安裝方式很簡單:
立即學習“Python免費學習筆記(深入)”;
pip install scapy
不過要注意的是,Scapy 需要管理員權(quán)限才能進行嗅探,也就是說你在 linux 或 macos 上要用 sudo 執(zhí)行腳本,在 windows 上則需要用管理員身份運行命令行或 ide。
另外,如果你是在虛擬機或者某些云環(huán)境中,可能還需要啟用混雜模式(Promiscuous Mode)才能抓到所有流量。
簡單嗅探:捕獲基本的數(shù)據(jù)包
Scapy 提供了一個 sniff() 函數(shù),可以快速開始監(jiān)聽網(wǎng)絡接口上的數(shù)據(jù)包。
比如,想看看當前網(wǎng)卡上流過的所有流量,可以用這段代碼:
from scapy.all import sniff packets = sniff(count=10) # 捕獲10個包后停止 packets.summary()
- count=10 表示只抓10個包。
- summary() 會顯示每個包的基本信息,比如源地址、目標地址、協(xié)議類型等。
如果你想一直抓包,可以去掉 count 參數(shù):
sniff(prn=lambda x: x.summary()) # 實時打印每個包的摘要
這種方式適合快速查看網(wǎng)絡活動,但還不能做深度分析。
深度分析:提取特定協(xié)議字段
Scapy 的優(yōu)勢在于它能層層解析數(shù)據(jù)包結(jié)構(gòu)。例如,你想找出所有的 TCP 包,并查看它們的源端口和目的端口,可以這樣做:
def process_packet(packet): if packet.haslayer('TCP'): tcp_layer = packet.getlayer('TCP') print(f"Source Port: {tcp_layer.sport}, Destination Port: {tcp_layer.dport}") sniff(prn=process_packet, count=20)
這樣就能逐層訪問數(shù)據(jù)包內(nèi)容了。你也可以檢查 IP 層、udp、ICMP、DNS 等協(xié)議字段。
常見的組合判斷有:
- packet.haslayer(‘IP’)
- packet.haslayer(‘Ether’)
- packet.haslayer(‘DNS’)
你可以根據(jù)這些判斷來做不同的處理邏輯,比如只記錄 DNS 請求的域名。
過濾與保存:提升效率和后續(xù)分析
有時候你只想抓某類包,比如 http 或者 DNS 流量,可以在 sniff() 中加上 filter 參數(shù):
sniff(filter="tcp port 80", prn=process_packet)
這個例子中只會捕獲 HTTP 流量(默認是 TCP 80 端口)。支持的過濾語法和 tcpdump 一樣,非常強大。
另外,你還可以把抓到的包保存成 .pcap 文件,方便用 wireshark 等工具進一步分析:
wrpcap('output.pcap', packets)
這在調(diào)試復雜問題時特別有用。
基本上就這些。Scapy 功能很多,但核心就是這幾個點:捕獲、過濾、解析、保存。剛開始用的時候可能會覺得結(jié)構(gòu)有點繞,但只要理解了分層結(jié)構(gòu),用起來就很順手了。