meishaoming / blog

MIT License
1 stars 2 forks source link

WiFi 探针 #44

Open meishaoming opened 6 years ago

meishaoming commented 6 years ago

这里记录了在 jetson tx2 开发套件上实现 WiFi 探针功能踩过的一些坑。

最开始想使用 tx2 板载网卡,但发现它不支持 monitor 模式。

然后在淘宝选了一款 esp8266 方案的 WiFi 探针,但受限于整套方案上网条件的限制(只能有一台主机作为出口),这个探针的扫描结果无法上传。

最后还是选了一款支持 802.11ac 的 USB WiFi 网卡,编译驱动,使用 airodump-ng 来抓包,再解析、上传数据。

整个过程记录为几篇:

  1. Ubuntu 下用 wireshark 分析 802.11 帧结构
  2. WiFi 探针原理
  3. 一个 esp8266 方案的 WiFi 探针
  4. 用 USB 网卡做 WiFi 探针
  5. 另一个 ESP8266 方案的 WiFi 探针

整个过程用到了两个 USB 无线网卡:水星 MW150US 和 TP-LINK TL-WDN6200 。

为什么会选这两款?因为办公室里就有这两款 USB 网卡,直接拿来用,算是看见什么吃什么。

meishaoming commented 6 years ago

Ubuntu 下用 wireshark 分析 802.11 帧结构

运气比较好,ubuntu 16.04 里带有 mt7610u 的驱动,插入之后 wifi 接口就出来了:

wlx488ad2847259 Link encap:UNSPEC  HWaddr 48-8A-D2-84-72-59-3A-30-00-00-00-00-00-00-00-00  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:43871 errors:0 dropped:31443 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:10780262 (10.7 MB)  TX bytes:0 (0.0 B)

手动把接口设置成 monitor 模式:

sudo ip link set wlx488ad2847259 down
sudo iw dev wlx488ad2847259 set type monitor
sudo ip link set wlx488ad2847259 up

安装 wireshark

sudo apt install wireshark

启动

sudo wireshark

启动之后遇到一个错误,注释掉 /usr/share/wireshark/init.lua 里的倒数第二行:

--dofile(DATA_DIR.."console.lua")

启动 wireshak 之后发现没有扫到自己路由器的数据很少,所有帧的 channel 都是1。可能 wireshark 固定于一个 channel 扫描。

进到路由器设置里看到路由器的 WiFi 在 channel 10,所以在命令行下手动切换网卡的 channel :

sudo iw dev wlx488ad2847259 set channel 10

重新扫描就看到了这个频段的所有帧:

image

扫到的帧类型有许多,这里只关心三种:

Beacon frame 是 AP 定时发出来的帧,也称为「信标帧」。其中携带了 AP 的基本信息,有 AP 的 MAC 地址(BSSID)、SSID、支持的速率、工作频率、国家信息等。

Probe Request 由 STA 发出,用于探测周围的 SSID。如果指定了 SSID,则对应的 AP 会返回 Probe Response 作为响应。

wifi_sniffer_log.pcapng.zip

meishaoming commented 6 years ago

WiFi 探针原理

从上一篇的抓包结果来看,STA 会发出 Probe Request 帧,其中就包含 STA 的信息。WiFi 探针就是不断监听 Probe Request 帧来获取所有 STA 信息。

Probe Request 有两种类型:

  1. SSID 长度为 0 。客户端定期在各 channel 上发送 Probe Request。AP 收到后返回 Probe Response
  2. SSID 长度大于 0。客户端希望连接某个 SSID 或在已经成功连接到一个 AP 时,也会定期发送 Probe Request

对每个抓到的 Probe Request 帧,我们可以得到的信息有:

但是现在的 iOS 8 和 Android 8.0 以后的机器在 WiFi 探测接做都采用了随机 MAC 的特性。

参考链接:

meishaoming commented 6 years ago

一个 esp8266 方案的 WiFi 探针

在淘宝上买了一个 WiFi 探针

这个设备允许配置连接一个能够上公网的 WiFi 热点。然后它自己扫描 50s(这个可以配置),然后再尝试连接这个热点并把数据上传到服务器。

其介绍页中配写明了可以上传到自己的服务器中。然而实际测试却意外的发现一点问题:

它先向自己服务器 xinfeng.doit.am 请求一次时间(估计是同步时间),然后再上传到设置的服务器地址。如果请求时间不成功,则不再上传数据。

正好手头有一台刷过 openwrt 的路由器。把它作为热点来抓探针上传的数据包。现在的网络连接是:

     WiFi 探针  ~~~~~ openwrt 路由器 ~~~ -> 公网

