使用sniff()函数进行Scapy过滤
我正在使用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 个回答
这里可能有几个问题,我先说说我今天遇到的一个。
首先,参考下面的错误报告:http://trac.secdev.org/scapy/ticket/537 -- Scapy在sniff函数中没有正确处理iface这个参数。所以要正确设置iface,你需要使用:
conf.iface = 'mon0'
希望这样能让你添加过滤器,并且真正捕获到网络上的数据包。
如果你在mon0上进行嗅探,并且这是一个无线接口,你可能想试试使用wlan proto,而不是ether proto,不过我没有网络可以测试EAP数据包,所以无法提供更多帮助。
我觉得这些都是部分答案,结合起来对我有用。我做了:
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数据,所以它会以十六进制字符串的形式显示出来。
我知道这已经过去一年多了,但为了帮助其他人理解这个问题,答案是他捕获的是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为真。