MacBook打不出的那一帧,15块钱的开发板替它打了"

admin 2026-10-16 02:15:59 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

MacBook 打不出的那一帧,15 块钱的开发板替它打了

原创

钟智强
钟智强

哪吒网络安全

2026年10月10日 06:30
马来西亚

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

这三样东西凑在一起,能干一件 Apple 明令禁止、Windows 必须装驱动、Android 必须 root 的事,往空中打一个伪造的 802.11 帧,把一个 Wi-Fi 网络里所有设备踢下线。

我花了两周把它做出来,叫 WifiSec。它不需要 root,不需要 monitor 模式驱动,不需要你装任何东西。macOS、Linux、Windows、Termux,插上就跑。

¥15–25 34 B 0 4
硬件成本 单个帧长度 宿主机依赖 平台全免 root

事情从一个很朴素的念头开始。那天晚上我想验证自家路由器的密码到底有多脆,能不能被常见字典一击命中。

然后我发现,在 macOS 上,这件事连开头都开不了。

01 那一帧,MacBook 打不出来

我先把结论摆出来,不是权限不够,是这个能力压根不存在。

Apple 从系统框架层就没有开放 802.11 帧注入接口。CoreWLAN 只给你扫描和关联两个动作,注入这件事,连个门都没有。sudo 敲烂了也没用,root 没办法让一个不存在的 API 出现。

路径 原理 权限
ESP 协处理器(默认) 帧注入在板载射频完成,宿主机经 USB 串口下发协议帧 免 root
Linux 原生 iw 建 monitor 接口 + AF\_PACKET 原始套接字 root / CAP\_NET\_RAW
Windows 原生 Npcap 驱动注入 + WlanHelper 切 monitor 管理员 + Npcap
macOS 原生 不可用,Apple 未开放注入 API 无解

▲ 四条注入路径,只有第一条不需要跟操作系统讨价还价

macOS 还补了一刀。从 macOS 14 起,系统把 SSID 和 BSSID 的读取纳入定位服务授权,而这份授权只发给带签名的图形应用。命令行工具,哪怕加 sudo,扫出来的 BSSID 全是空的。

Windows 也别笑,要 Npcap 加管理员,还得网卡支持 monitor,多数笔记本内置网卡直接出局。Android 10 之后系统干脆禁止应用编程关联 WiFi。

与其跟每个平台的内核缠斗,不如把射频整体搬出去。

这就是 WifiSec 的核心设计,帧注入跑在 ESP8266 / ESP32 的板载射频上,宿主机只是一个通过 USB 串口下指令的遥控器。它自己的 WiFi 芯片完全不参与,你断网都能用。

▲ 六边形架构下的完整注入链路,应用层只认端口,平台能力全部收敛在 adapter 层

图里那条 frameWriter 端口是整件事的关键。应用层的注入循环只依赖一个 Write([]byte) error,它不知道自己写给串口、原始套接字还是 DLL。

所以 ESP 协处理器能作为「即插即用新后端」接进来,核心逻辑一行不改。六边形架构在这里不是教条,是实打实的工程收益。

▲ 开发实况 · CoreWLAN 扫描封装代码与 wifisec list 真实输出

02 34 个字节,掀翻一个 Wi-Fi

Wi-Fi 的关联生命周期由管理帧驱动。Probe、Authentication、Association,一路握手,客户端才正式挂到 AP 上。而 deauthentication 帧的设计初衷,就是允许任何一方单方面宣告这段关系结束。

要命的是,WPA2 及更早的协议里,管理帧不加密,也不做完整性校验。任何人都能伪装成 AP 的地址发出一帧「合法」的 deauth,客户端协议栈无从辨别真伪,只能照办断开。

伪造这一帧,只要 34 个字节。

▲ 34 字节的完整布局,addr2 冒充目标 AP,Reason Code 7 声明「你在未关联状态收到了不该收的帧」

三个细节值得一提。addr1 用广播地址,AP 下所有客户端一起中招;addr2 和 addr3 都填目标 BSSID,这帧在空口里看起来就是路由器自己发的;Reason Code 选 7,802.11 标准 §9.4.1.7 定义的标准原因码,iOS、Android、Windows、macOS、Linux 全都会正确响应。

Frame Control 那两个字节也不是硬编码的 0xC0,而是由子类型移位组合生成。整段构造收敛在 internal/ieee80211 纯字节编解码层,与传输介质完全解耦,可以独立单测。

