【问题标题】:python-3.4 Scapy sniffingpython-3.4 Scapy 嗅探
【发布时间】:2015-12-22 13:59:55
【问题描述】:

运行此脚本时出现错误:

from scapy.all import *
sn = sniff(filter="http", count=30)
wireshark(sn)

这是错误:

WARNING: No route found for IPv6 destination :: (no default route?)
WARNING: Please, report issues to https://github.com/phaethon/scapy
Traceback (most recent call last):
File "arp1.py", line 2, in <module>
sn = sniff(filter="http", count=30)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scapy/sendrecv.py", line 566, in sniff
s = L2socket(type=ETH_P_ALL, *arg, **karg)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scapy/arch/pcapdnet.py", line 276, in __init__
self.ins.setfilter(filter)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/scapy/arch/pcapdnet.py", line 236, in setfilter
error("Could not compile filter expression %s" % f)
NameError: name 'error' is not defined

运行此脚本时,一切正常:

from scapy.all import *
sn = sniff(filter="icmp and host 66.35.250.151", count=4)
wireshark(sn)

【问题讨论】:

    标签: python wireshark scapy packet-sniffers


    【解决方案1】:

    Scapy 使用BPF syntax 进行过滤。此语法不支持将 "http" 指定为过滤器以过滤 HTTP 流量。


    但是,可以过滤所有发往或源自端口 80 的流量,该端口通常用于 HTTP。上面的链接提出了以下过滤器:

    捕获所有进出端口 80 的 IPv4 HTTP 数据包,即只打印包含数据的数据包,而不是,例如 SYNFIN em> 个数据包和 ACK-only 数据包。 (IPv6 留给读者作为练习。)

    tcp port 80 and (((ip[2:2] - ((ip[0]&amp;0xf)&lt;&lt;2)) - ((tcp[12]&amp;0xf0)&gt;&gt;2)) != 0)

    This stackoverflow answer 清楚地解释了该过滤器背后的技术细节。简而言之,它计算数据包携带的应用层有效载荷的字节长度,并验证它不为 0(因此为正):

    • IP 数据包长度 - IP 标头长度 - TCP 标头长度!= 0

    由于文件/etc/services 将端口号80 分配给服务名称http,因此可以将之前的过滤器重写如下:

    tcp port http and (((ip[2:2] - ((ip[0]&amp;0xf)&lt;&lt;2)) - ((tcp[12]&amp;0xf0)&gt;&gt;2)) != 0)

    为了完整起见,建议也过滤端口 8080(/etc/services 中的http-alt)。


    当然,这并不能保证过滤后的流量确实是 HTTP 流量,或者未过滤的流量不包含 HTTP 流量。这种努力需要更复杂的过滤器。他们会检查应用层负载的内容,试图推断出使用的底层协议。

    根据您的最终目标,一个简单的谷歌搜索会为各种目的提供几个替代过滤器。例如,This stackoverflow answer 建议过滤器用于 HTTP 的基本方法:一个用于 HTTP GET 方法,另一个用于 HTTP POST 方法.

    【讨论】:

    • 我知道为什么!你知道 'tcp 端口 80 和 (((ip[2:2] - ((ip[0]&0xf)>2)) != 0) ' 表示 tho(过滤器,是的,但它有什么作用,是否有必要)?
    • 我更新了我的问题,澄清了过滤器的基本原理,并使用a link 进行了更详细的解释。
    猜你喜欢
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多