使用Scapy发送Wi-Fi探测请求无响应问题求助
无法收到Wi-Fi探测请求响应的原因分析
问题场景
使用两个Wi-Fi适配器,第一个发送探测请求,第二个监控请求与响应。已通过Scapy构造数据包并成功发送,第二个接口的Wireshark能捕获到请求,但范围内至少7个AP均无响应。尝试过两种发送方式:
- 自行构造探测请求数据包
- 复制其他设备曾获响应的探测请求原始字节发送
两种方式均未收到AP响应。
自定义构造探测请求的代码
ssid = "" # 无定向探测,通配符 channel = 1 interface = "wlan1" senderaddress = "34:0a:33:33:cc:ff" dst='ff:ff:ff:ff:ff:ff' param = Dot11ProbeReq() essid = Dot11Elt(ID='SSID',info=ssid) dsset = Dot11Elt(ID='DSset',info='\x01') probe_request= RadioTap()/Dot11(type=0,subtype=4,FCfield=0,addr1=dst,addr2=senderaddress,addr3=dst)/param/essid/dsset sendp(probe_request, iface=interface, verbose=1)
复制原始有效数据包的代码
raw_hex_bytes = b'\x00\x00\x0f\x00\x2e\x00\x00\x00\x10\x02\x7b\x09\xa0\x00\xa4\x40\x00\x00\x00\xff\xff\xff\xff\xff\xff\x72\x28\x24\x35\x00\x4d\xff\xff\xff\xff\xff\xff\x30\x9a\x00\x00\x01\x04\x02\x04\x0b\x16\x32\x08\x0c\x12\x18\x24\x30\x48\x60\x6c\x03\x01\x04\x2d\x1a\xad\x01\x13\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\xbf\x0c\x92\xf9\x91\x33\xfa\xff\x62\x03\xfa\xff\x62\x03\xdd\x07\x00\x50\xf2\x08\x00\x2a\x00\x7f\x0b\x00\x00\x0a\x02\x00\x40\x00\x00\x00\x01\x20\xff\x03\x02\x00\x07\xdd\x0a\x50\x6f\x9a\x16\x03\x01\x01\x65\x01\x01\xdd\x08\x8c\xfd\xf0\x01\x01\x02\x01\x00' probe_request_packet = RadioTap(raw_hex_bytes) print("Probe Request Packet Summary:") print(probe_request_packet.summary()) sendp(probe_request_packet, iface=interface, verbose=1)
问题原因分析
一、自定义构造数据包的问题
- 信道不匹配:虽然代码中设置了DSset为信道1,但发送接口
wlan1可能并未实际切换到信道1。AP只会响应同信道的探测请求,若接口在其他信道,AP根本无法接收你的请求。 - 缺少关键信息元素(IE):多数AP会忽略缺少核心IE的探测请求,比如支持的速率、RSN加密信息等。你的自定义包仅包含SSID和DSset,缺少这类必要字段,AP会直接丢弃请求。
- RadioTap头部参数异常:Scapy默认生成的RadioTap头部可能缺少信道、传输功率等关键参数,导致AP无法正确解析数据包。
二、复制原始数据包仍无响应的问题
- RadioTap头部与当前硬件不兼容:复制的原始字节包含原设备的RadioTap头部参数(如传输功率、天线配置),这些参数与你的适配器不匹配,AP无法正确接收或解析数据包。
- MAC地址冲突或不被认可:原始数据包的源MAC(
addr2字段)是原设备的MAC,若你的适配器实际MAC与此不一致,部分AP会因MAC过滤或验证机制拒绝响应陌生MAC的请求。 - 私有IE或损坏的数据包:原始数据包可能包含原设备的厂商私有IE,或在复制过程中出现字节损坏,导致AP不认可该请求。
排查与修复步骤
- 强制设置发送接口信道:执行
iw dev wlan1 set channel 1命令,确保发送接口与AP所在信道一致(可通过Wireshark抓取AP的Beacon帧确认信道)。 - 补充关键IE字段:在自定义数据包中添加速率、RSN等IE,示例:
rates = Dot11Elt(ID='Rates', info='\x82\x84\x8b\x96\x0c\x12\x18\x24') rsn = Dot11Elt(ID='RSNinfo', info='\x01\x00\x00\x0f\xac\x02\x02\x00\x00\x0f\xac\x04\x00\x0f\xac\x02\x01\x00') probe_request= RadioTap()/Dot11(type=0,subtype=4,FCfield=0,addr1=dst,addr2=senderaddress,addr3=dst)/param/essid/dsset/rates/rsn - 修正RadioTap头部:手动指定信道等必要参数,避免默认头部的缺失:
rt = RadioTap() rt.channel = 1 rt.channel_frequency = 2412 # 信道1对应的2.4GHz频率 probe_request= rt/Dot11(type=0,subtype=4,FCfield=0,addr1=dst,addr2=senderaddress,addr3=dst)/param/essid/dsset - 确保MAC地址一致性:代码中的
senderaddress需与发送适配器wlan1的实际MAC一致,或使用适配器真实MAC发送。 - 临时关闭AP MAC过滤:若AP开启了MAC过滤,陌生MAC的请求会被拒绝,关闭过滤后测试是否能收到响应。
内容的提问来源于stack exchange,提问作者heddha
相关产品推荐
相关产品推荐