当然,这套把戏有明确的失效边界,而我很愿意把它讲清楚。

安全代际 管理帧保护 deauth 有效性
OPEN / WEP 无 有效
WPA / WPA2 默认不启用 有效(绝大多数现网)
WPA2 + PMF 强制 启用 无效
WPA3 强制启用 无效
6GHz(WiFi 6E/7) 强制启用 无效

▲ PMF(802.11w)启用后,deauth 帧必须携带会话密钥计算的 MIC,伪造帧被直接丢弃

这是协议层防御,与注入硬件无关。任何工具都打不动 PMF 强制的网络,WifiSec 也不例外。发现目标带 WPA3 或强制 PMF 时,程序会如实告诉你打不动,而不是假装攻击成功。

03 把射频塞进 15 块钱

第一次听说这个方案的人几乎都会问同一个问题,板子要连上目标路由器吗。

不需要。deauth 是伪造而非连接,帧的 addr2 冒充目标 AP 的 BSSID,客户端以为路由器在说「你下线吧」。全程无需密码、无需认证、无需关联。板子也不用开热点。

宿主机这边更彻底,断网都能用,因为电脑和开发板之间走的是 USB 线,不是 WiFi。你笔记本的无线网卡从头到尾没参与过。

固件只有一份源码 core/esp/esp.ino,靠编译期条件分支覆盖 ESP8266 与 ESP32 全系。注入原语各用各的,ESP8266 走 wifi\_send\_pkt\_freedom,ESP32 走 esp\_wifi\_80211\_tx。

板型差异这块我拒绝做「自动猜测」,猜错了比不猜更糟。握手时固件用一个能力位图主动上报本事,bit0 置 1 表示支持 5GHz 注入,目前只有 ESP32-C5 有这能力。主机按位分发,5GHz 目标撞上 2.4GHz 芯片会被逐个跳过并明确告警,不猜板型,只信协商。

串口芯片的识别同理。板名在系统里永远显示 Unknown,因为 CH340 这类芯片只回报自己的身份,不回报载板。所以 WifiSec 用 VID:PID 认芯片,1A86:7523 是 CH340,10C4:EA60 是 CP2102,0403:6001 是 FT232RL。认芯片才是认板子的正确姿势。

▲ 开发实况 · 串口设备枚举代码与 wifisec serial 真实输出

04 一根串口线上的暗战

原理说起来干净,主机发帧、板子发射频。但一根 115200 波特的串口线,踩起坑来一点不含糊。

坑一,复位时序。多数串口驱动打开端口时会默认置位 DTR 和 RTS,而 NodeMCU 的自动复位电路把 DTR 接到了 GPIO0。这个默认电平会让芯片在复位瞬间直接锁进 ROM 下载模式,115200 下完全静默,像块砖头。所以 WifiSec 打开串口的第一件事不是发命令,而是显式走一遍复位,GPIO0 拉高,EN 拉低保持 100 毫秒,再释放,逼它从 Flash 正常启动。

坑二,启动噪声。ESP 上电会以 74880 波特率吐一段启动日志,主机按 115200 读出来就是一串随机字节。解析器的对策很笨但有效,逐字节丢弃,直到撞见帧头 0x5A,残缺帧留着等下一段数据拼齐。

坑三,握手机会。boot 要一两秒,期间命令必丢。主机以 500 毫秒节奏重发 PING,收到 PONG 才继续,冷启动热启动通吃。

▲ 从复位到注入循环的完整时序,双向魔数 0xA5 / 0x5A 防止帧方向错乱

整个协议是小端定长头,[魔数][cmd][len\_lo][len\_hi][payload],命令集一共七条。

cmd 方向 含义 payload
0x00 主机→ESP PING 无
0x00 ESP→主机 PONG 协议版本(1) + 能力位图(1)
0x01 主机→ESP 扫描 无(含隐藏 SSID)
0x01 ESP→主机 扫描条目 bssid(6)+channel+rssi+ssidLen+ssid
0x02 主机→ESP 注入 信道(1) + 802.11 帧
0x03 双向 关联尝试 / 结果 ssid+password / result(1)
0x04 ESP→主机 错误 出错命令(1) + 错误码(1)

▲ 固件侧 payload 上限 512 字节,超长直接拒绝,防缓冲区溢出

