使用sniff()函数进行Scapy过滤

4 投票
4 回答
23238 浏览
提问于 2025-04-17 12:40

我正在使用scapy的sniff()函数来捕获数据包。我只想捕获EAP数据包。我可以用tcpdump通过以下过滤器来筛选EAP数据包:

# tcpdump -i mon0 -p ether proto 0x888e
tcpdump: WARNING: mon0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on mon0, link-type IEEE802_11_RADIO (802.11 plus radiotap header), capture size 65535 bytes
13:04:41.949446 80847234901us tsft 48.0 Mb/s 2437 MHz 11g -16dB signal antenna 1 [bit 14] EAP packet (0) v1, len 5
13:04:46.545776 80851831746us tsft 54.0 Mb/s 2437 MHz 11g -13dB signal antenna 1 [bit 14] EAP packet (0) v1, len 5

同时,我也在用相同的过滤器运行sniff()函数,但这个函数却没有捕获到任何EAP数据包:

sniff(filter="ether proto 0x888e",iface="mon0", count = 1)

为什么sniff()函数没有捕获到任何EAP数据包呢?

编辑:

抱歉我反应晚了,我试了你们建议的方法:

> conf.iface = 'mon0'
> pkts = sniff(filter="wlan proto 0x888e", count = 1)
tcpdump: WARNING: mon0: no IPv4 address assigned
> pkts
Sniffed: TCP:0 UDP:0 ICMP:0 Other:1
> EAP in pkts[0]
False 

但这仍然没有捕获到EAP数据包 :(

4 个回答

1

这里可能有几个问题,我先说说我今天遇到的一个。

首先,参考下面的错误报告:http://trac.secdev.org/scapy/ticket/537 -- Scapy在sniff函数中没有正确处理iface这个参数。所以要正确设置iface,你需要使用:

conf.iface = 'mon0'

希望这样能让你添加过滤器,并且真正捕获到网络上的数据包。

如果你在mon0上进行嗅探,并且这是一个无线接口,你可能想试试使用wlan proto,而不是ether proto,不过我没有网络可以测试EAP数据包,所以无法提供更多帮助。

3

我觉得这些都是部分答案,结合起来对我有用。我做了:

conf.iface='wlan0.mon'
a=sniff(filter='ether proto 0x888e', prn=lambda x: x.summary(),
  count=100, store=1)

然后我通过手动断开一个设备与WPA网络的连接,生成了一个EAPOL交换过程。当它尝试重新连接时,我捕获了这个4步的EAPOL交换过程。要注意计数要大于4,因为可能会有数据包重传。根据我所知,scapy并不会解码KEY数据,所以它会以十六进制字符串的形式显示出来。

6

我知道这已经过去一年多了,但为了帮助其他人理解这个问题,答案是他捕获的是EAPOL数据包,而不是EAP数据包。通过使用以下命令

sniff(filter="ether proto 0x888e", count=4)

0x888e表示以太网协议中的EAPOL,这需要使用以太网协议,而不是无线局域网协议。我不确定0x888e在无线局域网协议中是否有任何意义,但在做了几乎和提问者一样的操作(只是把'wlan'换成'ether')后,我得到了

>>> EAP in b[0]
False

但是当我输入

>>> EAPOL in b[0]
True

我相信提问者捕获到了他代码所寻找的内容(2个EAPOL数据包),但他没有捕获到他认为自己在寻找的内容——2个EAP数据包。

补充 - 即使我把ether换成wlan,我仍然得到EAP为假,EAPOL为真。

撰写回答