使用Scapy过滤HTTP Get请求包遇阻:Raw段解码及过滤函数报错求助
解决Scapy过滤HTTP GET请求的问题
Hey there! Let's break down what's going wrong here and get it fixed:
1. 你的数据包是加密的HTTPS,不是明文HTTP
先看你提供的Raw段内容:load="\x17\x03\x03\x00m...",其中\x17是TLS记录层的应用数据类型标识,\x03\x03代表TLS 1.2版本。这说明这是一个加密的HTTPS数据包——所有HTTP内容(包括GET请求)都被加密了,所以你根本不可能在Raw段里找到明文的GET字符串,这才是过滤失败的核心原因。
如果要分析HTTPS里的HTTP请求,你需要先解密TLS流量,比如:
- 使用Wireshark并提供服务器私钥来解密
- 或者配置代理(如mitmproxy)拦截解密流量后,再用Scapy分析
2. 修复Python3中Scapy Raw段的处理错误
你遇到的WARNING: Calling str(pkt) on Python 3 makes no sense!是因为Python3严格区分字符串(str)和字节串(bytes),而Scapy的Raw对象的load属性存储的是字节串。直接调用str(packet[Raw])既不符合Python3的类型逻辑,也会触发Scapy的警告,自然无法正确匹配内容。
正确的明文HTTP GET过滤函数
如果是处理**明文HTTP(默认80端口)**的数据包,应该直接访问Raw.load并和字节串b'GET'比较,而不是字符串:
def http_get_filter(packet): # 检查TCP和Raw层存在,同时判断负载以b'GET'开头 return (TCP in packet and Raw in packet and packet[Raw].load.startswith(b'GET'))
进阶:加上端口过滤(更精准)
为了避免误匹配其他TCP端口的数据包,可以加上HTTP默认端口的过滤:
def http_get_filter(packet): return (TCP in packet and Raw in packet and (packet[TCP].dport == 80 or packet[TCP].sport == 80) and packet[Raw].load.startswith(b'GET'))
总结
- 你当前捕获的是HTTPS加密数据包,无法直接从Raw段看到明文GET请求,需要先解密
- 在Python3中处理Scapy的Raw段,必须使用
packet[Raw].load(字节串)来操作,不能直接转成str
内容的提问来源于stack exchange,提问作者Doron Shevach
相关产品推荐
相关产品推荐