还有个反直觉的设计,注入不回 ACK。115200 折算下来约 11KB/s,每条确认帧都要占串口带宽。持续注入时,丢确认比丢帧更伤帧率。所以帧发出去就发出去,主机只维护本地计数,每 3 秒报一次进度。

这也顺手给了一个可观测的抓手,200 毫秒间隔就是每秒 5 帧,进度心跳每条恰好递增 15。数字对不上,说明串口写入受阻。速率是可以对账的,不是玄学。

▲ 开发实况 · esp.ino 固件代码与 deauth 运行终端

05 让路由器自己交代密码

WifiSec 的第二个核心能力是 brute。它回答的问题很具体,这个 AP 的密码在不在这本字典里。

它的做法是把字典里每个密码执行一次真实关联尝试,由 AP 亲自判卷。没有抓包,没有本地算 hash,AP 说错就是错,说对就是对。

▲ 双路径自动选择,插板子走协处理器,没板子回落本机网卡,命中即停

协议上只多了一对命令。主机发 0x03 带 ssidLen + ssid + passLen + password,固件执行 WiFi.begin() 后最长轮询 12 秒,回一个字节的结果,0 是失败,1 是成功。回完立刻 WiFi.disconnect(),我们只要知道对错,不要真的上网,保持连接反而占着 STA 资源。

没插板子时自动回落到本机网卡,macOS 走 networksetup,Linux 走 nmcli,Windows 走 netsh。这里有个我踩过才补上的细节,macOS 的 join 命令返回 0 只代表请求被受理,不代表真连上了。所以本机路径用两段式判定,先受理,再轮询接口状态最长 10 秒,确认真接入目标 SSID 才算命中,杜绝假命中。

命中即停,凭证一次给齐。

════════════ 爆破成功 ════════════

SSID   : MyWiFi

BSSID  : aa:bb:cc:dd:ee:ff

密码   : correcthorse

尝试   : 3/4 · 总耗时 41s

═══════════════════════════════════

凭证块里的 BSSID 按路径分级取证。ESP 路径由扫描条目直接带出,最可靠;本机路径在关联成功的一瞬间向系统回查,因为命中后的临时配置马上被清理,事后查现场已不存在;macOS 定位未授权时系统把 BSSID 脱敏,程序如实标注「未知」,不猜,不编。

维度 在线(wifisec brute) 离线(aircrack 路线)
原理 逐密码真实关联,AP 判定 抓握手包,本地算 PBKDF2 比 MIC
吞吐 2–5 秒一次 数千至数十亿次每秒(GPU)
对 AP 压力 高,会触发限速告警 零,抓包完全被动
前置条件 无,插板子就能验 monitor 抓包 + 捕到完整握手

▲ 两条互补路线,WifiSec 选了零抓包依赖的那条

为什么在线破解慢。耗时不在我这边,也不在固件,密码错误时多数 AP 不会立刻拒绝,而是让握手在 EAPOL 阶段沉默超时,这个窗口通常两到五秒。这是 802.11 的协议行为,不是实现缺陷,谁也压缩不了。

还要留意 AP 的脾气。企业级和较新的家用 AP 普遍带防爆破,连续失败三到十次后对你的 MAC 限速甚至拉黑几分钟,现象是后期尝试全部超时。这时「字典遍历完毕未命中」不等于字典里没有。WPA3 的 SAE 握手生来就是抗在线爆破的,命中率显著低于 WPA2,属预期。

▲ 开发实况 · 爆破编排代码与 wifisec brute 逐次尝试带耗时的真实输出

06 报错里就写着答案

我对这个工具的一个执念是,报错信息必须能直接把人带到问题现场,而不是甩一句 handshake failed。

比如串口被占,它直接把占用进程点名,端口正被 Arduino (PID 1234) 占用,让 lsof 说话,不让你猜。握手失败还会按链路观测分级,无数据、有噪声、端口被占用,三种诊断三种建议。

再看两个我踩得很深的坑。

74880 悬案。串口明明有数据,却永远等不到有效 PONG。查到最后是板型选错了,固件按 40MHz 晶振的板型编译,而板子实为 26MHz,UART 波特率整体偏移为 115200 × 26 / 40,恰好等于 74880。板型定义里藏着晶振参数,选错板型等于给串口换了个台。反过来用 74880 打开串口能看到清晰的 PONG,即确诊。

供电掉口。WiFi 射频初始化瞬间电流可达 300mA 以上,超过 USB 供电能力或线材压降过大时,板子直接掉电复位,macOS 检测到瞬时过流甚至会把整个端口关掉,设备节点凭空消失。对策朴素,直连电脑别经 hub,换短而粗的数据线。

