我正在制作一个使用scapy重新发送http数据包的应用程序。当scapy嗅探数据包时,它将从头部检查源ip和目标路径。然后重新发送到它应该去的地方。
这里有一个标题的例子:
Url:192.168.50.X:XXX/PathInUrl
GET /thePathInUrl HTTP/1.1
Host: 192.168.50.250:448
Content-Type: text/plain
Content-Length: 12
this is body
我想得到"/PathInUrl";
我研究了很多关于scapy的解决方案。其中许多已经过时,不适用于最新的scapy或python3。也许我只是误解了答案。
以下是我以前尝试过的一些解决方案:
Scapy 中的HTTP GET数据包嗅探器
def http_header(packet):
http_packet=str(packet)
if http_packet.find('GET'):
print GET_print(packet)
这个给我回了一个空的[]。
SCAPY HTTP请求URL PCAP
http_layer= packet.getlayer('HTTPRequest').fields
ip_layer = packet.getlayer('IP').fields
print('n{0[src]} just requested a {1[Method]} {1[Host]}{1[Path}]}'.format(ip_layer,http_layer))
这个说HTTPRequest不存在于我的包中
还使用lambda表达式尝试了一些答案。但是返回了几个错误。
print("catch packets")
pkts=sniff(filter="port 448",count=1,)
for xx in pkts:
print(type(xx))
我还试着打印我闻到的
<类'scapy.layers.l2.Ether'>
这就是它打印的内容。看起来不对?我希望列表中有一个数据包变量。或者是否有其他方法适合这种情况?
在选择scapy作为解决方案之前。我用socket作为解析器。但它似乎做了一些工作,不仅仅是为我接收数据包。所以我决定转向scapy。我犯的关键错误是我忘记了我必须自己启动连接。当我最终使用wireshark诊断流量时,它看起来还处于启动三向握手的阶段。毫无疑问,为什么斯皮什么也没回,只是空荡荡的。
我还没有尝试实现握手代码。我将在测试时进行更新。*编辑:试用后效果良好。