3、Beacon帧与网络发现:被动扫描原理、隐藏SSID探测、客户端探测请求分析
这一章我们聊聊网络发现。说白了,就是你的WiFi设备怎么找到周围的热点。
很多人觉得这很简单——打开手机WiFi列表,一堆SSID就出来了。但背后的信令交互,其实挺有意思。我当年刚做无线时,以为Beacon帧就是个广播名字的东西,后来抓包一看,里面藏的信息远比想象的多。
3.1 被动扫描原理:AP在喊,你在听
被动扫描,就是AP(接入点)每隔一段时间往外广播Beacon帧,客户端在信道上监听。AP喊,你听,就这么简单。
Beacon帧的发送间隔通常是100ms。但这不是死的——有些AP为了省电,会拉到200ms甚至更长。我遇到过一些企业AP,默认100ms,但客户说终端扫描太慢,我调成50ms后,发现信道利用率飙升了15%。嗯,这里要注意,频率太高不是好事。
Beacon帧里到底有什么?我列一下关键字段:
| 字段 | 说明 | 我的备注 |
|---|---|---|
| SSID | 网络名称,最多32字节 | 隐藏SSID时这里为空 |
| BSSID | AP的MAC地址 | 抓包时区分AP的关键 |
| Beacon Interval | 发送间隔(TU,1TU=1024μs) | 默认100,可调 |
| Capability Info | 能力标识(加密、WMM等) | 一眼看出AP支持什么 |
| Supported Rates | 支持的速率集 | 老AP只有1-11Mbps |
| DS Parameter Set | 当前信道号 | 确认AP在哪个信道喊话 |
| HT/VHT/HE Capabilities | 802.11n/ac/ax能力 | 判断AP是WiFi4/5/6 |
| RSN Information | 安全套件信息 | WPA2还是WPA3,一看便知 |
抓包时,Beacon帧的Frame Control字段前两个字节是0x80 0x00。你在Wireshark里过滤wlan.fc.type_subtype == 8,就能只看Beacon帧。
核心要点:被动扫描不发送任何数据,只监听。终端在每个信道上停留约100-200ms,收集Beacon帧。如果AP的Beacon间隔是100ms,终端在每个信道至少能收到1-2个Beacon帧,然后切换到下一个信道。
我个人习惯在排查覆盖盲区时,先做一次被动扫描。拿个笔记本,装个Wireshark,在场地里走一圈,看每个位置能收到多少个AP的Beacon帧。信号强度低于-80dBm的,基本就是边缘区域了。
3.2 隐藏SSID探测:它藏了,但没完全藏
隐藏SSID,就是把Beacon帧里的SSID字段置空(长度0)。AP照常发Beacon,但不说自己叫什么。很多公司觉得这样能“隐藏”网络,其实……
你想想看,AP虽然不广播SSID,但BSSID、信道、加密信息全在Beacon帧里。攻击者只要抓包,看到一堆Beacon帧里有个SSID为空的,就知道这是个隐藏网络。然后呢?
客户端要连接隐藏网络,必须主动发送Probe Request帧,里面带着目标SSID。AP收到后回复Probe Response。这个Probe Request,就是暴露的关键。
我曾经在客户现场做渗透测试,客户说“我们用了隐藏SSID,很安全”。我打开Wireshark,等了不到5分钟,就抓到了一个客户端的Probe Request,里面清清楚楚写着隐藏的SSID。客户当场沉默了。
警告:隐藏SSID不是安全措施。它只防小白,不防有心人。真正要防的是加密强度,不是名字藏不藏。
那怎么探测隐藏SSID?两种方法:
- 等客户端暴露:监听Probe Request,提取SSID。只要有一个客户端尝试连接,SSID就暴露了。
- 暴力探测:发送Probe Request帧,SSID填空字符串,看哪个AP回复Probe Response。有些AP会回复所有探测请求,不管SSID是否匹配。
抓包时,过滤隐藏SSID的Beacon帧可以用wlan.ssid == ""。过滤Probe Request用wlan.fc.type_subtype == 4。
小技巧:如果你在做WiFi审计,想快速发现隐藏网络,用airodump-ng --beacon。它会列出所有AP,隐藏SSID的会显示<length: 0>。配合--probe参数,还能看到客户端的探测请求。
3.3 客户端探测请求分析:终端在“喊”什么
客户端除了被动听Beacon,还会主动发Probe Request。这就像你站在商场里喊“有没有叫XX的店?”——AP听到了,就会回复“我在这里”。
Probe Request分两种:
- 定向探测:SSID字段填具体名称,只找特定网络。
- 广播探测:SSID字段为空(或全0),问“周围有哪些网络?”
广播探测在客户端主动扫描时很常见。终端在每个信道上发一次Probe Request,然后等100-150ms,收集所有AP的Probe Response。这样能快速发现周围所有网络。
但这里有个隐私问题。定向探测会把客户端曾经连接过的SSID广播出去。你想想看,你的手机在咖啡厅里喊“我要找HomeWiFi”,周围所有人都知道你家WiFi叫什么。这就是Probe Request泄露隐私的原因。
我记得有一次做公共WiFi安全评估,抓了10分钟包,就收集到了200多个唯一的SSID。里面有不少是“张三的家”、“李四办公室”、“王五公司”这种。嗯,隐私保护意识还是不够。
现代操作系统已经做了改进:
| 系统 | 行为 | 我的评价 |
|---|---|---|
| iOS 10+ | 随机化MAC,不发送定向探测 | 做得不错 |
| Android 10+ | 随机化MAC,支持隐私模式 | 看厂商实现 |
| Windows 10+ | 随机化MAC,但部分场景仍发定向探测 | 还有改进空间 |
| Linux | 默认不随机化,需手动配置 | 老毛病了 |
抓包分析Probe Request时,我关注这几个点:
- SSID:定向探测暴露了终端的历史网络列表。
- Source MAC:是否随机化?随机化MAC的前三字节通常是
02:00:00到02:FF:FF或06:00:00等特定OUI。 - Supported Rates:终端支持哪些速率,判断设备新旧。
- HT/VHT/HE Capabilities:终端支持WiFi4/5/6,影响AP的关联决策。
- Requested Information Elements:终端问AP要哪些信息,比如Country、Power Constraint等。
过滤Probe Request用wlan.fc.type_subtype == 4。想看定向探测,加and wlan.ssid != ""。想看广播探测,加and wlan.ssid == ""。
实战建议:在做WiFi性能优化时,我会先抓5分钟的Beacon和Probe帧。统计AP数量、信道分布、客户端密度。如果某个信道上Beacon帧太多(超过20个AP),说明信道过载,需要调整AP的信道规划。
3.4 知识体系:网络发现的核心逻辑
下面这张图,把被动扫描、隐藏SSID探测、客户端探测请求的关系画清楚了。
这张图展示了三个核心流程:
- 被动扫描(顶部):AP广播Beacon,客户端监听。这是最基础的网络发现方式。
- 隐藏SSID(中部):AP不广播SSID,但BSSID和加密信息仍在。客户端需要主动探测才能发现。
- 客户端探测(中下部):客户端发送Probe Request,AP回复Probe Response。定向探测会暴露历史SSID。
最后说一句,网络发现是WiFi工作的第一步,也是最容易被忽视的一步。很多性能问题,根源就在Beacon帧的配置上。比如Beacon间隔太大,终端扫描慢;Beacon帧太多,信道利用率高。调优时,别忘了从这第一步开始。