Scapy中无法捕获Basic Authorization凭证?附检测代码
我的问题场景
我已经通过pip install scapy-http安装了Scapy的HTTP扩展,编写了以下代码来捕获HTTP请求中的Authorization字段:
import sys from scapy.all import * from scapy.layers import http interface = 'wlan0' def packet(p): tcp = p.getlayer('TCP') if tcp: req = p.getlayer('HTTP Request') if req: auth = req.Authorization if auth: print(auth) try: sniff(iface=interface,store=0,filter="tcp and port 80",prn=packet) except KeyboardInterrupt: sys.exit(1)
但运行后却无法捕获到Basic Authorization凭证,这是为什么?
可能的原因及解决方案
我之前也碰到过类似的问题,结合你的代码和常见的Scapy抓包坑点,总结了几个可能的原因和对应的解决办法:
1. 过滤条件只覆盖了HTTP(80端口),但目标流量是HTTPS(443端口)
现在绝大多数网站都用HTTPS(443端口)传输数据,你的过滤规则只抓了80端口的HTTP流量,而HTTPS的Authorization字段是加密在TLS层里的,Scapy根本无法直接解析加密后的内容。
- 如果是测试自己的HTTP服务,先确认目标确实用80端口;如果是抓HTTPS流量,你需要:
- 配置中间人代理(比如Burp Suite)让流量走代理,抓解密后的明文流量;
- 修改过滤条件包含443端口:
filter="tcp and (port 80 or port 443)",但注意这样只能抓到加密的TLS数据包,还是看不到Authorization字段,必须解密才行。
2. TCP分段导致Scapy无法识别完整的HTTP请求
Scapy默认是按单个数据包处理的,但HTTP请求可能被拆分成多个TCP段发送,单个数据包里可能只有部分请求头,导致Scapy没法把它识别为完整的HTTP Request层。
- 解决办法:启用Scapy的TCP会话重组功能,修改
sniff调用时加上session=TCPSession():
sniff(iface=interface, store=0, filter="tcp and port 80", prn=packet, session=TCPSession())
这样Scapy会自动重组TCP流,确保能捕获到完整的HTTP请求头。
3. Authorization字段的大小写匹配问题
HTTP头字段是大小写不敏感的,但scapy-http扩展可能只识别小写的authorization字段,而你用的是大写的Authorization。
- 可以试试改用小写的字段名,或者直接遍历所有请求头字段:
# 方法1:改用小写字段名 auth = req.getfieldval('authorization') # 方法2:遍历所有请求头,匹配大小写不敏感的关键字 for field_name in req.fields: if 'authorization' in field_name.lower(): print(req[field_name])
4. 抓包权限或接口不正确
- 抓包需要root权限,一定要用
sudo python3 your_script.py运行脚本,普通用户权限是抓不到数据包的; - 确认
wlan0是当前活跃的网络接口,你可以用ip link(Linux)或ifconfig查看,换成正确的接口名(比如eth0、en0等)。
5. Authorization字段不在初始请求中
有些网站会先返回401 Unauthorized响应,客户端才会发送带Authorization字段的请求,你需要确保抓包时覆盖了整个请求响应流程,而不是只抓了初始的请求包。
内容的提问来源于stack exchange,提问作者rockstar1820
相关产品推荐
相关产品推荐

