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?两种方法:

  1. 等客户端暴露:监听Probe Request,提取SSID。只要有一个客户端尝试连接,SSID就暴露了。
  2. 暴力探测:发送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探测、客户端探测请求的关系画清楚了。

WiFi网络发现核心逻辑 AP(接入点) 客户端(STA) Beacon帧(广播SSID、能力) 被动扫描:客户端监听,不发送 隐藏SSID的AP Beacon帧(SSID为空) 隐藏SSID:不广播名称,但BSSID可见 客户端探测请求 Probe Request(定向/广播) 客户端主动询问:有XX网络吗? Probe Response(AP回复能力信息) ⚠ 隐私风险:定向探测暴露历史SSID,攻击者可追踪终端 现代系统通过随机化MAC和禁用定向探测来缓解 优化建议:调整Beacon间隔、信道规划、启用PMF(管理帧保护) 抓包分析:过滤Beacon(type_subtype=8)和Probe(type_subtype=4)

这张图展示了三个核心流程:

  • 被动扫描(顶部):AP广播Beacon,客户端监听。这是最基础的网络发现方式。
  • 隐藏SSID(中部):AP不广播SSID,但BSSID和加密信息仍在。客户端需要主动探测才能发现。
  • 客户端探测(中下部):客户端发送Probe Request,AP回复Probe Response。定向探测会暴露历史SSID。

最后说一句,网络发现是WiFi工作的第一步,也是最容易被忽视的一步。很多性能问题,根源就在Beacon帧的配置上。比如Beacon间隔太大,终端扫描慢;Beacon帧太多,信道利用率高。调优时,别忘了从这第一步开始。