3、Wi-Fi协议抓包:Wi-Fi帧结构、Beacon帧、Probe帧、数据帧抓包分析
好,咱们进入Wi-Fi抓包的正题了。前面两章我们把工具和环境搭好了,现在该看看空中到底在传什么。
Wi-Fi抓包,说白了就是监听802.11帧。你想想看,手机、路由器、智能灯泡之间通信,全靠这些帧在空气里飞来飞去。我刚开始做物联网安全时,总觉得Wi-Fi协议很复杂,后来发现——只要抓住几个关键帧类型,大部分问题都能定位。
3.1 Wi-Fi帧结构:三层头,一个身
每个802.11帧都长一个样。我习惯把它拆成三部分:
- MAC头(Frame Control + Duration + Addresses)
- 帧体(可变长,承载实际数据)
- FCS(4字节校验,看帧有没有被干扰)
其中MAC头里的Frame Control字段最关键。它只有2字节,但决定了这个帧是干啥的。
Frame Control字段结构(2字节):
- Protocol Version (2 bits) — 固定00
- Type (2 bits) — 管理帧/控制帧/数据帧
- Subtype (4 bits) — 具体类型,比如Beacon、Probe Request
- To DS / From DS (各1 bit) — 方向标志,决定Address字段含义
- 其他标志位:More Frag、Retry、Power Management等
嗯,这里要注意:Type + Subtype组合起来才能确定帧类型。比如Type=00, Subtype=1000就是Beacon帧。我当年在调试一个智能插座时,发现它连不上网,抓包一看——它一直在发Probe Request,但AP根本不回Probe Response。后来发现是信道没对上。
3.2 Beacon帧:AP的“我在呢”广播
Beacon帧是AP定期发送的信标。说白了就是AP在喊:“我在这儿,我叫XX,支持这些功能,快来连我!”
抓包时,Beacon帧的特征很明显:
- 目的地址是广播地址(FF:FF:FF:FF:FF:FF)
- 源地址是AP的MAC
- BSSID就是AP的MAC
- 帧体里携带大量信息元素(Information Elements, IE)
我一般用Wireshark过滤 wlan.fc.type_subtype == 0x08 来只看Beacon。你打开一个Beacon帧,会看到这些关键字段:
| 字段 | 说明 | 抓包时关注点 |
|---|---|---|
| Timestamp | AP的64位时间戳 | 用于同步,偏差大说明AP时钟不准 |
| Beacon Interval | 发送间隔(单位TU,1TU=1024μs) | 默认100TU≈102.4ms,改小会增加空口开销 |
| Capability Information | AP能力标志(ESS、IBSS、加密等) | 看是否支持WPA2/WPA3 |
| SSID | 网络名称 | 隐藏SSID时此字段为空 |
| Supported Rates | 支持的速率集 | 老设备只支持1/2/5.5/11 Mbps |
| RSN Information | WPA/WPA2/WPA3安全参数 | 看加密套件、AKM套件 |
| HT / VHT / HE Capabilities | 802.11n/ac/ax能力 | 看是否支持MIMO、信道带宽 |
实战技巧:抓Beacon帧可以快速发现“假AP”。我曾经在客户现场抓到过一个Beacon,SSID和公司官方Wi-Fi一模一样,但BSSID不同,RSN信息里加密套件也不对——典型的Evil Twin攻击。Beacon帧是Wi-Fi安全审计的第一道防线。
3.3 Probe帧:客户端在“找网”
Probe帧分两种:Probe Request(客户端发)和Probe Response(AP回复)。
客户端想连Wi-Fi时,会发Probe Request。它有两种模式:
- 主动扫描(带SSID):客户端指定要连哪个网络,比如“有没有叫Office_WiFi的?”
- 主动扫描(空SSID):客户端广播“附近有哪些AP?报上名来!”
我习惯用 wlan.fc.type_subtype == 0x04 过滤Probe Request,用 0x05 过滤Probe Response。
抓包时你会发现,手机在息屏状态下也会定期发Probe Request。这其实是个隐私问题——因为Probe Request里携带了客户端的MAC地址,攻击者可以跟踪你的移动轨迹。所以现在iOS和Android都默认用随机MAC发Probe Request了。
避坑指南:我曾经调试过一个IoT设备,它连不上公司Wi-Fi。抓包发现它一直在发Probe Request,但AP就是不回Probe Response。查了半天,原来是设备只支持2.4GHz,而AP的2.4GHz射频坏了。Probe Request发出去,AP收不到,自然没回复。所以抓包时不仅要看客户端发的,还要确认AP有没有回应。
3.4 数据帧:真正的“货”
数据帧就是真正传数据的帧。你上网、看视频、传文件,全靠它。
数据帧的Type=10(二进制),Subtype=0000。但数据帧里最关键的字段是To DS和From DS:
| To DS | From DS | 含义 | Address1 | Address2 | Address3 |
|---|---|---|---|---|---|
| 0 | 0 | IBSS(Ad-hoc) | DA | SA | BSSID |
| 1 | 0 | 从客户端到AP | BSSID | SA | DA |
| 0 | 1 | 从AP到客户端 | DA | BSSID | SA |
| 1 | 1 | WDS桥接 | RA | TA | DA |
嗯,这里要注意:数据帧的Address字段含义会变。你抓包时看到三个MAC地址,别搞混了。我刚开始学的时候,经常把SA和DA看反,后来养成习惯——先看To DS和From DS,再确定每个Address代表什么。
数据帧的帧体里,如果没加密,直接就是IP包。如果加密了(比如WPA2),帧体就是加密后的数据,Wireshark默认显示为“802.11 CCMP”或“TKIP”数据。要解密,你得有密码或PMK。
3.5 抓包实战:三步定位法
我总结了一套抓包定位问题的流程,分享给你:
- 看Beacon:确认AP是否存在、信道对不对、加密方式是否匹配
- 看Probe:确认客户端在找哪个网络、AP有没有回应
- 看数据帧:确认连接建立后,数据是否正常传输
举个例子。有一次客户说智能门锁连不上Wi-Fi。我抓包一看:
- Beacon帧正常,AP在信道6上广播
- 门锁发Probe Request,带SSID,AP回了Probe Response
- 但接下来门锁发了一个空数据帧(Null Function),然后就没动静了
问题出在哪?空数据帧是Power Management位被置1,表示门锁要进入省电模式。但AP没正确处理,导致门锁一直睡不醒。后来升级了AP固件就好了。
你看,抓包不是瞎抓,要有思路。Beacon、Probe、数据帧,这三类帧覆盖了Wi-Fi连接的三个阶段:发现、扫描、数据传输。抓住它们,大部分问题都能定位。
核心要点:
- Wi-Fi帧结构:MAC头 + 帧体 + FCS,Frame Control决定帧类型
- Beacon帧:AP广播,包含SSID、速率、加密、能力信息
- Probe帧:客户端主动扫描,AP回复
- 数据帧:To DS/From DS决定地址含义,加密后帧体不可读
- 抓包定位:Beacon→Probe→数据帧,三步走
这张图就是我的抓包分析流程。从抓包准备开始,按顺序捕获Beacon、Probe、数据帧,每一步都有检查点。你按这个流程走,基本不会漏掉关键信息。