我使用两个 Wi-Fi 适配器在第一个上发送探测请求,并在第二个上监视发送的请求和响应。我已经成功使用 Scapy 构建了一个数据包,并通过第一个接口发送它。我可以使用第二个界面在 Wireshark 中看到该请求,但即使我至少有 7 个接入点,它们也没有响应我的请求。
这是我发送探测请求的代码:
ssid = "" # undirected probe, wildcard
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)
有人可以解释为什么我似乎无法收到回复吗?为什么即使是之前收到回复的消息也无法再收到回复?
提前非常感谢!
我通过两种方式解决了问题,首先,我不仅监控通道1,还同时监控通道6。我附近的大多数路由器似乎都会响应通道 6 上的探测请求,因此重新发送捕获的请求就可以解决问题。通过采用像上面这样的原始十六进制字符串,并在取下特定部件时一次又一次简洁地发送它,我能够查明我的原始请求缺少的是支持的费率。将它们添加到我的脚本后,我也收到了对我自己的请求的探测响应。
from scapy.all import *
ssid = ""
channel = 6
interface = "wlan1"
sender = "34:0a:33:33:cc:ff"
dest = "ff:ff:ff:ff:ff:ff"
def send_probe_req(senderaddr, destaddr, ssid, interface, channel):
radiotap = RadioTap()
dot11 = Dot11(type=0, subtype=0x04, addr1=destaddr, addr2=senderaddr, addr3=destaddr)
# rates content isn't important, it just HAS to have supported rates in the request
rates = b'\x00'
#rates_content = b'\x82\x84\x8b\x96'
rates = Dot11Elt(ID='Rates',info=rates_content)
dot11_probe_req = Dot11ProbeReq() / Dot11Elt(ID="SSID", info=ssid)
frame = radiotap / dot11 / dot11_probe_req / rates
sendp(frame, iface=interface)