当你拿到一台linux电脑,你可以把它配置成Wi-Fi抓包器,用以捕获空中Wi-Fi包,为网络问题分析提供依据。
一.无线网卡的监听模式
默认情况下,无线网卡和无线接入点(Wireless Access Point,WAP)建立连接后,就处于托管模式(Managed mode),在托管模式下,无线网卡只专注于接收从 WAP发给自己的数据报文。如果想让无线网卡监听所有的空中无线包,需要将无线网卡设置成监听模式(Monitor mode,也叫 RFMON 模式),然后再使用Wireshark 等软件对捕获的数据报文进行分析。 无线网卡除了 Managed mode 和 Monitor mode 这两种模式之外,还支持其他模式,如:Ad hoc(也叫IBSS模式)和Master mode, Linux Wireless 站点上对此有详细的介绍。
二.linux系统的网卡信息
为了将无线网卡设置成监听模式,我们需要先获取网卡驱动信息并设置网卡。
-
确保无线网卡正常工作。若Linux电脑能正常通过无线网络上网则无线网卡驱动正常。否则需要:
a. 确定无线网卡型号
~$ lsusb
b.安装驱动
linux无线网卡驱动的安装可以参考这里。
-
确定网卡是否支持Monitor Mode,查看自身网卡驱动命令:
~$ sudo lshw -c network
-network
description: Wireless interface
...
logical name: wlp0s20f3
...
configuration: broadcast=yes driver=iwlwifi
driverversion=6.2.0-34-generic firmware=72.daa05125.0 QuZ-
a0-hr-b0-72.u
ip=172.20.2.187 latency=0 link=yes multicast=yes
wireless=IEEE 802.11
resources: iomemory:600-5ff irq:16 memory:6055294000-
6055297fff
通过查阅Linux Wireless 论坛,我们可以得知:网卡驱动iwlwifi支持monitor mode,即监听模式。
Driver |
Manufacturer |
cfg80211 |
AP |
IBSS |
mesh |
monitor |
PHY modes |
adm8211 |
ADMtek/Infineon |
yes |
no |
no |
no |
? |
B |
iwlegacy |
Intel |
yes |
no |
yes |
no |
no |
A/B/G |
iwlwifi |
Intel |
yes |
yes (6) |
yes |
no |
yes |
A/B/G/N/AC |
ath12k |
Qualcomm Atheros |
yes |
yes |
no |
yes (6) |
yes (6) |
A/B/G/N/AC/AX/BE |
三.Linux系统无线网卡的配置
3.1 使用iwconfig查看无线网卡状态
1. Linux系统可以使用iwconfig工具查看当前网卡状态:
~$ iwconfig
lo no wireless extensions.
gpd0 no wireless extensions.
wlp0s20f3 IEEE 802.11 ESSID:"@Hyatt_WiFi"
Mode:Managed Frequency:5.805 GHz Access Point:
8C:7A:15:2E:56:4C
Bit Rate=360 Mb/s Tx-Power=22 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Power Management:on
Link Quality=51/70 Signal level=-59 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid
frag:0
Tx excessive retries:2 Invalid misc:0 Missed
beacon:0
可以看出无线网卡名称为:wlp0s20f3 ;当前处于托管模式(Managed Mode)。
2. 使用iwconfig 将网络配置为Monitor Mode时参考命令序列(optional):
$ su
$ ifconfig your_driver_name down //将无线网卡 your_driver_name 停用
$ ifconfig your_driver_name down //将无线网卡 your_driver_name 停用
$ iwconfig your_driver_name mode monitor //设置 your_driver_name 的模式为monitor mode
$ ifconfig your_driver_name up //启用无线网卡
$ iwconfig your_driver_name channel 3 //可选项,设置channel
$ iwconfig //重新检查网卡状态
- 为什么使用iwconfig将无线网卡设置成监听模式后,过几秒又会自动变成托管模式?大多数情况下归咎于Network Manager服务。如果无线网卡已经连接了 AP,则Network Manager会检测无线通常将无线网卡设置成监听模式后,即可以使用如 Wireshark 之类的抓包工具截取无线网络报文了。但是由于抓包时网卡是处于监听模式的,这时不能通过Wi-Fi连接互联网,否则网卡会自动切换回托管模式。为了避免自动切换,我们可以使用airmon-ng工具配置Managed Mode。所以用户可以尝试断开无线连接,或者使用“service network-manager stop”停止Network Manager服务 。
考虑到停止Network Manager可能造成其他网络服务问题,我们不推荐直接使用iwconfig设置网络的Monitor Mode。
3.2 使用airmon-ng监听无线网络
通常将无线网卡设置成监听模式后,就可以使用如 Wireshark 之类的抓包工具抓取无线网络空中报文了。但是由于抓包时网卡是处于监听模式的,此时不能通过Wi-Fi连接互联网,否则网卡会自动切换回托管模式。为了避免自动切换,我们可以使用airmon-ng工具 。
-
安装抓包需要使用的工具
~$ sudo apt install -y wireshark net-tools wireless-tools aircrack-ng
~$ sudo airmon-ng //查看当前网卡及驱动状态`
PHY Interface Driver Chipset
phy0 wlp0s20f3 iwlwifi 14.3
Network controller: Intel Corporation Wi-Fi 6 AX201 (rev 20)
-
根据列出的当前系统所使用的无线网卡类型,以及安装的驱动程序,使用airmon-ng相关命令将网卡设置成监听模式
~$ sudo airmon-ng start wlp0s20f3
Found 4 processes that could cause trouble.Kill them using
airmon-ng check kill' before putting the card in monitor mode,
they will interfere by changing channels and sometimes putting
the interface back in managed mode
PID Name
820 avahi-daemon
825 NetworkManager
856 wpa_supplicant
860 avahi-daemon
PHY Interface Driver Chipset
phy0 wlp0s20f3 iwlwifi 14.3 Network controller: Intel
Corporation Wi-Fi 6 AX201 (rev 20)
(mac80211 monitor mode vif enabled for [phy0]wlp0s20f3 on
[phy0]wlp0s20f3mon)
(mac80211 station mode vif disabled for [phy0]wlp0s20f3)
-
查看Monitor Mode是否设置成功
~$ sudo airmon-ng
PHY Interface Driver Chipset
phy0 wlp0s20f3mon iwlwifi 14.3
Network controller: Intel Corporation Wi-Fi 6 AX201 (rev 20)
-
设置抓包频带(channel)和带宽
~$ sudo iw dev wlp0s20f3mon set channel 10 HT20
-
抓包
~$ sudo wireshark
-
抓包结束,返回托管模式(Managed Mode)
~$ sudo airmon-ng stop wlp0s20f3mon
3.3 使用iw监听无线网络
随着Wi-Fi技术的发展进步,cfg80211和nl80211作为一种新的无线驱动框架用于无线程序的开发。而cfg80211不使用ioctl系统调用,而是使用Netlink(基于socket通信)。iw就是完全基于cfg80211框架重新设计并开发的网络配置工具
-
使用iw查看网卡信息以及支持的频带和带宽:
~$ iw list
-
列出本地的无线设备,以及每个无线设备的详细信息
~$ iw dev
phy
Unnamed/non-netdev interface
wdev 0x5
addr 7c:21:4a:21:c3:57
type P2P-device
txpower 0.00 dBm
Interface wlp0s20f3
ifindex 5
wdev 0x4
addr 7c:21:4a:21:c3:58
ssid Nordicsh-5G
type managed
channel 44 (5220 MHz), width: 160 MHz, center1: 5250 MHz
txpower 22.00 dBm
multicast TXQ:
qsz-byt qsz-pkt flows drops marks overlmt hashcol tx-bytes tx-packets
0 0 0 0 0
-
查看指定网卡设备信息
~$ iw dev wlp0s20f3 info
-
将网卡设置为监听模式: ~$ sudo iw dev wlp0s20f3 interface add mon0 type monitor 或者 ~$ sudo iw phy phy0 interface add mon0 type monitor
-
使能虚拟网卡:
~$ sudo ifconfig mon0 up
上述两条命令新增了一个虚拟网卡接口mon0,并将mon0设置为监听模式。这个命令和3.2的airmon-ng的效果相同,wlp0s20f3仍然保持 managed模式不变,新增的mon0运行在Monitor模式下。虚拟接口新增之后需要使用ifconfig up启用 设置成功后可以用“iw dev”或者“iwconfig”查看无线网卡信息,可发现多了Interface mon0的网卡设备
注意,设置mon0为monitor之后直接设置channel可能会报错:Error for wireless request “Set Frequency” (8B04) : SET failed on device mon0 ; Device or resource busy. 此时需要删除managed mode 网卡(删除该网卡后暂时无法上网):
~$ sudo iw dev wlp0s20f3 del (然后重新设置网卡频段)
四.使用wireshark抓包
4.1 通过wireshark抓包必须的配置
安装必要工具。
~$ sudo apt install -y wireshark net-tools wireless-tools aircrack-ng
为实现抓包,我们将网卡设置为监听模式并使能虚拟网卡后;需要启用wireshark: (~$ sudo wireshark), 由于wireshark中不能显式地设置抓包的频带(channel)和带宽,我们需要后台设置频带(channel)和带宽
~$ sudo iw dev wlp0s20f3mon set channel 149 80MHz
如果只是动态地修改频带(channel),也可简化为:
~$ sudo iwconfig mon0 channel 140
如何获取所需监听AP的通信频带(channel)?
- 通过查看路由器配置
- 通过wifi Shell sample的 wifi scan 命令获取
- 通过sudo iwlist your_driver_name scan | egrep "Cell|ESSID|Channel" 命令获取,注意网卡需处于托管模式(Managed Mode),例如:
~$ sudo iwlist wlp0s20f3 scan | egrep "Cell|ESSID|Channel"
Cell 01 - Address: 94:98:69:51:A9:47
Channel:153
ESSID:"CMCC-6XyY-5G"
Cell 02 - Address: 96:BE:09:91:9C:E2
Channel:161
ESSID:""
Cell 04 - Address: 04:AB:08:A0:F6:16
Channel:1
Frequency:2.412 GHz (Channel 1)
ESSID:"CMCC-MF9H"
4.2 频带和带宽说明(optional)
动态设置频带和带宽:
~$ iw dev wlp0s20f3mon set channel 3 HT20
Wi-Fi 频段频率与channel存在对应关系,把频率划分成很多宽度相等的子频段(频带)就是信道Channel,每个信道的频率宽度称为带宽。同版本的Wi-Fi协议,其无线电载波可以工作在不同的频率范围如2.4GHz和5GHz频段内。
固定频率的波是无法承载信息的,只有能切换频率的波才能承载信息,无线信号通讯必须工作在一定频段内而非某个频率点。
对2.4 GHz (802.11 b/g/n)频率进行频段分配,一共可以有14个信道(频带)。
如果每个信道的带宽是22MHz,那么2.4G最多只能同时使用三个互不重叠的信道(1,6和11)。其中信道14在全球大多数国家都不允许使用。
如果信道带宽是20MHz,那么最多可以同时使用四个信道(1,5,9,13)。2.4G频道带宽典型值说明:
# NoHT : 不使用802.11n,基本很少用
# HT20 : 802.11n/ac/ax 20Mhz频宽
# HT40+ : 802.11n/ac/ax 双20Mhz,控制信道比扩展信道频率高
# HT40- : 802.11n/ac/ax 双20Mhz,控制信道比扩展信道频率低
2.4G频段分布图
对于5GHz频段,信道从5.000GHz(信道0)开始编码,每5MHz一个信道。各国开放频率范围有所不同,如EN301 893规范是从 5.150GHz开始的。通常实际允许使用的信道是从36开始的,频宽20MHz,可用信道每次+4,如36,40,44,48 … 64 。 查阅每个国家可用的信道可参考:无线局域网信道列表 - 维基百科,自由的百科全书 (wikipedia.org)
监听模式下查看网卡支持的频带和带宽信息:
~$ iw wlp0s20f3mon info
4.3 实时跳频(optional)
信道×带宽的排列组合选项太多,普通用户并不知道哪些组合是合法的,以及自己的网卡是否支持这些组合。我们用2个脚本来自动完成一些工作。
配置识别脚本test-channels.sh:自动识别出当前网卡哪些信道+带宽的排列组合是合法的,并记录下来;
自动跳频脚本:在前一个脚本的范围内,无限循环跳频扫描: channel-hopping.sh
注意:需要将脚本里网卡接口改为自身监听网络所使用的网卡,如:DEFAULT_INTERFACE="wlp0s20f3mon";
使能执行权限chmod +x ./test-channels.sh;chmod +x channel-hopping.sh执行权限;并用sudo执行。
1.test-channels.sh
此脚本列举出了5G、2.4G频段下,各个带宽下支持的扫描信道,执行结果如:
~$ chmod +x ./test-channels.sh
~$ sudo ./test-channels.sh
===================================================
2.4G:
Width:HT20, Valid Channels:1 2 3 4 5 6 7 8 9 10 11 12 13
Width:HT40+, Valid Channels:1 2 3 4 5 6 7 8 9
Width:HT40-, Valid Channels:5 6 7 8 9 10 11 12 13
Width:80MHz, Valid Channels:
Width:160MHz, Valid Channels:
5G:
Width:HT20, Valid Channels:36 40 44 48 52 56 60 64 100 104 108 112 116 120 124 128 132 136 140 144 149 153 157 161 165
Width:HT40+, Valid Channels:36 44 52 60 100 108 116 124 132 140 149 157
2.channel-hopping.sh
自动跳频的脚本内记录了每种带宽下,网卡可以支持的信道。这些数据来源是前一个脚本的输出结果此时需要设置抓包频段和带宽:
~$ chmod +x channel-hopping.sh
~$ sudo ./channel-hopping.sh HT20
执行脚本时,指定要使用的带宽,脚本将会每0.5s切换一次信道。脚本只会循环执行一次,之后你可以手动指定信道和带宽。
4.4 过滤器
抓包时,可以在wireshark中设置过滤器来选取自己设备的包。根据MAC地址过滤的语法如下:
- Source Address: wlan.sa==XX:XX:XX:XX:XX:XX
- Destination Address: wlan.da==XX:XX:XX:XX:XX:XX
- Receiver Address: wlan.ra==XX:XX:XX:XX:XX:XX
- Transmitter Address: wlan.ta==XX:XX:XX:XX:XX:XX
五.小结
5.1 使用airmon-ng+wireshark抓包
sudo apt install -y wireshark net-tools wireless-tools aircrack-ng
Iwconfig
sudo iwlist wlp0s20f3 scan \| egrep "Cell\|ESSID\|Channel"
=> wlp0s20f3
sudo airmon-ng start wlp0s20f3
iwconfig (optional)
=> wlp0s20f3mon
sudo wireshark
iw wlp0s20f3mon info
#网卡名:wlp0s20f3mon
频道:149
带宽:可选的参数有
频道:149
带宽:可选的参数有
noHT : 不使用802.11n,基本很少用
HT20 : 802.11n/ac/ax 20mhz频宽
HT40+ : 802.11n/ac/ax 双20Mhz,控制信道比扩展信道频率高
HT40- : 802.11n/ac/ax 双20Mhz,控制信道比扩展信道频率低
5MHz : 5MHz,基本很少用
10MHz : 10MHz,基本很少用
80MHz : 802.11ac/ax
160MHz: 802.11ac/ax
sudo iw dev wlp0s20f3mon set channel 11 HT20
sudo ./test-channels.sh
chmod +x channel-hopping.sh
sudo ./channel-hopping.sh HT20
wlan.da==f4:ce:36:00:1d:52 or wlan.sa==f4:ce:36:00:1d:52
sudo airmon-ng stop wlp0s20f3mon
5.2 使用iw+wireshark抓包
sudo apt install -y wireshark net-tools wireless-tools aircrack-ng
sudo iw dev
iwconfig
=>wlp0s20f3
sudo iwlist wlp0s20f3 scan | egrep "Cell|ESSID|Channel"
=>channel 3
sudo iw dev wlp0s20f3 interface add mon0 type monitor
iwconfig
sudo ifconfig mon0 up
sudo iw dev wlp0s20f3 del
sudo iwconfig mon0 channel 3
sudo wireshark
sudo ./test-channels.sh
sudo ./channel-hopping.sh HT20
sudo iw phy phy0 interface add wlp0s20f3 type managed
sudo iw dev mon0 del
iwconfig
注意:如果wireshark 因权限问题问题无法启动,可执行以下命令序列:
sudo apt-get install libcap2-bin wireshark
sudo chgrp nordic /usr/bin/dumpcap
sudo chmod 750 /usr/bin/dumpcap
sudo setcap cap_net_raw,cap_net_admin+eip /usr/bin/dumpcap