freopen's Blog

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 四次握手

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