wifit3 四向握手配对全拆解:5 秒窗口与 NC 容差如何定
【免费下载链接】wifit3Wifite but USB-only & cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3
wifit3 四向握手配对的最终产物,是一条能直接丢进 hashcat-m 22000的 hc22000 哈希行。从这条行倒推,EAPOL 解析管线需要从混杂模式抓包里凑齐三样东西:32 字节的 ANonce、32 字节的 SNonce,以及一帧自身携带 SNonce、且 MIC 恰好覆盖其内容的"MIC 帧"。
WPA*02*<MIC hex>*<BSSID>*<STA MAC>*<SSID hex>*<ANonce hex>*<802.1X载荷hex>*<message_pair字节>从输出倒推输入:EAPOL 各帧贡献哈希行的哪些字段 🧩
hashcat 破解-m 22000的校验路径是:猜密码 → 派生 PMK → 用 ANonce + SNonce 加双端 MAC 算出 PTK → 对被捕获的 802.1X 原文重算 MIC 比对。因此哈希行必须内嵌完整 802.1X 载荷、16 字节 MIC 与两段 Nonce,而四帧握手的贡献各不相同,模块头注释 handshake.py 给出了原始对照:
| 帧 | 发送方 | 携带内容 | 是否带 MIC | 对哈希行的贡献 |
|---|---|---|---|---|
| M1 | AP→STA | 32 字节 ANonce | 否 | 仅作 ANonce 供体 |
| M2 | STA→AP | 32 字节 SNonce | 是 | 关键帧:供 SNonce、MIC 与 802.1X 载荷 |
| M3 | AP→STA | ANonce(重复) | 是 | 供 ANonce,自身 MIC 不被使用 |
| M4 | STA→AP | Nonce 常为全零 | 是 | 条件关键帧:Nonce 非零才可担当 |
M2 之所以不可替代,是因为 hashcat 从"MIC 帧"内嵌的 Nonce 位置读回 SNonce,所以 MIC 帧只能是 M2,或 Nonce 未被清零的少见 M4。合法组合共四种:M1+M2、M2+M3、M1+M4、M3+M4,后两种以 M4 Nonce 非零为前提。上游的 EAPOL 解析分两步走:先在 MAC 头之后定位 LLC/SNAP + EAPOL 签名AA AA 03 00 00 00 88 8E,再按 802.1X 固定偏移抽 Key Info、8 字节重放计数器、32 字节 Nonce、16 字节 MIC,并按 Key Info 位与 Key Data 长度归类为 M1–M4(0 表示组重加密等无关帧),见 parser.py 的_parse_eapol与_classify_eapol_msg。弱信号下的截断帧也会以"尽力而为"的残缺包返回,交给配对阶段裁决。
配对规则逐关拆解:顺序、计数器、时间三重校验 🔍
配对核心crackable_pairs与 UI 横幅、自动保存共用同一条代码路径,界面宣称已捕获就一定可导出,二者不存在矛盾。候选在进入结果表之前,要按序闯过三道关卡:
- 顺序关:四向握手按 M1→M2→M3→M4 的固定次序到达,编号小的帧必须先到。若不设此条,上一次关联的帧会与本次的帧错配,倒序候选在 handshake.py 处被直接剔除。
- 计数器关:重放计数器是精确绑定,同一次握手中 M1 与 M2 均为 N,M3 与 M4 均为 N+1。供体帧须落在关键帧的期望值附近,偏差越大排序越靠后,候选按"计数器间隙 → 置信度 → 时间距离"取最优。
- 时间关:兜底层。缺少它时,两次不同关联的帧可能因计数器恰好对齐而被错配,wifit3 对到达时差超过 5.0 秒的配对直接拒绝,常量
_EAPOL_PAIR_WINDOW_S与上游工具同值,见 handshake.py。
放行的是同一次握手中顺序正确、计数器间隙为 0 或 ≤8 的组合;拒绝的是倒序、计数器跳变超过 8 格、时差超过 5 秒的组合。主逻辑位于 crackable_pairs。
时间窗与 Nonce 容差的参数溯源:5 秒与 8 的出处 ⏳
这两个参数都原样继承自 hcxpcapngtool,并非 wifit3 的本地调参:
- 5 秒窗口:对应该工具的
EAPOLTIMEOUT,同值 5 秒。作者团队在大量真实抓包上验证过,同一次握手的四帧不可能被拉开 5 秒以上。 - 8 格容差:对应该工具
--nonce-error-corrections 8的默认值,允许供体帧计数器与期望值偏差 ≤8 次,再由 hashcat 在小窗口内暴力补齐,见 handshake.py。
另有一条豁免规则:没有时间戳(0.0)的旧捕获在_within_window中跳过时间检查,仅凭计数器规则配对,保证老 pcap 的回放测试不受时间关影响。
脏数据容错:计数器跳变、截断帧与 NC 位的写入 🩹
无线环境有两类脏数据。其一是计数器跳变:AP 重传或弱信号会让供体帧计数器偏离预期几格,_NC_MAX = 8的容差让这类组合得以通过计数器关;代价是哈希行要打上专门的标记——message_pair 字节的高位置 NC 位 0x80(pair_byte | _NC_BIT,见 hc22000_line),告诉 hashcat "ANonce 与重放计数器允许小窗口漂移",由它自动试错补齐。其二是截断帧:解析层按尽力而为原则返回残缺包,但配对层的_mic_frame_usable要求关键帧的 802.1X 载荷至少到达 97 字节(覆盖偏移 81 起的 16 字节 MIC),残缺的 M2 在这里被判废,不会进入哈希行。
还有一处约定:哈希行内嵌的 802.1X 载荷在输出时把 MIC 字段清零,MIC 本体另存为独立字段,这正是-m 22000的读取规范。
实操捕获路径:从选网卡到导出握手哈希行 🎯
从支持列表里选一张支持监听模式的 USB 网卡(清单见 SUPPORTED-HARDWARE.md,如 ALFA AWUS036ACS、TP-Link Archer T2U Plus),在扫描页锁定目标 AP 后进入 Focus 页,wifit3 会自动完成解析 → 配对 → 判定,横幅实时显示握手捕获状态。
对于 SAE(WPA3)、EAP 等企业或无密码体制的握手,eapol_verdict(handshake.py)会给出"uncrackable"标注,界面显式标出不可破解,而不是静默丢弃,用户始终知道捕获了但不可用的握手。
涉及文件一览与要点回顾 📚
| 文件 | 职责 |
|---|---|
| src/wifit3/dot11/parser.py | EAPOL 签名定位与 M1–M4 消息分类 |
| src/wifit3/dot11/eapol.py | 802.1X 载荷组装与 MIC 回写(MIC_OFFSET = 81) |
| src/wifit3/crack/handshake.py | 配对算法、5 秒窗口、NC=8 容差、hc22000 生成 |
| src/wifit3/models/handshake.py | 每客户端握手状态与可破解判定 |
| src/wifit3/dot11/wpa.py | PMK/PTK 派生与 M2 帧构造 |
四条规则收束
- 哈希行 = ANonce + SNonce + 一帧自带 SNonce 的 MIC 帧,M2 是默认关键帧,M4 仅在 Nonce 非零时递补。
- 配对 = 到达顺序 + 重放计数器期望值 + 5.0 秒窗口(对齐 hcxpcapngtool
EAPOLTIMEOUT)+ ≤8 格计数器间隙(对齐--nonce-error-corrections 8)四条串联。 - message_pair 字节高位固定写 NC 位 0x80,让 hashcat 在哈希行层面自动启用小窗口漂移补偿。
- 判定与导出走同一条代码路径,SAE/EAP 等体制显式标注不可破解,横幅与保存永不互相矛盾。
【免费下载链接】wifit3Wifite but USB-only & cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考