scapy中嗅探功能的过滤器无法正常工作

Posted

技术标签:

【中文标题】scapy中嗅探功能的过滤器无法正常工作【英文标题】:the filter of sniff function in scapy does not work properly 【发布时间】:2015-07-17 17:01:23 【问题描述】:

snifffilter 功能好像不能正常工作。

我正在使用以下过滤器执行嗅探

a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010")

但有时sniff 会像这样捕获UDP 数据包:

>>> a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010")
>>> a
<Sniffed: TCP:0 UDP:1 ICMP:0 Other:0>

有时sniff 会捕获带有错误端口的 TCP 数据包:

>>> a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010")
>>> a
<Sniffed: TCP:1 UDP:0 ICMP:0 Other:0>
>>> a[0]
<Ether  dst=00:26:55:cb:3b:10 src=00:22:64:55:c8:89 type=0x800 |<IP  version=4L ihl=5L tos=0x10 len=92 id=8683 flags=DF frag=0L ttl=64 proto=tcp chksum=0x9484 src=192.168.1.71 dst=192.168.1.133 options=[] |<TCP  sport=ssh dport=1874 seq=350107599 ack=2484345720 dataofs=5L reserved=0L flags=PA window=254 chksum=0x846b urgptr=0 options=[] |<Raw  load="yn\x01\x9d\xfca\xc9V-8\x18|\xc4\t\xf1\xc4\xd8\xd3\xc6\x95E\x19'h\xc0\x89\xf1\x08g\xa3\x9a\xa9\xf51RF\xc2\x1f\xe5a\xac\x83M\xc9\x0b\x80\x85\x1b\xcf\xb6f\xcc" |>>>>

有时sniff 会像这样捕获ARP 数据包:

>>> a=sniff(count=1,filter="tcp and host 192.168.10.55 and port 14010")
>>> a
<Sniffed: TCP:0 UDP:0 ICMP:0 Other:1>
>>> a[0]
<Ether  dst=ff:ff:ff:ff:ff:ff src=00:22:07:2c:53:97 type=0x806 |<ARP  hwtype=0x1 ptype=0x800 hwlen=6 plen=4 op=who-has hwsrc=00:22:07:2c:53:97 psrc=192.168.1.178 hwdst=ff:ff:ff:ff:ff:ff pdst=192.168.1.179 |<Padding  load='\x00\x07\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x01\x14\x00\x00' |>>>

我的过滤器中是否缺少某些内容?我怎样才能避免这个问题?

【问题讨论】:

大胆猜测:你运行 scapy 的机器上是否有任何异常的网络接口?我正在考虑虚拟机(例如 Virtualbox 或 VMWare)接口、tun/tap 等。如果您将iface=eth0(或任何您的主以太网接口被调用)添加到sniff 参数列表,它是否有效?请注意,有些 TCP 数据包可以归类到 Other 下,因此请使用 a.summary() 而不是 a 来检查结果。 @Wintermute 我用过iface="eth0",但总是遇到同样的问题 您是否安装了tcpdump?另外,scapy -d 是否给出任何警告? @Wintermute 我已经安装了 tcpdump,并且我让 wireshark 并行运行 @Wintermute scapy -d 仅返回 1 个警告:WARNING: No route found for IPv6 destination :: (no default route?) 【参考方案1】:

我遇到了相同或类似的问题 - 嗅探过滤器不起作用。

安装 tcpdump 为我解决了这个问题。

【讨论】:

即使被否决,这个答案也是正确的。这个错误实际上有几个原因:没有安装 tcpdump,过滤器不是正确的 BPF 格式或者你的套接字实现不支持它(例如,如果你有 conf.use_pcap=True,则是一个过时的 libpcap 版本)【参考方案2】:

您可以在以下站点查看过滤器的语法 http://biot.com/capstats/bpf.html。我面临着类似的问题,它对我有用。

你不妨参考这个问题:https://***.com/questions/37453283/filter-options-for-sniff-function-in-scapy#=

您也可以尝试在运行代码之前打开所需的端口来测试您的程序。

【讨论】:

【参考方案3】:

我在 VM 上使用 Centos 时遇到了同样的问题。我使用 ip host 进行过滤,而不是 host。这似乎解决了我的问题。

过滤器错误#

>>> packets = sniff (filter = "host 176.96.135.80", count =2, iface = "eth0", timeout =10)
>>> packets.summary()
Ether / IP / UDP 172.7.198.136:netbios_ns > 172.7.199.255:netbios_ns / NBNSQueryRequest
Ether / IP / TCP 176.96.135.80:53527 > 172.7.19.58:ssh A / Padding

修复#

>>> packets = sniff (filter = "ip host 176.96.135.80", count =2, iface = "eth0", timeout =10)

在此之后没有任何问题。

【讨论】:

【参考方案4】:

嗅探功能需要 tcpdump 来应用“过滤器”。如果没有 tcpdump,scapy 会报告警告但不抛出。您可以启用日志记录来检查它。

import logging
import sys
logging.getLogger("scapy").setLevel(1)
logging.basicConfig(stream=sys.stdout, level=logging.INFO)

from scapy.all import *

【讨论】:

【参考方案5】:

过滤器功能存在已知错误(尤其是在使用本地环回网络时!)。建议使用 lfilter(根据您的需要还可以使用 stop_filter):

示例用法: lfilter=lambda p: any(proto in [14010]) for proto in [TCP]), stop_filter =lambda x: x.haslayer(TCP)

有关 lfilter 的更多详细信息,另请参阅:https://home.regit.org/2012/06/using-scapy-lfilter/

【讨论】:

这些问题大多在最近的 Scapy 版本中得到修复。 lfilter 当您不想浪费时间计算 BPF 过滤器时效果很好,但最终内存效率较低。

以上是关于scapy中嗅探功能的过滤器无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Scapy BPF 过滤器不工作

搜索和过滤功能仍然无法正常工作(Vue JS)

python绝技 — 用Scapy测试无线网卡的嗅探功能

Python写的嗅探器——Pyside,Scapy

django summernote 无法正常工作

数据表过滤器在应用SQL Server 2008分页代码时无法正常工作