使用scapy筛选HTTP Get请求数据包



我试图使用scapy过滤HTTP Get请求数据包,方法是使用数据包的原始信息来决定哪个数据包是Get请求,哪个不是,但我没有找到解码数据包原始部分的方法,看起来像这样(不确定该数据包是否是HTTP Get请求(:

<Raw  `load="x17x03x03x00mxb8Gxdbnxffx94sx90yxe3yxfaxa1x81[-x05xf8'Jpqxf3x98xa0x04dx08Nxf6x08x93xb1xd9xedxc4^;xc15xf2Dxa7xb4_x95x8fx14l5~[9xb0x9f^EIxbbxcdx89x06x11`xa2xbfxddx8bx14y!xaexbe-D&DWx96xf7xcfx19xb0_xbaxe80bx9cxe6xeex9cxf3xbbrx87cxffxf9Gxf6Kx8fnrSx83?x05" |>`

有已知的方法吗。我已经尝试了下一个过滤器:

def http_get_filter(packet):
return (TCP in packet and Raw in packet and 
str(packet[Raw]).startswith('GET'))

但它没有起作用,并引发了下一个例外:

WARNING: Calling str(pkt) on Python 3 makes no sense!
WARNING: Calling str(pkt) on Python 3 makes no sense!
WARNING: more Calling str(pkt) on Python 3 makes no sense!
WARNING: Calling str(pkt) on Python 3 makes no sense!
WARNING: Calling str(pkt) on Python 3 makes no sense!
WARNING: more Calling str(pkt) on Python 3 makes no sense!

我使用的是python 3.6版本和scapy 2.4.4rc2版本。

谢谢你的帮助。

此警告适用于scapy源代码(packet.py(,而不适用于python编译器:

警告("在Python3上调用str(pkt(毫无意义"(

然后,根据源代码,字节函数返回一个无预警的可分析字节数组:

...
if six.PY2:
def __str__(self):
# type: () -> str
return self.build()
else:
def __str__(self):
# type: () -> str
warning("Calling str(pkt) on Python 3 makes no sense!")
return str(self.build())
def __bytes__(self):
# type: () -> bytes
return self.build()
...

与其使用str(数据包(,不如使用字节(数据包

用于将字节数组转换为字符串:

packetstr = "".join(map(chr, bytes(packet)))

您可以尝试以下操作:

if packet.haslayer(Raw):
data = str(packet.getlayer(Raw))

最新更新