最常见的坑反而是最物理的,充电线冒充数据线。充电线只有电源两根线,没有 D+/D-,设备节点物理上不可能出现。排查串口问题,永远从换线开始。

我还给固件写了套 LED 状态机,不开终端也能判状态。上电快闪三下是启动完成,之后每 0.5 秒一次心跳,常亮两三秒是正在扫描,急促无规律闪烁是正在注入。板子撒不撒谎,看灯就知道。

07 红线,写在最后但最重要

这个工具能做的事,法律边界非常清晰。

《中华人民共和国网络安全法》第二十七条明确禁止非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动。对他人无线网络实施 deauth 干扰或在线爆破,可能同时触犯《中华人民共和国刑法》第二百八十五条第三款与第二百八十六条。

WifiSec 仅限自有网络或已获书面授权的测试环境使用。自用路由器验证口令强度是合法典型场景,对任何第三方 AP 使用即越线,后果由使用者自行承担。程序每次开打前都会输出这条警告,不是走形式。

能力边界也刻意收着,仅 deauth 一种帧类型,不自动增加新的 packet type、凭据收集、持久化或漏洞利用能力。工具的攻击面,就是它的诚实程度。

尾声 门槛掉到地上之后

写完这个项目,我一直在想一件事。

过去做无线安全测试,门槛高在「懂内核、懂驱动、懂平台差异」,光是让 aircrack-ng 在 macOS 上跑起来就够写一篇长文。现在,帧注入的能力被装进一块 15 块钱的开发板,插根 USB 线就能用。

当攻击的门槛降到一根 USB 线,防御自查的紧迫性就抬到了每个家庭路由器上。

同一件工具,在攻击者手里是矛,在你手里就是体检仪。今晚就可以拿它扫一遍自家路由器,看看你的密码在不在这本字典里。

最后把项目本身亮一下。五条命令,一条 go install 就能装。

wifisec list                        # 无线接口与周边网络扫描

wifisec serial                      # USB 串口发现与 VID:PID 判读

wifisec deauth[串口]  # 802.11 deauth 帧注入

wifisec brutewith-pass: dict.txt   # 在线爆破,命中即停

wifisec upgrade                     # 从 GitHub Releases 原地原子更新

工程质量这块也没偷懒。表驱动测试覆盖协议编解码与解析逻辑,五平台交叉编译 CI,Conventional Commits 加 githooks 强制校验,版本号与 git tag 严格对齐。安全工具的工程质量,本身就是安全的一部分。

WifiSec · ESP 协处理器 WiFi 安全测试工具
项目地址 · github.com/ctkqiang/wifisec
在线文档 · ctkqiang.github.io/wifisec
安装方式 · go install github.com/ctkqiang/wifisec/cmd/wifisec@latest
平台产物 · macOS .app / Linux amd64·arm64 / Windows / Android Termux
技术栈 · Go 1.26 · 核心链路零 CGO · Hexagonal Architecture
开源协议 · GPL-3.0

觉得有意思的话,去 GitHub 点个 star,也欢迎在 issue 里骂设计。

转载请注明出处 · 仅限授权测试 · 请遵守所在地法律法规




MacBook打不出的那一帧,15块钱的开发板替它打了" 网络安全文章

MacBook打不出的那一帧,15块钱的开发板替它打了"

本文介绍作者开发的WifiSec工具,利用15-25元ESP8266/ESP32开发板实现802.11deauth帧注入,无需root和monitor模式即可跨平台使用。工具通过USB串口控制板载射频发射伪造管理帧,可踢设备下线并支持在线密码爆破。文章详述技术原理、串口协议、踩坑经验及法律边界,强调仅限自有网络或授权测试使用。
比Wireshark友好的监控工具,开源4万星" 网络安全文章

比Wireshark友好的监控工具,开源4万星"

Sniffnet是一款基于Rust的开源网络流量监控工具,获4万星,比Wireshark更友好,以可视化图形界面展示主机、服务与程序级网络活动。其v1.5版本新增程序级识别、自定义IP黑名单报警及多网卡总览,支持PCAP导入导出。建议用户下载对应平台安装包,选择网卡即可监控异常流量,遇渲染问题可设ICED\\_BACKEND=tiny-skia环境变量解决。
评论:0   参与:  0