python-3.4 Scapy嗅探

时间:2015-09-24 20:25:13

标签: python wireshark scapy packet-sniffers

运行此脚本时出错:

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)

1 个答案:

答案 0 :(得分:2)

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

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

  

捕获与端口80之间的所有 IPv4 HTTP 数据包,即仅打印包含数据的数据包,而不是例如 SYN FIN 数据包和 ACK - 仅包。 ( IPv6 留给读者练习。)

     
    

tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)

  

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

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

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

  

tcp port http and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)

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

当然,这并不能保证过滤的流量确实是 HTTP 流量,或者未过滤的流量不包含 HTTP 流量。这种努力需要更复杂的过滤器。他们将检查应用程序层有效负载的内容,以尝试推断出正在使用的基础协议。

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

相关问题