我正在 Debian 上通过 tcpdump 监控 Wi-Fi 探测请求,并尝试捕获每个探测请求元素的 RSSI(信号强度)。目前,每个探测请求的 tcpdump 输出如下所示:
09:13:17.663057 BSSID:Broadcast DA:Broadcast SA:04:fe:31:67:32:a0 (oui Unknown) Probe Request () [1.0 2.0 5.5 11.0 Mbit]
它缺少信号强度和一些其他元素。
使用另一台具有相同版本 tcpdump/libpcap 和相同 tcpdump 参数的机器,输出包括信号强度(如下所示)
09:14:51.673753 6.0 Mb/s 2412 MHz 11g -71dB signal antenna 1 BSSID:Broadcast DA:Broadcast SA:b2:b2:b2:b2:b2:b2 (oui Unknown) Probe Request (11n-AP) [1.0* 2.0* 5.5* 11.0* 9.0 18.0 36.0 54.0 Mbit]
有人能解释为什么第一个设备的数据有效负载中缺少 RSSI 吗?有没有办法捕获它?
根据@Spiff 的请求,这里是其中一个数据包捕获的十六进制转储。
12:44:40.226564 BSSID:Broadcast DA:Broadcast SA:00:1e:8f:93:3f:60 (oui Unknown) Probe Request (pagefarm) [1.0 2.0 5.5 11.0 6.0 9.0 12.0 18.0 Mbit]
0x0000: 4400 0000 9000 0000 7261 3000 0000 0000 D.......ra0.....
0x0010: 0000 0000 0000 0000 4400 0100 0000 0400 ........D.......
0x0020: c79d 0300 4400 0200 0000 0000 0000 0000 ....D...........
0x0030: 4400 0300 0000 0400 0300 0000 4400 0400 D...........D...
0x0040: 0000 0400 b1ff ffff 0000 0000 0000 0000 ................
0x0050: 0000 0000 4400 0600 0000 0400 0000 0000 ....D...........
0x0060: 4400 0700 0000 0400 0000 0000 4400 0800 D...........D...
0x0070: 0000 0400 0200 0000 4400 0900 0000 0000 ........D.......
0x0080: 0000 0000 4400 0a00 0000 0400 3500 0000 ....D.......5...
0x0090: 4000 0000 ffff ffff ffff 001e 8f93 3f60 @.............?`
0x00a0: ffff ffff ffff 4022 0008 7061 6765 6661 ......@"..pagefa
0x00b0: 726d 0108 0204 0b16 0c12 1824 0301 0332 rm.........$...2
0x00c0: 0430 4860 6c .0H`l
答案1
[更新了我们故障排除的所有发现。
感谢 tcpdump/libpcap/Wireshark 维护者 Guy Harris。]
tcpdump
仅理解 802.11 监控模式的“Radiotap”(又名LINKTYPE_IEEE802_11_RADIOTAP
,又名DLT_IEEE802_11_RADIO
)无线电元数据头格式数据链路类型。
DLTIEEE802_11_RADIO
会通知卡/驱动程序在接收到的每个帧前面添加一个额外的“假”标头,其中包含无线电元数据。这些内容不是以比特的形式在空中传输的,而是从无线电接收到该帧时的状态中读取的。这些信息包括 RSSI、无线电调谐到的频道、数据包的数据速率/MCS,可能还有更多。
-y IEEE802_11_RADIO
如果您的卡和驱动程序支持 Radiotap,您可以通过添加参数来指定要在此模式下捕获。您可以使用或可能使用获得接口tcpdump
支持的数据链路类型列表。请注意,如果您不包含指定监控模式的 ,则监控模式 DLT 可能不会出现。还请注意,添加ra0
tcpdump -i ra0 -IL
tcpdump -i ra0 -D
-I
-I
。还请注意,添加以将接口置于监控模式可能不适用于所有系统,因此您可能需要使用开源软件包airmon-ng
中的脚本aircrack-ng
来打开监控模式。
看起来非工作机器上的 Ralink 驱动程序/芯片组不支持 Radiotap 标头。它显然仅支持已弃用的 Prism 标头格式,以及 Prism 标头的一个鲜为人知的变体。
您可以使用上述命令检查工作机器上接口的 DLT(处于监控模式时),并确认它是IEEE802_11_RADIO
。
如果确认,这意味着你的选择如下:
- 更新非工作机器上的驱动程序,使其与工作机器上的驱动程序匹配。显然,工作机器上的驱动程序支持 Radiotap 接头。既然你说两台机器都有相同型号的 USB Wi-Fi 适配器,那么希望两台适配器内部确实有相同的 Wi-Fi 芯片组,这样更好的驱动程序就可以工作了。
- 使用 Wireshark(或附带的命令行工具
tshark
)在有问题的机器上执行监控模式数据包捕获。Wireshark 和 tshark 应该知道如何解析“坏”驱动程序支持的变体 Prism 标头。 - 使用捕获链路层报头
tcpdump
并自行解析变体 Prism 报头的 RSSI。它很可能是偏移量 0x44(十进制 68)处的 little-endian SInt32。查找序列4400 0400 0000 0400
然后获取接下来的 4 个字节并将它们视为 SInt32 会更可靠。在您的示例捕获报头中,RSSI 值如下所示:b1ff ffff
。即0xffffffb1
,它是 -79 的 32 位二进制补码有符号整数表示形式,对于较差但仍可行的信号强度,它是有效的 RSSI。 - 用于
tcpdump
捕获有问题的机器上的文件,但之后使用 Wireshark 或tshark
在另一台机器上对其进行分析。 - ETC。