crack_zju_wlan 题解
考点
- 磁盘镜像取证
- Vim
.swp交换文件恢复 - WPA2-PSK 握手包分析
0. 思路
附件是一个 ext 磁盘镜像 godspeed.img,里面放着 WPA2 握手包 crack_zju-01.cap,字典原本位于 password.txt,但这个文件已经被删除。
被删除文件的 inode 数据指针已经被清零,无法通过 undelete 恢复。不过,编辑 password.txt 时 Vim 异常退出,留下了 .password.txt.swp 交换文件,可以使用 vi -r 恢复字典。最后把恢复出的字典交给 aircrack-ng,即可破解握手包。
1. 使用 debugfs 查看镜像
先确认镜像类型:
❯ file godspeed.img
godspeed.img: Linux rev 1.0 ext2 filesystem data, UUID=73cbe4eb-29c4-433b-9fce-2ebb2b02a292 (extents) (64bit) (large files) (huge files)
使用 debugfs 查看根目录:
$ debugfs -R "ls -l /" godspeed.img
2 40755 (2) 0 0 1024 1-Oct-2021 14:09 .
2 40755 (2) 0 0 1024 1-Oct-2021 14:09 ..
11 40700 (2) 0 0 12288 1-Oct-2021 14:06 lost+found
12 100644 (1) 0 0 290224 1-Oct-2021 14:07 crack_zju-01.cap
17 100755 (1) 0 0 16384 1-Oct-2021 14:09 .password.txt.swp
可以看到握手包和 Vim 交换文件都还存在,将它们导出:
$ debugfs -R "dump /crack_zju-01.cap crack_zju-01.cap" godspeed.img
$ debugfs -R "dump /.password.txt.swp .password.txt.swp" godspeed.img
为什么不能 undelete
查看已删除 inode:
$ debugfs -R "lsdel" godspeed.img
0 deleted inodes found.
$ debugfs -R "stat <15>" godspeed.img
Inode: 15 Type: regular Mode: 0644 ...
Size: 0
Links: 0 Blockcount: 0
dtime: 0x6156a5f0 -- Fri Oct 1 14:08:48 2021
EXTENTS:
被删除的 inode(13~16)大小均为 0,EXTENTS 为空,原文件的数据块指针已经丢失,因此无法直接恢复。
2. 使用 Vim 交换文件恢复 password.txt
在临时目录中准备同名占位文件,然后使用 vim -r 恢复交换文件:
$ mkdir rec && cd rec
$ cp ../.password.txt.swp .password.txt.swp
$ touch password.txt # 占位,让 Vim 找到同目录同名 swp
$ vim -r password.txt
恢复出的内容是一个包含约 400 行密码的字典,在 Vim 中执行以下命令保存:
:w! password_recovered.txt
字典内容类似:
KpE4suAkq8
SJyhqPKqHR
...
0YcWPeLMBp
...
08CXJrys0Q
3. 分析 WPA2 握手包
使用 Wireshark 打开 crack_zju-01.cap,过滤 eapol,可以看到一次完整的 WPA2 四次握手:

WPA2-PSK 握手流程
AP STA
│ │
│──── M1: ANonce ───────────────────────>│
│ │ 生成 SNonce
│ │ 计算 PTK
│<─── M2: SNonce + MIC + RSN IE ─────────│
│ 计算 PTK │
│ 验证 M2 MIC │
│ │
│──── M3: ANonce + MIC + 加密 Key Data ─>│
│ │ 验证 M3 MIC
│ │ 安装 PTK
│ │ 获取并安装 GTK
│<─── M4: MIC ───────────────────────────│
│ 验证 M4 MIC │
│ │
│ 握手完成 │
握手之前:双方已经有 PMK
双方先使用 SSID 和 Passphrase,通过 PBKDF2 计算出 256-bit 的 PMK。
M1:AP 把 ANonce 发给 STA
Replay Counter: 1
WPA Key Nonce:
3d63d383878ae22a5954b0354e35394658da198cc6e3c1eed4db254e780060ac
WPA Key MIC:
00000000000000000000000000000000
这里的 Nonce 就是 ANonce(Authenticator Nonce)。STA 收到后生成随机数 SNonce。此时 STA 已经拥有 PMK、AP MAC、STA MAC、ANonce 和 SNonce,可以计算 PTK。
M2:STA 把 SNonce 和 MIC 发回 AP
PTK 的组成如下:
PTK
├── KCK Key Confirmation Key
│ ↓
│ 计算 MIC
│
├── KEK Key Encryption Key
│ ↓
│ 保护 Key Data
│
└── TK Temporal Key
↓
加密正常 Wi-Fi 数据
STA 使用 KCK 计算 MIC,并将其放入 M2:
WPA Key Nonce:
e60c98971c8e82813467405bae363ffdb8b4cdca8e0199440ae7633d2709e6db
WPA Key MIC:
28a01209b3e9321fe74ae33e055ac977
此时 AP 也拥有 PMK、AP MAC、STA MAC、ANonce 和 SNonce,因此可以计算 PTK 并取出 KCK。AP 将 MIC 字段置零后重新计算 MIC,如果结果与 STA 发来的 MIC 一致,就能确认双方使用的是同一个 PMK。
M2 之后,AP 已经确认 STA 拥有正确的 PMK,并算出了 PTK;STA 还在等待 AP 证明其拥有正确的 PMK 和 PTK,并通过后续握手同步密钥状态。
M3:AP 证明拥有正确的 PTK,并分发 GTK
M3 中包含加密的 Key Data,AP 用它证明自己也拥有正确的 PTK,并分发 GTK(Group Temporal Key)。
M4:确认密钥安装完成
M4 用于向 AP 确认 MIC 校验通过,双方已经完成密钥安装。
4. 使用 aircrack-ng 破解
拿着恢复出的字典运行 aircrack-ng:
$ aircrack-ng -w password_recovered.txt -b 12:2A:E2:13:5C:84 crack_zju-01.cap
Aircrack-ng 1.7
[00:00:00] 101/401 keys tested (2576.59 k/s)
Time left: 0 seconds 25.19%
KEY FOUND! [ 0YcWPeLMBp ]
Master Key : 2A 0A 56 2C 6E 44 73 96 60 DB 3B F2 D5 76 9F 1A
E4 CD 5B C1 9A 08 62 FA EF 0F 65 E2 34 B4 D1 ED
Transient Key : 38 46 8A 08 E9 96 12 DD 41 5D 28 EC DE 32 7C 7A
31 EF 22 7B 14 E7 35 D7 3A 78 D0 E1 A6 45 FE FA
99 12 C0 55 12 AC 96 E0 CE E6 4D 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
EAPOL HMAC : 28 A0 12 09 B3 E9 32 1F E7 4A E3 3E 05 5A C9 77
最终得到 Wi-Fi 密码:0YcWPeLMBp。