抓到的包:tcpdump_log.pcap.zip,用 wireshark 打开即可分析它的行为。

image

  1. DNS 请求域名 xinfeng.doit.am 的 IP 地址,得到 115.28.78.23
  2. 获取服务器时间,可用 curl -v xinfeng.doit.am/iot_api/get_time.php 来测试

上报数据帧格式

一个 HTTP POST 消息的 body 内容:

'device_id=DC4F228904F1&device_key=37095147&device_time=2018-10-23#19:00:07&postion_mac=04:95:E6:54:3D:61|Nenyacm,EC:26:CA:DE:5A:3F|TP-LINK_5A3F,78:11:DC:00:E5:E2|FMTech&message=B0:FC:36:B0:3A:57,34:96:72:55:E9:53,sogood-2G,5.62,0 \r\n78:11:DC:4C:D7:F0,78:11:DC:00:E5:E2,FMTech,5.23,1 \r\nDC:4F:22:89:04:F1,78:11:DC:00:E5:E2,FMTech,3.65,1 \r\nF8:34:41:3E:C3:3F,EC:26:CA:DE:5A:3F,TP-LINK_5A3F,3.65,0 \r\nE4:0E:EE:98:B0:02,04:95:E6:54:3D:61,Nenyacm,3.16,0 \r\n78:11:DC:7D:E2:AE,34:96:72:55:E9:53,sogood-2G,3.92,1 \r\n60:14:B3:BB:8C:6D,34:96:72:55:E9:53,sogood-2G,4.53,0 \r\nAC:07:5F:95:CD:B9,FC:37:2B:4B:CD:39,ChinaNet-G5iN,6.98,0 \r\n60:D8:19:84:A1:A1,EC:26:CA:D7:13:88,SOGOOD_VIP_2G,6.98,0 \r\n80:56:F2:84:2A:BE,34:96:72:55:E9:53,sogood-2G,4.87,1 \r\n80:19:34:07:56:F2,78:44:FD:F0:F7:FC,9000,8.06,0 \r\n54:4E:90:31:70:33,8C:A6:DF:A6:E1:67,TXJRC203,8.06,0 \r\n60:14:B3:C4:6D:F3,78:44:FD:F0:F7:FC,9000,7.50,0 \r\nC8:3D:D4:A9:1D:43,EC:26:CA:DE:5A:3F,TP-LINK_5A3F,4.22,0 \r\n'

参数名字 参数含义 示例
device_id 设备ID,默认为设备的MAC地址。 60019487F37F
device_time 上传时间 2018-03-14#10:47:38
device_key 设备的key,主要目的,是检验数据的合法性,默认为设备id+ “2018doit”,md5,然后取前8个字节。开发时可以不处理此字段。 设备id:60019487F37F追加:2018doit
追加后为:60019487F37F2018doit
Md5取前8个字节:f95b911d
postion_mac 位置mac 24:24:01:0D:4A:FA|
new_mesh,24:24:02:0C:8F:3D|
new_mesh,24:24:02:0A:52:D1|new_mesh
message MAC地址列表,
每一个MAC由\r\n分隔,
每一行为逗号分隔,
第一列表示手机MAC,
第二列表示路由mac,
第三列表示路由名称(如果为空表示没有名称),
第四列表示采集设备与手机的距离,
第5列表示是否已经连接路由
98:9C:57:D8:EB:F9,BC:5F:F6:14:4F:DF,szub,33.98,0 
54:DC:1D:C1:C0:50,08:10:7A:3D:C9:64,ChinaNet-bktech,19.11,0 
08:10:7A:3D:C9:64,54:DC:1D:C1:C0:50,,19.11,0 
08:10:7B:15:50:00,34:96:72:D1:AB:71,KP,36.52,1 
60:01:94:88:4D:74,BC:D1:77:32:E7:2E,Doit_Old,9.31,1 
F4:B7:B3:9A:01:20,20:6B:E7:A2:F8:87,wisephone1,29.43,0 
B0:59:47:33:0F:ED,20:6B:E7:A2:F8:87,wisephone1,31.62,0 
24:F0:94:C3:3C:5F,78:44:FD:45:F1:EC,111,25.48,1 
74:DF:BF:53:C6:1F,EC:26:CA:2C:66:8E,sunflowers-2,11.55,0 
B0:48:7A:5F:BF:CD,2C:F0:A2:2D:F7:98,,22.07,0 
00:4B:F3:0E:AF:57,08:10:7A:3C:5A:F2,ChinaNet-201,36.52,1 
54:27:1E:A2:F4:63,FF:FF:FF:FF:FF:FF,,19.11,0 
image
meishaoming commented 6 years ago

用 USB 网卡做 WiFi 探针

