Scapy构造Dot11帧报错Layer [Dot11] not found如何解决
问题原因
- 触发
Layer [Dot11] not found报错的核心原因是:你捕获到携带HTTPRequest的报文并非802.11无线帧,不存在Dot11层。默认状态下,有线网卡、工作在managed模式的无线网卡抓取到的链路层报文为Ether以太网帧,只有将无线网卡切换为monitor模式,且指定监听该monitor模式网卡时,才能抓到带RadioTap、Dot11层的无线报文。 - 你贴出的代码还存在基础语法问题:
for循环行有多余缩进,运行时会直接抛出缩进错误。
修复方案
- 提前配置无线监听环境
将用于抓包的无线网卡切换到monitor模式,并切换到目标HTTP请求所在的工作信道,否则无法捕获到对应的802.11格式HTTP报文。可以使用airmon-ng工具快速切换:
执行完成后会生成名为airmon-ng check kill airmon-ng start wlan0wlan0mon的monitor模式网卡。 - 修正抓包逻辑,增加层合法性校验
调用sniff时指定监听的monitor模式网卡,在判断HTTPRequest层之后,额外校验报文是否携带Dot11层,过滤掉非802.11格式的报文后再提取MAC地址构造响应帧。 - 修正代码缩进错误,对齐代码层级。
修复后的可运行参考代码:
import scapy.all as scapy from scapy.layers.http import HTTPRequest from scapy.layers.dot11 import RadioTap, Dot11 # 替换为你自己的monitor模式网卡名 IFACE = "wlan0mon" packets = scapy.sniff(iface=IFACE, count=30) for i in range(len(packets)): pkt = packets[i] # 同时校验HTTP层和Dot11层存在,再执行后续逻辑 if pkt.haslayer(HTTPRequest) and pkt.haslayer(Dot11): dot11_frame = RadioTap()/Dot11( type = "Data", FCfield = "from-DS", addr1 = pkt[Dot11].addr2, addr2 = pkt[Dot11].addr1, addr3 = pkt[Dot11].addr1, ) # 后续补充IP/TCP/HTTP响应层逻辑即可
补充说明:如果你的使用场景不是伪造无线环境下的HTTP响应,而是有线网络场景,不需要构造Dot11帧,直接基于Ether层构造以太网响应报文即可。
内容的提问来源于stack exchange,提问作者cod_02
相关产品推荐
相关产品推荐

