您当前的位置:首页 > 计算机 > 编程开发 > Python

python 抓包 scapy udp,python+scapy 抓包與解析

时间:03-31来源:作者:点击数:

最近一直在使用做流量分析,今天把 scapy 部分做一個總結。 python 的 scapy 庫可以方便的抓包與解析包,無奈資料很少,官方例子有限,大神博客很少提及, 經過一番嘗試后,總結以下幾點用法以便大家以后使用。

python scapy 抓包與解析

作為初學者,關心的首先是如何安裝,本人電腦系統是 fedora, 建議使用 linux。 推薦下載 pip,直接:(當然得在 su 權限下)

pip install scapy

b0e2f01d08d3a31e928915669c9c5865.png

在 terminal 中輸入 scapy, 如果有下面形式即安裝好了:

7eaa27b97d79209f4ab3680bc7b532f9.png

抓包

from scapy.all import *

dpkt = sniff(iface = "wlp7s0", count = 100)

b2c760d96dab9b6741c5605787ccdd62.png

sniff() 是 scapy 內置函數,有很多參數, 如圖:

7cdd81be9336d764024b1ce07b95150b.png

這里就不一一解釋, iface 參數是網卡信息, 也就是 eth0 之類的, 我這里是 wlp7s0, count 參數是抓取的連接數量, 這里是 100, 還有 filter 參數是過濾等。

pcap 格式保存

wrpcap("demo.pcap", dpkt)

pcap 格式較為通用, 可以將上述抓取的包保存為 pcap,dpkt 是上面抓取的流量變量。

數據包解析

c63892d4fe4fe1a6b1f984dd8e08060b.png

可以看到有 94 個 tcp 包, 4個 udp 包, 還有兩個其他類型的包。類似於 python 中的 list 類型, 可以使用下標訪問, 比如用 python 可寫個 for 循環遍歷每個連接。長度可以使用 len 計算

57979b93c91fccaf247dff45e769912d.png

注意這里 dpkt 不是 list 類型, 也不是 string 類型, 因此如果要進行字符串處理,要把它轉換為 string 類型,

4ea44a38b7526b0360b2f0fbbc4aa9c4.png

scapy強大地方在於可以通過字段來查看每一個字段信息,首先我們看一下它有那些字段:

6ae181789711032e7374c72780afccae.png

可以使用 ls() 查看支持的協議類型,有很多,具體看幾個:

9f01d79285cef9bc779f9d2fc1636f93.png
a1cda3dd641615bbf241f9a52f6535c8.png

甚至還有硬件信息:

8dab655b32c1c9689fcb81b01aa0db6a.png

還有很多, 可以自己去看一下, 不附圖了。知道它有那些字段后, 就可以調用了,隨便舉個例子, 比如第四個連接 dpkt[3]

76f180115cc18652d8be38fbdb0b6a4e.png

它的結構非常清楚,首先是 Ether 層, 然后是 IP 層, 然后是 TCP 層,訪問時就按張如圖就可以訪問各個字段信息。

要注意的是, 不是所有連接都是這幾個層, Ether 是都有的, 但是 udp 連接肯定就沒有 TCP 層, 而是改為 udp 層, ARP 包肯定就沒有 IP 層, 更沒有 TCP 層,如果再 arp 連接使用 dpkt[i][IP] 就會報錯, 因為它沒有 IP 這一層。python 使用時可以時使用 ether 的 type 判斷是不是 IP 包, 使用 ip 的 proto 判斷時 tcp 還是 udp。

訪問包中的報文可以使用 dpkt[i][Raw].load 字段, (假設第 i +1 個包有報文信息),同樣,如果沒有報文信息, 就沒有 Raw 這一層,也就沒有 load 這一字段。比如這里:

6ea1f1b11e5a8bed4b78f93a1dea84f5.png

第六個連接並沒有 Raw 數據,訪問出錯, 第七個有 Raw 數據,可以得到報文信息。

使用離線數據包

pcap = sniff(offline = "xx/xx.pcap")`

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门