Python SCAPY HTTP请求URL PCAP
我正在尝试使用SCAPY和HTTP层请求读取PCAP文件,但没有输出。预计产量应为: 192.168.1.70刚刚请求了GET 192.168.1.68:8060/dial/dd.xml 任何帮助都将不胜感激。多谢各位Python SCAPY HTTP请求URL PCAP,python,scapy,pcap,Python,Scapy,Pcap,我正在尝试使用SCAPY和HTTP层请求读取PCAP文件,但没有输出。预计产量应为: 192.168.1.70刚刚请求了GET 192.168.1.68:8060/dial/dd.xml 任何帮助都将不胜感激。多谢各位 try: from scapy.all import * except ImportError: import scapy try: import scapy_http.http except ImportError: from scapy.l
try:
from scapy.all import *
except ImportError:
import scapy
try:
import scapy_http.http
except ImportError:
from scapy.layers import http
packet = rdpcap('lo.pcap')
for p in packet:
if not packet.haslayer('HTTPRequest'):
return
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))
大部分情况下都是这样的,但是变量名混淆了,所以我在for语句中将第一个包重命名为packets,并将p重命名为packet,而且return语句也不正确-您需要一个continue。知道在get/haslayer调用中可以将“HTTPRequest”与scapy_http.http.HTTPRequest互换使用是很有用的。这里有一个固定版本:
packets = rdpcap('lo.pcap')
for packet in packets:
if not packet.haslayer('HTTPRequest'):
continue
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))
更新:Scapy现在内置了处理HTTP的支持。Scapy_HTTP包现在不推荐使用。虽然它们实际上不需要用于提取此应用程序的HTTP请求,因此您可以省略session=TCPSession,但对于提取多数据包响应非常有用。因此,虽然现在需要将字节解码/转换为字符串,但这可能更简单:
from scapy.layers.http import HTTPRequest
from scapy.all import *
sniff(offline='lo.pcap', session=TCPSession, prn=lambda x: f'{x[IP].src} just requested a {x[HTTPRequest].Method.decode("utf-8")} {x[HTTPRequest].Host.decode("utf-8")}{x[HTTPRequest].Path.decode("utf-8")}' if x.haslayer(HTTPRequest) else None)
您在哪里调用进程\u tcp\u数据包?谢谢。我发现了一个错误,它不能帮助程序执行:@pchaigno谢谢你,先生