wifit3 WPS PBC按钮监听:物理按键按下瞬间提取明文PSK的完整流程
【免费下载链接】wifit3Wifite but USB-only & cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3
wifit3 是一款跨平台、仅靠 USB 无线网卡即可工作的 Wi-Fi 审计工具,它的 WPS PBC 按钮监听功能,能在有人按下路由器 WPS 物理按键的约 120 秒窗口内,自动以入网者身份完成 WSC 握手,从 M8 报文中直接提取明文 PSK(Wi-Fi 密码)并保存。本文完整拆解这条"按键按下 → 密码到手"的链路,帮你看懂每个环节在做什么。
一、为什么按一次 WPS 按钮就能拿到密码?
传统观念里,WPS 按键是"安全地让设备连网"的捷径,但它的底层协议 WSC 有个关键特点:
- 角色对调:按下按钮后,路由器变成 Registrar(登记者,持有凭证),任何在窗口内完成握手的设备都是 Enrollee(入网者);
- 没有密码门槛:PBC 模式的"设备密码"是公开常量
00000000,双方都能推导出相同的密钥,因此安全性完全依赖 Diffie-Hellman 密钥交换的私密性; - 必须主动参与:M8 中的凭证用 KeyWrapKey 加密,被动窃听者没有 DH 私钥、解不开它。所以 wifit3 的策略不是"旁听",而是抢在合法设备之前完成握手。
这意味着:只要你恰好"在场",谁按了 WPS 按钮,谁就等于把密码递给了完成握手最快的那个 Enrollee。
⚠️ 请仅在你拥有或已获授权的网络环境中使用,未授权的密码提取在多数地区属于违法行为。
二、被动监听:如何知道按钮被按下了?
wifit3 的检测是常驻且被动的——它不发送任何主动探测,只解析路由器广播的 Beacon / Probe Response 帧中的 WPS 厂商 IE:
| 信号 | 含义 |
|---|---|
Device Password ID = 0x0004 | 设备声明支持 Push-Button 模式 |
Selected Registrar = 1 | 按钮已被按下,登记窗口开启 |
两者同时成立时,模型层属性AccessPoint.wps_pbc_active翻转为True(定义见 access_point.py)。这是边沿触发的信号:从 False 跳到 True 的那一刻,就是"有人刚按下按钮"的瞬间。
在 Scanner 界面底部你能看到WPS PushButton auto-invade is enabled (press w to toggle)——w键就是全局监听开关,状态分"关闭 / 选中目标 / 全局"三档(快捷键绑定见 screen.py)。
有个已知盲区:部分路由器只在长按按键期间才广播该信号,少数甚至从不广播。对这种情况,项目提供了主动探测脚本 pbc_probe.py(用--now立即探测)。
三、自动入侵:从窗口检测到发起握手的 3 秒
检测到窗口开启后,Focus 屏幕的每次刷新(tick)都会调用一次"自动入侵判定" _should_auto_invade_pbc,它依次检查:
- 目标
wps_pbc_active为真,且全局 PBC 开关打开; - 该路由器没有被用户静默、不是隐藏 SSID;
- 密码库里还没有它的 PSK(拿到过的就不重复打);
- 没有处于重试冷却期(3 秒,见
_PBC_RETRY_COOLDOWN_S),也没有其它攻击正在占用无线网卡。
全部通过,_start_pbc_capture 启动WpsPbcCapture编排器(pbc.py),它做的事很干脆:
- 租约(lease):把网卡切到目标信道,打开 active-monitor、注册伪造 MAC、打开 ACK 计数;
- 伪装关联:以随机客户端 MAC 向目标完成 802.11 认证/关联,关联帧尾部带上
WPS_REQ_ENROLLEE意图的 WPS IE; - 移交状态机:把收发通道交给
WpsEnrollee,总超时 40 秒,单帧等待 ACK、最多重发 4 次——弱信号下的丢帧是 PBC 失败的头号原因; - 礼貌退场:无论成败,结束前发送 deauth 通知 AP 丢弃自己的 EAP 会话,释放网卡。
界面因此没有"开始 PBC"按钮——只有窗口开启时短暂出现的Stop PBC按钮(PBC 是自动入侵型攻击)。
四、M1→M8 握手:明文 PSK 诞生的完整报文流
WpsEnrollee(enrollee.py)是 PIN 暴力破解流程的"镜像角色":PIN 攻击里我们当 Registrar、路由器当 Enrollee;PBC 里方向完全反过来——
TX EAPOL-Start ← 敲门 RX WSC_Start / Identity-Req TX M1 (我们的 nonce + DH 公钥 PKe) RX M2 (路由器 nonce N2 + 公钥 PKr) → 双方此刻算出 DHKey = SHA256(g^ab mod p), 再派生 AuthKey / KeyWrapKey,并用 PBC 常量推出 PSK1/PSK2 TX M3 (E-Hash 承诺,路由器校验我们的身份) RX M4 → TX M5 (交出 E-S1) RX M6 → TX M7 (交出 E-S2) RX M8 ★ 内含 AES-128-CBC 加密的完整凭证 TX WSC_DONE → 用 KeyWrapKey 解开 M8,得到 SSID + network_key(明文密码)关键就在最后两行:M8 的ENC{S}属性解开后是一个完整的 WSC 凭证结构,wifit3 从中取出ssid与network_key两个字段——network_key就是明文 PSK 本身(enrollee.py)。
期间还有两个工程细节值得注意:
- 乱序/重传保护:维护
highest_mt序号,收到比自己已处理阶段更早的 WSC 消息直接丢弃,防止 AP 重传旧帧把状态机带偏; - 重叠会话不认输:若 AP 因检测到多个 PBC 会话而 NACK(config error 12),wifit3 不主动放弃——真实设备才是"重叠方",抢跑完成握手的一方获胜。
上图是完整成功的样子:日志从WPS PushButton: Window Open — auto-capturing PSK一路推进到M8 → SUCCESS: credential decrypted,顶部亮起✓ WPS PSK recovered,明文密码同时写入captures/<SSID>__wps_pbc.txt。
五、结果落地:密码库、重试与保存
成功后WpsPbcCapture的结局被 Focus 屏幕的 _finish_pbc 收割:
| 动作 | 说明 |
|---|---|
| 写入密码库 | app.vault.save_wps_pbc(ap, psk),之后该路由器不会再被重复攻击 |
| 回写模型 | AccessPoint.wps_pbc_psk记录已恢复的密码(与 PIN 破解结果wps_pin_psk分开存放) |
| 失败重试 | 窗口仍在、且失败源于网络抖动时,3 秒后自动再试一轮 |
| 用户终止 | Stop PBC 按钮置位_pbc_user_stopped,本窗口内不再自动入侵 |
六、新手上手清单
- 硬件:需要一张支持注入/监听的 USB 网卡(固件式芯片基本全能跑 WPS;最老的 RTL8187L、RT2500USB 等硬 MAC 芯片在长链路的 WPS 握手上较脆弱)。完整清单见 SUPPORTED-HARDWARE.md;
- 启动:装好后进入 Scanner,确认底部
auto-invade is enabled(必要时按w切换); - 触发:让目标路由器的 WPS 按钮被按下(真实环境即有人连网、装新设备、或执行 WPS 配对的瞬间);
- 收割:Focus 视图会自动完成握手并在 LOG 区显示
Password for <SSID>: "..."。
延伸阅读
- WPS 攻击架构与 PIN/PBC 双模式全解:wps/README.md
- 攻击编排层总览:campaigns/README.md
- WSC 报文编解码(M1~M8 构建与解析):dot11/wsc/
- PBC 盲区主动探测脚本:scripts/wps/pbc_probe.py
- 协议层细节与硬件验证结论:docs/planning/
一句话总结:wifit3 的 PBC 监听 = 被动解码 Beacon 里的 0x0004 信号(发现按钮被按)+ 边沿触发抢跑 WSC 握手(M1→M8)+ 用 KeyWrapKey 解开 M8 取回明文 PSK,全程自动,密码直接进库。
【免费下载链接】wifit3Wifite but USB-only & cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考