sensepost/assless-chaps
GitHub: sensepost/assless-chaps
利用 NT hash 数据库和 hash shucking 技术实现 MSCHAPv2/NTLMv1 挑战/响应的快速破解,速度比 hashcat 快数百倍。
Stars: 140 | Forks: 18
# assless-chaps
利用 NT hash 数据库快速破解 MSCHAPv2/NTLMv1 挑战/响应
# 介绍
Assless CHAPs 是一种高效的方法,如果你拥有挑战和响应(例如来自 WiFi EAP WPE 攻击),可以恢复 MSCHAPv2/NTLMv1 交换中使用的 NT hash。
它需要一个 NT hash 数据库,关于如何从现有列表制作这些 hash,或使用 hashcat 配合字典和规则生成它们的说明如下。我包含了一个来自 [SecLists](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/10-million-password-list-top-1000000.txt) 的示例数据库。你需要对其进行 bunzip 解压。
# 技术
MSCHAPv2 交换不需要“破解”明文密码,我们只需要所使用的 NThash。
MSCHAPv2 将 NThash 分为三部分,并将每部分用作不同的密钥来 DES 加密相同的挑战(源自对端和认证者挑战)。NTHash 被拆分为两个 7 字节的密钥和一个 2 字节的密钥。这意味着最后一个密钥用 NULL 填充以达到所需的密钥长度。由于 DES 操作的高效性和 65,535 的密钥空间,这可以被快速暴力破解。一旦我们获得了这两个字节,就可以在数据库中查找所有以这两个字节结尾的 NThash。这提供了一组小得多的可能哈希值进行检查。
这是一种空间与时间权衡的形式,类似于彩虹表。这也是一种 [hash shucking](https://www.scottbrady91.com/Authentication/Beware-of-Password-Shucking) 形式。
# 演示
这最初是在 [Defcon 29 的 RF Hacking Village](https://www.youtube.com/watch?v=lm7Cuktpnb4) 上展示的。幻灯片包含在此仓库中。
# 速度
以下是三个示例挑战/响应和三个不同字典(一个小型私有字典、rockyou 和 Have I Been Pwned 列表)的比较。这些是在我的 Macbook Pro 2016 上完成的。Hashcat 使用的是[这个](https://github.com/hashcat/hashcat/pull/2607) hash shucking 内核以及两个内置 GPU,运行 pure 而非优化内核(因为后者尚不存在)。Hash3 不在列表中以模拟最坏情况下的性能。我不包括 hashcat 第一次运行时构建字典缓存的时间。
*Hash1*
小型 hashlist:
```
hashcat 0.50s user 0.27s system 55% cpu 1.405 total (8597.8 kH/s)
assless 0.05s user 0.00s system 294% cpu 0.018 total
```
Rockyou hashlist:
```
hashcat 2.67s user 0.51s system 93% cpu 3.413 total
assless 0.05s user 0.01s system 281% cpu 0.021 total
```
HIBP hashlist:
```
hashcat 59.97s user 11.72s system 136% cpu 52.603 total (5620.6 kH/s)
assless 0.05s user 0.00s system 292% cpu 0.018 total
```
*Hash 2*
小型 hashlist:
```
hashcat 0.51s user 0.27s system 55% cpu 1.409 total (8704.7 kH/s)
assless 0.03s user 0.00s system 248% cpu 0.012 total
```
Rockyou hashlist:
```
hashcat 2.20s user 0.46s system 110% cpu 2.409 total (5798.4 kH/s)
assless 0.03s user 0.00s system 231% cpu 0.015 total
```
HIBP hashlist:
```
hashcat 65.37s user 12.74s system 135% cpu 57.712 total (5768.7 kH/s)
assless 0.03s user 0.00s system 249% cpu 0.013 total
```
*Hash 3*
Hash 3 不存在于任何 hashlist 中,以模拟最坏情况下的查找性能。
小型 hashlist:
```
hashcat 0.67s user 0.34s system 66% cpu 1.526 total (7550.1 kH/s)
assless 0.02s user 0.00s system 211% cpu 0.012 total
```
Rockyou hashlist:
```
hashcat 2.71s user 0.52s system 94% cpu 3.415 total (5685.4 kH/s)
assless 0.02s user 0.01s system 181% cpu 0.014 total
```
HIBP hashlist:
```
hashcat 125.19s user 27.62s system 139% cpu 1:49.75 total (5634.9 kH/s)
assless 0.06s user 0.03s system 115% cpu 0.075 total
```
# 安装
Rust 版本需要 SQLite 3.6.8 或更新版本。
Python 版本需要 `python3`、`sqlite3` 和 `pycryptodome`。
数据库创建工具需要 python3 和 sqlite3 CLI。
# 编译
这仅适用于 Rust 版本。你需要 [cargo](https://doc.rust-lang.org/cargo/)。
安装 cargo 后,只需切换到 assless-chaps-rs 目录,并使用以下命令构建:
`cargo build --release`
生成的二进制文件将位于 `target/release/` 目录中。
# 用法
Assless 需要 challenge、response 和 NThashes 数据库。可选地,Python 版本可以使用捆绑的优化双字节查找文件。最简单的用法如下:
`./assless-chaps `
例如:
`./assless-chaps 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db`
输出应如下所示:
```
[-] Two byte lookup file not provided, will brute force instead.
[+] Found in 22636 tries: 586c
[-] Found 222 hashes ending in 586c
[+] Found hash: 8846f7eaee8fb1
[-] Found after 186 hashes.
[+] Found hash: 17ad06bdd830b7
[+] Full hash: 8846f7eaee8fb117ad06bdd830b7586c
```
最后的完整 hash `8846f7eaee8fb117ad06bdd830b7586c` 是 `password` 的 NT hash。
## 双字节查找 - 仅限 Python
我花了一些时间构建了一个包含所有 65,535 个可能双字节值的列表,并按在大量密码语料库中的普遍程度排序。此文件以 `twobytes` 形式包含在内。你可以直接将其作为第四个参数传递给 assless。
这通常可以节省几轮 DES,但不会产生巨大的速度差异。如果你正在处理许多 hash,可能会有所帮助。
`python3 assless-chaps.py 5d79b2a85966d347 556fdda5f67d2b746ca3315fd8b93adcab5c792790a92e87 rockyou.db twobytes`
```
[+] Found in 65533 tries: 586c
[-] Found 222 hashes ending in 586c
[+] Found hash: 8846f7eaee8fb1
[-] Found after 186 hashes.
[+] Found hash: 17ad06bdd830b7
[+] Full hash: 8846f7eaee8fb117ad06bdd830b7586c
```
# 创建你自己的 hash 字典
`mksqlitedb.py` 文件将协助把 CSV hash 文件转换为数据库。
`python3 mksqlitedb.py `
CSV 文件需要三列:
* hash 的最后两个字节(最后四个 ASCII 字符)
* 前 7 个字节(前 14 个 ASCII 字符)
* 第二个 7 个字节(第 15-29 个 ASCII 字符)
例如,hash `8846f7eaee8fb117ad06bdd830b7586c` 将变为:
`586c,8846f7eaee8fb1,17ad06bdd830b7`
此示例的正则表达式转换将是:
`echo 8846f7eaee8fb117ad06bdd830b7586c | sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\)$/\3,\1,\2/"`
你可以使用现有的 hash 列表(例如 [Have I Been Pwned 列表](https://haveibeenpwned.com/Passwords)),或者通过 hashcat 和你喜欢的 wordlist/rules 组合生成自己的列表。
## 使用 Have I Been Pwned
HIBP 密码列表已经可以以 NT Hash 形式下载,只需从文件中删除计数并将其转换为 CSV 格式即可导入数据库。
这可以使用标准 Unix 实用程序 `sed` 完成,如下所示:
`sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\):.*/\3,\1,\2/ pwned-passwords-ntlm-ordered-by-hash.txt" > hibp.csv`
之后可以使用 `mksqlitedb.py hibp.db hibp.csv` 导入。
## 将 wordlist 转换为 hashlist
要将普通 wordlist 转换为 nthashes 的 hashlist,你可以使用 [nthasher](https://github.com/singe/nthasher),它可以快速处理大型 wordlist。生成的 hash 需要按照上述描述转换为所需的 CSV 格式。
此仓库中包含一个更慢的 nthasher,它将直接输出所需 CSV 格式的 hash,运行非常简单:
`python3 nthash-from-clear.py > hashlist.csv`
如果你想使用规则扩展 wordlist,请参阅下一节关于使用 hashcat 的内容。
## 使用 hashcat 从 wordlist 和规则创建 hash csv 文件
你需要对 mode 1000 OpenCL 模块进行少量代码修改,使其输出每个 hash,而不仅仅是与你的破解候选匹配的 hash。默认情况下,它将以所需的正确 CSV 格式生成 hash。
* 切换到你的 hashcat `OpenCL` 目录:`cd hashcat/OpenCL`
* 应用补丁:`patch < m01000_a0-pure.cl.patch`
* 准备一个包含无法破解的 NT hash 的文件,例如 `echo 11111111111111111111111111111111 > impossible_hash`
* 像往常一样破解,但禁用你的 potfile 并将输出重定向到文件:`hashcat -m1000 impossible_hash rockyou.txt -r best64.rule --potfile-disable --quiet > rockyou.csv`
* 创建你的 hashes 数据库:`python3 mksqlitedb.py rockyou.db rockyou.csv`
## 关于磁盘空间和文件大小的说明
SQLite 数据库通常比用于创建它的 CSV 文件大 61%。根据文件的大小,创建数据库也可能需要一些时间。请相应地准备你的文件系统需求。
以下是使用 rockyou 字典的示例:
* 基础 rockyou 字典 129M
* hashcat 生成的 rockyou.csv 462M
* 生成的 SQLite 数据库 rockyou.db 746M
* BZip2 最大压缩 rockyou.db.bz2 339M
你可以通过动态转换和插入每个 hash 并跳过对中间 CSV 文件的需求来节省空间。
# NTLMv1 SSP
NTLMv1 的工作方式完全相同,除非它使用 SSP。如果你得到的 LM response 以一堆零结尾,你就知道 SSP 正在使用中。你可以使用包含的 `ntlm-ssp.py` 来生成 assless 所需的服务器挑战。
像这样运行它:
`python3 ntlm-ssp.py `
例如,如果我们使用来自 [hashcat example hashes](https://hashcat.net/wiki/doku.php?id=example_hashes) 的示例 NTLMv1-SSP 挑战响应:
`u4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:cb8086049ec4736c`
你可以像这样传入 LM 和 challenge:
`python3 ntlm-ssp.py 338d08f8e26de93300000000000000000000000000000000 cb8086049ec4736c`
并获得以下响应:
`The server challenge is: 724edf24aea0d68b`
然后可以像往常一样使用 assless-chaps 进行破解:
`./assless-chaps 724edf24aea0d68b 9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41 hashes.db`
标签:Bitdefender, Defcon, DES加密, DOS头擦除, EAP攻击, Hashcat, Hash Shucking, MSCHAPv2, NT Hash, NTLMv1, VEH, WiFi安全, WPE攻击, 反病毒测试, 可视化界面, 哈希数据库, 字典攻击, 密码破解, 彩虹表, 离线破解, 空间时间权衡, 网络安全, 逆向工具, 隐私保护