wifit3 hc22000 文件格式深度解析:为什么 M2 帧才是 WPA 握手的基石
【免费下载链接】wifit3Wifite but USB-only & cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3
wifit3 是一款跨平台的纯 USB 无线审计工具,支持 Linux、Windows 与 macOS,能被动嗅探或主动驱离客户端来捕获 WPA/WPA2 四次握手,并直接导出 hashcat-m 22000格式(.hc22000)的破解文件。这篇文章带你彻底看懂 hc22000 文件格式的 9 个字段,并回答一个关键问题:为什么 M2 帧才是整个握手能"可破解"的基石。哪怕你是第一次接触 WPA 破解的新手,也能读完就上手。
先搞懂:hc22000 文件到底是什么?
.hc22000是 hashcat-m 22000(WPA-PBKDF2-PMKID+EAPOL)模式的输入文件。它不是抓包文件,而是"给破解器喂的浓缩配方":每行一条记录,只保留 hashcat 暴力猜密码所需的最小信息——猜对了就重算校验值比对,猜错继续下一轮。
wifit3 为每个路由器(AP)维护一个聚合文件,命名规则是SSID_BSSID.hc22000(如MyHome_12-34-56-78-9a-bc.hc22000),握手与 PMKID 记录都追加进去并按值去重,见 src/wifit3/persist/save.py。
通用格式:一行 9 个字段
一条 hashline 用*分隔,共 9 个字段(规格定义在 src/wifit3/crack/hc22000_format.py):
WPA*类型*PMKID或MIC*路由器MAC*客户端MAC*SSID的HEX*ANonce*EAPOL载荷HEX*消息对| 字段 | 说明 | WPA*01(PMKID)行 | WPA*02(EAPOL)行 |
|---|---|---|---|
| 1 | 协议名,固定WPA | ✅ | ✅ |
| 2 | 类型:01=PMKID /02=EAPOL 握手 | ✅ | ✅ |
| 3 | PMKID(01)或 MIC 校验值(02),HEX | ✅ | ✅ |
| 4 | 路由器 MAC,紧凑 12 位 HEX | ✅ | ✅ |
| 5 | 客户端 MAC,紧凑 12 位 HEX | ✅ | ✅ |
| 6 | SSID 的 UTF-8 HEX(隐 SSID 为空) | ✅ | ✅ |
| 7 | ANonce(64 位 HEX) | 留空 | ✅ |
| 8 | 完整 EAPOL 载荷 HEX(MIC 已置零) | 留空 | ✅ |
| 9 | 消息对 + 容错位(如c0) | 留空 | ✅ |
所以PMKID 行只有 6 个字段,EAPOL 行填满 9 个——这也是解析器 parse_hc22000() 去重时区分两者的依据。
基石解析:M1~M4 中谁真正有价值?
WPA/WPA2 四次握手由 4 条 EAPOL-Key 消息组成。hashcat 的破解原理是:猜出 PMK 后,用ANonce + SNonce + 两个 MAC推导出 PTK,再重算捕获帧的 MIC 并比对。它需要两样东西:ANonce(来自 AP)和SNonce + MIC + EAPOL 原始字节(来自客户端)。四条消息的"含金量"完全不同:
| 消息 | 方向 | 携带的 Nonce | 带 MIC? | 对破解的价值 |
|---|---|---|---|---|
| M1 | AP → 客户端 | ANonce | ❌ | 只能当 ANonce"捐赠者" |
| M2 | 客户端 → AP | SNonce | ✅ | 钥匙石:SNonce + MIC + EAPOL 全齐 |
| M3 | AP → 客户端 | ANonce(重发) | ✅ | 又是 ANonce 捐赠者 |
| M4 | 客户端 → AP | 通常被置零 | ✅ | 仅当 SNonce 未被清零才可用 |
- M1 不行:它压根没有 MIC,hashcat 拿它没法重算校验;
- M4 通常不行:很多客户端(如 iPhone)把 M4 里的 SNonce 清零,而 hashcat 恰恰要从"带 MIC 的那条帧"里读回 SNonce——读不到就算完;
- M2 是基石:它是唯一稳定同时提供 SNonce、MIC 和完整 EAPOL 字节的消息,所以 wifit3 的配对算法只认"完整 M2(或罕见的非零 M4)"作为钥匙石,见 src/wifit3/crack/handshake.py。
消息对对照表:哪些组合能破解?
有了钥匙石,还需要一个同次握手的 ANonce 捐赠者(M1 或 M3),就构成 hashcat 认可的"消息对":
| 消息对 | 消息对字节 | 能否破解 |
|---|---|---|
| M1+M2 | 0x00 | ✅ 永远可以(M2 完整) |
| M2+M3 | 0x02 | ✅ 永远可以 |
| M3+M4 | 0x05 | ⚠️ 仅当 M4 的 nonce 非零 |
| M1+M4 | 0x01 | ⚠️ 仅当 M4 的 nonce 非零 |
以 M3 为 EAPOL 源的0x03/0x04 | — | hashcat 标记"unused",wifit3 从不输出 |
wifit3 的配对逻辑(crackable_pairs())模拟了 hcxpcapngtool 的容错:捐赠者与钥匙石的重放计数器差距 ≤ 8、两帧到达时间差 ≤ 5 秒、且较低编号消息必须先到;候选按"差距最小 → AP 已确认的对(M2+M3/M3+M4)优先 → 时间最近"择优。每个钥匙石、每个 ANonce 只输出一次,避免跨关联误配,而真正的重新握手(ANonce 刷新)会新增一行记录。
从捕获到落盘:wifit3 如何生成 hc22000 文件
wifit3 的设计原则是**"已捕获"与"可破解"永不矛盾**:判定"捕获成功"和生成 hashline 走的是同一条代码路径(crackable_pairs())。落盘流程:
- 配对成立 → 逐条生成
WPA*02行(EAPOL 载荷中 MIC 位置置零,由 hashcat 重算); - 有 PMKID 且为纯 PSK 时 → 额外生成一行
WPA*01; - 写入
{SSID}_{BSSID}.hc22000:02 行按ANonce去重,01 行按PMKID 值去重,只追加新记录; - 旧版拆分文件(
_handshake.hc22000/_pmkid.hc22000)启动时自动合并进聚合文件(consolidate_hc_files()); - 若开启 pcap 保存,还会同时导出原始
.pcap备查。
相关源码:行生成 hc22000_format.py、配对与 AKM 门槛 handshake.py、落盘去重 save.py、行解析 persist/common.py、格式测试 tests/crack/test_hc22000.py。
AKM 门槛:抓到 M2 也未必能破
最后一道关卡是加密套件(AKM)。只有PMK 由密码派生(PBKDF2)时 22000 模式才有意义:
- EAPOL(02 行):SAE(WPA3)、FT 快速漫游、企业 EAP、OWE 一律判为不可破解,wifit3 会给出
SAE/EAP/OWE/FT标签而非假装成功; - PMKID(01 行):22000 的 PMKID 路径只支持 HMAC-SHA1,因此仅纯 PSK的 PMKID 会输出,其余一律静默丢弃。
这也是 wifit3 宁可少存、也不让你白跑破解器的原因。
拿到文件之后:3 步丢给 hashcat
hashcat -m 22000 MyHome_12-34-56-78-9a-bc.hc22000 rockyou.txt- 把
.hc22000文件拷到装有 hashcat 的机器; - 指定一个密码字典(或规则文件);
- 命中后输出行首对应
WPA*02记录的 SSID,即明文密码;WPA*01行则是 M2 缺席时 PMKID 的备胎。
总结
hc22000 的本质是"把 hashcat 需要的东西原样递过去",而M2 帧恰好是唯一同时握有 SNonce、MIC 与 EAPOL 字节的消息——这就是它成为握手基石的原因。记住三个判断口诀:
- 看 M2:有完整 M2(或 nonce 非零的 M4)才有
WPA*02行; - 看 ANonce:M1/M3 只负责捐 ANonce,同一 ANonce 去重后只留一行;
- 看 AKM:SAE/EAP/OWE/FT 抓到也白抓,wifit3 会如实标注。
对新手而言,只要 wifit3 提示"握手已保存",就代表文件里已有一行可破解的WPA*02记录,直接交给 hashcat 即可。
【免费下载链接】wifit3Wifite but USB-only & cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考