ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

wifit3 WPS密码学三件套:DHKey、KDK与AuthKey推导链完全解析

wifit3 WPS密码学三件套:DHKey、KDK与AuthKey推导链完全解析 wifit3 WPS密码学三件套DHKey、KDK与AuthKey推导链完全解析【免费下载链接】wifit3Wifite but USB-only cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3Wifit3 是一款面向 USB 无线网卡的跨平台 Wi-Fi 审计工具内置完整的 WPS PIN 暴力破解与 PBC 密码捕获功能。本文带你走读它纯 Python 实现的 WPS 密码学核心从 Diffie-Hellman 共享秘密出发看DHKey → KDK → AuthKey这条密钥推导链如何一步步把 1536 位数学运算变成能解开 Wi-Fi 密码的钥匙并搞懂为什么 PIN 爆破只要约 1.1 万次。一、为什么值得拆解 WPS 密钥推导链WPSWi-Fi Protected Setup本是按一下按钮就配网的便利功能却因 PIN 校验的设计缺陷成为 Wi-Fi 审计的主战场。wifit3 对它的实现没有依赖任何第三方密码库——整个加密面DH、HMAC、KDF、AES-CBC都是纯 Python 手写锚定在 hostapd 的参考实现上。密码核心集中在 src/wifit3/dot11/wsc/crypto.py文件头注释直接写明了推导链DHKey SHA-256( zeropad(g^AB mod p, 192) ) KDK HMAC-SHA256_DHKey( N1 || EnrolleeMAC || N2 ) KDF(KDK, Wi-Fi Easy and Secure Key Derivation, 640b) - AuthKey(32) || KeyWrapKey(16) || EMSK(32)三个密钥各司其职缺一环链条就断密钥长度作用DHKey32 字节双方 DH 交换产出的共同秘密摘要是整条链的根KDKKey Derivation Key32 字节混入双方 nonce 与 Enrollee MAC防止跨会话重放AuthKey32 字节会话工作密钥算 E-Hash/R-Hash 与 Authenticator并派生 PIN 半段密钥二、第一环DHKey 从哪来wifit3 使用 RFC 3526 的 MODP group 51536 位素数、生成元为 2与 WSC 规范一致。在 crypto.py 的dh_shared_secret中共享秘密就是标准的模幂运算pow(对方公钥, 我方私钥, p)再零填充到 192 字节——这一步刻意对齐 hostapd 的wpabuf_zeropad保证与真实固件逐字节一致。随后DHKey SHA-256(共享秘密)。关键点在于AuthKey 直接由这条链推出而链的起点是只有会话双方才有的 DH 共享秘密。这正是 PBC 场景下旁路窃听没用的原因窃听者拿到的只是公钥 g^a、g^b反解私钥意味着解 1536 位 DLP 困难问题实际不可行详见 campaigns/wps/README.md 对 PBC 抢跑策略的分析。三、第二环KDK 为什么要把 MAC 拌进去KDK HMAC-SHA256_DHKey(N1 || EnrolleeMAC || N2)三个输入各有深意N1Enrollee路由器在 M1 消息里发出的 16 字节随机数EnrolleeMAC把会话绑死在这个 BSSID 上防止把 A 路由器的 DH 会话搬到 B 路由器上重放N2Registrarwifit3 扮演的外置登记方在 M2 里发出的随机数实现在derive_keys先算 DHKey再算 KDK最后用 WPS 专用 KDF 一次性吐出三段密钥。KDF 使用固定标签Wi-Fi Easy and Secure Key Derivation循环 HMAC 直到凑满 640 位再截断——AuthKey 取前 32 字节、KeyWrapKey 取中间 16 字节、EMSK 收尾 32 字节。三个密钥同源但用途分离是典型的一钥匙开多把锁、换锁不换坯设计。四、第三环AuthKey 如何判定 PIN 对错拿到 AuthKey 后PIN 爆破就变成半段对半段的 HMAC 比对PSK1 HMAC-SHA256_AuthKey(PIN前4位 ASCII)[:16] PSK2 HMAC-SHA256_AuthKey(PIN后4位 ASCII)[:16] E-Hash HMAC-SHA256_AuthKey(E-S ‖ PSK ‖ PKe ‖ PKr)对应 registrar.py 的 EAP/WSC 状态机发出 M4内含 R-S1后路由器要么回 M5前半段猜对、要么回 NACK前半段错M6 再对后半段做一次同样判定。由于第 8 位是前 7 位的校验和pin_checksum可在本地直接验算后四段实际只有 1000 种可能——10⁴ 10³ ≈ 1.1 万次而非 1 亿次。这就是 WPS PIN 攻击的全部数学根基。M7 成功时Encrypted Settings 用 KeyWrapKey 做 AES-128-CBC 加密wifit3 用同一套 KDF 产物解密SSID 与 PSK 就此落地。五、离线自证不靠硬件也能验证推导链这套纯函数实现配了完整的离线锚点测试 tests/dot11/test_wsc_crypto.pyAES 部分对齐 FIPS-197 附录 C.1 与 NIST SP800-38A 已知向量避免自己证明自己DH/KDF 部分两个合成对端各自独立推导断言共享秘密与 AuthKey 完全一致PIN 半段判定用check_pin_half验证正确半段必通过、错误半段必失败——这正是 PixieDust 离线恢复pixie.py的原始判定原语。而空口正确性则由 scripts/wps/wps_probe.py 在真机 AP 上闭环验证只要 AP 接受 M2 并继续走到 M3即证明 DHKey→KDK→AuthKey 整条链与真实固件的 WSC 栈逐字节吻合。六、小结三件套一张图g^AB mod p ──SHA-256──▶ DHKey │ N1 ‖ MAC_e ‖ N2 ▼ KDK ──KDF(640b)──▶ AuthKey ‖ KeyWrapKey ‖ EMSK │ ┌──────────────────────┼────────────────────┐ ▼ ▼ ▼ E/R-Hash 判 PIN 半段 AES-CBC 解 M7 凭据 Authenticator 防篡改理解这条链你就同时看懂了 wifit3 的三件事PIN 为什么只要约 1.1 万次、PBC 为什么必须抢跑完成握手、PixieDust 为什么拿着 M3 捆绑包PKe、PKR、E-Hash1/2、E-Nonce、AuthKey就能离线爆破。想动手演练仓库内 scripts/wps/wps_lab.py 提供了完整的硬件真值实验脚本——当然请只在自有网络上使用。【免费下载链接】wifit3Wifite but USB-only cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进