wireshark 802.11 抓包 中用了一块 mt7601u 的 usb 无线网卡 来抓包。这个 usb 无线网卡的缺点是只支持 802.11 a/b/g/n,不支持 802.11 ac。

选另一个支持 802.11 ac 的 usb 无线网卡 TP-LINK TL-WDN6200 。芯片方案是 realtek 8812au。需要自己编译驱动:

git clone --depth=1 -b v5.1.5 https://github.com/aircrack-ng/rtl8812au.git

make KSRC=/home/sam/jetpack/64_TX2/Linux_for_Tegra/rootfs/usr/src/linux-headers-4.4.38-tegra/

插入 jetson tx2 板子之后的 log :

nvidia@tegra-ubuntu:/tmp$ dmesg 
[ 8698.585266] usb 1-2: USB disconnect, device number 5
[ 8698.586010] usbcore: registered new interface driver 8812au
[ 8698.597940] xhci-tegra 3530000.xhci: tegra_xhci_mbox_work mailbox command 6
[ 8698.617632] xhci-tegra 3530000.xhci: tegra_xhci_mbox_work mailbox command 4
[ 8698.624669] xhci-tegra 3530000.xhci: tegra_xhci_mbox_work ignore firmware MBOX_CMD_INC_SSPI_CLOCK request
[ 8698.853999] usb 2-1: new SuperSpeed USB device number 2 using xhci-tegra
[ 8698.874332] usb 2-1: Int endpoint with wBytesPerInterval of 512 in config 1 interface 0 altsetting 0 ep 133: setting to 64
[ 8698.886030] usb 2-1: New USB device found, idVendor=2357, idProduct=0101
[ 8698.892861] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 8698.900073] usb 2-1: Product: 802.11n NIC
[ 8698.904148] usb 2-1: Manufacturer: Realtek
[ 8698.908311] usb 2-1: SerialNumber: 123456
[ 8698.913224] xhci-tegra 3530000.xhci: tegra_xhci_mbox_work mailbox command 6
[ 8700.475806] IPv6: ADDRCONF(NETDEV_UP): wlan1: link is not ready

成功的创建了 wlan1 接口,但不太正常的是这里识别为 usb2.0。

安装抓包工具:

sudo apt install aircrack-ng

将网卡设置成 monitor 模式:

sudo ip link set wlan1 down
sudo iw dev wlan1 set type monitor
sudo ip link set wlan1 up

开始扫描:

sudo airodump-ng wlan1 --band abg -M -U --beacons

还可用其它一些参数:

sudo airodump-ng wlan1 -f 2000 --berlin 600
sudo airodump-ng wlan1 -a -c 153 --bssid 78:11:DC:00:E5:E3

指定抓某个信道的某个MAC地址

meishaoming commented 6 years ago

另一个 ESP8266 方案的 WiFi 探针

在淘宝上又买了另一款 ESP8266 方案的 WiFi 探针,购买地址

它在给 ESP8266 外部连接了一个 USB 串口芯片 CH340C,这样插入电脑后可以直接从 USB 口把数据读出来。

另外还配了一个 Type C 的 OTG 转接口。插到 Android 手机可以用 APP 读出来再传到云端,可以说也是个非常不错的办法。

它里面打了胶,我暴力拆开废了一个(还好一次性买了两个)。

img_0029

它每 15 秒返回一次扫描结果,两次(或多次)结果会有重复设备,需要在应用端去重。

Scan done, 7 wifi devices found.
STA[000]: 04:95:E6:5D:19:11, -71
STA[001]: FC:37:2B:4B:CD:39, -77
STA[002]: 64:09:80:51:5B:AC, -80
STA[003]: 04:95:E6:54:3D:61, -78
STA[004]: 78:11:DC:00:E5:E2, -76
STA[005]: D0:6F:82:DD:D6:70, -77
STA[006]: 7A:11:DC:20:E5:E2, -77
Data End.

Scan done, 11 wifi devices found.
STA[000]: D0:6F:82:DD:D6:70, -77
STA[001]: A4:5E:60:E3:25:31, -76
STA[002]: 7C:49:EB:DD:3A:25, -79
STA[003]: FC:37:2B:4B:CD:39, -79
STA[004]: 04:95:E6:54:3D:61, -76
STA[005]: 64:09:80:51:5B:AC, -79
STA[006]: 04:95:E6:5D:19:11, -65
STA[007]: 7A:11:DC:20:E5:E2, -75
STA[008]: 34:96:72:55:E9:53, -78
STA[009]: E8:9E:B4:16:1A:09, -81
STA[010]: 74:C2:46:BF:1D:E7, -65
Data End.