使用NT哈希数据库快速破解MSCHAPv2/NTLMv1挑战/响应
Assless CHAPs 是一种高效恢复 MSCHAPv2/NTLMv1 交换中使用的 NT 哈希的方法,前提是你拥有挑战和响应(例如,来自 WiFi EAP WPE 攻击)。
它需要一个 NT 哈希数据库。下面提供了如何从现有列表或使用 hashcat 搭配字典和规则生成这些数据库的说明。我包含了来自 SecLists 的示例数据库。你需要对其进行 bunzip2 解压。
MSCHAPv2 交换不需要破解明文密码,我们只需要使用的 NThash。
MSCHAPv2 将 NThash 分成三部分,并将每一部分用作不同的密钥,对同一个挑战(由对等方和认证者挑战派生而来)进行 DES 加密。NThash 被分成两个 7 字节密钥和一个 2 字节密钥。这意味着最后一个密钥需要用 NULL 填充,以构成所需长度的密钥。由于 DES 操作的高效性以及密钥空间仅为 65535,可以快速进行暴力破解。一旦我们得到这两个字节,就可以在数据库中查找所有以这两个字节结尾的 NThash。这将提供一个小得多的可能哈希集合。
这是一种空间与时间的权衡,类似于彩虹表。这也是一种 哈希剥壳 的形式。
该工具首次在 Defcon 29 的 RF Hacking Village 上展示。幻灯片包含在此仓库中。
以下是三个示例挑战/响应与三个不同字典(一个小型私有字典、rockyou 和 Have I Been Pwned 列表)的对比结果。测试在 2016 款 MacBook Pro 上进行。Hashcat 使用 这个 哈希剥壳内核和两个内置 GPU,以及纯内核而非优化内核(因为后者尚不存在)。Hash3 不在这些列表中,以模拟最差性能。我不包括 hashcat 首次运行构建字典缓存的时间。
Hash1
小型哈希列表:
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 哈希列表:
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 哈希列表:
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
Hash2
小型哈希列表:
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 哈希列表:
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 哈希列表:
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
Hash3
Hash3 不在任何哈希列表中,以模拟最坏情况的查找性能。
小型哈希列表:
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 哈希列表:
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 哈希列表:
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。
安装 cargo 后,只需切换到 assless-chaps-rs 目录,并用以下命令构建:
cargo build --release
生成的二进制文件位于 target/release/ 目录中。
Assless 需要挑战、响应和 NThash 数据库。可选地,Python 版本可以使用附带的优化双字节查找文件。最简单的用法如下所示:
./assless-chaps <Challenge> <Response> <hashes.db>
例如:
./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
最终完整的哈希 8846f7eaee8fb117ad06bdd830b7586c 是 password 的 NT 哈希。
我曾花时间构建了一个包含所有 65535 个可能双字节值的列表,按在大型密码语料库中的出现频率排序。此文件作为 twobytes 包含在内。你可以将其作为第四个参数传递给 assless。
这通常可以节省几轮 DES,但速度提升不大。如果你要处理大量哈希,可能会更有用。
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
mksqlitedb.py 文件将帮助将 CSV 哈希文件转换为数据库。
python3 mksqlitedb.py <数据库名称> <CSV文件>
CSV 文件需要三列:
例如,哈希 8846f7eaee8fb117ad06bdd830b7586c 将变为:
586c,8846f7eaee8fb1,17ad06bdd830b7
一个示例正则表达式转换如下:
echo 8846f7eaee8fb117ad06bdd830b7586c | sed "s/^\(.\{14\}\)\(.\{14\}\)\(.\{4\}\)$/\3,\1,\2/"
你可以使用现有的哈希列表(例如 Have I Been Pwned 列表)或使用 hashcat 和你喜欢的字典/规则组合自己生成。
HIBP 密码列表已经以 NT 哈希形式提供,只需从文件中移除计数并将其转换为 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 导入。
要将纯文本字典转换为 nthashes 的哈希列表,你可以使用 nthasher,它能够快速处理大型字典。生成的哈希需要按照上述方法转换为所需的 CSV 格式。
本仓库中包含一个更慢的 nthasher,它可以直接输出所需 CSV 格式的哈希,简单运行:
python3 nthash-from-clear.py <字典文件> > hashlist.csv
如果你想通过规则扩展字典,请参阅下一节关于使用 hashcat 的内容。
你需要对 mode 1000 的 OpenCL 模块做一个小代码修改,使其输出所有哈希,而不仅仅是匹配破解候选的哈希。默认情况下,它将以所需 CSV 格式生成哈希。
OpenCL 目录:cd hashcat/OpenCLpatch < m01000_a0-pure.cl.patchecho 11111111111111111111111111111111 > impossible_hashhashcat -m1000 impossible_hash rockyou.txt -r best64.rule --potfile-disable --quiet > rockyou.csvpython3 mksqlitedb.py rockyou.db rockyou.csvSQLite 数据库通常比用于创建它的 CSV 文件大 61%。根据文件大小,创建数据库也可能需要一些时间。请相应地准备你的文件系统需求。
以下是一个使用 rockyou 字典的示例:
你可以通过动态转换和插入每个哈希来节省空间,从而避免中间 CSV 文件。
NTLMv1 将以完全相同的方式工作,除非它使用了 SSP。如果 LM 响应以一堆零结尾,你就知道使用了 SSP。你可以使用包含的 ntlm-ssp.py 来生成 assless 所需的服务器挑战。
像这样运行:
python3 ntlm-ssp.py <LM响应> <挑战>
例如,如果我们使用来自 hashcat 示例哈希 的 NTLMv1-SSP 挑战响应:
u4-netntlm::kNS:338d08f8e26de93300000000000000000000000000000000:9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41:cb8086049ec4736c
你可以像这样传递 LM 和挑战:
python3 ntlm-ssp.py 338d08f8e26de93300000000000000000000000000000000 cb8086049ec4736c
并获得以下响应:
The server challenge is: 724edf24aea0d68b
然后可以像往常一样使用 assless-chaps 破解:
./assless-chaps 724edf24aea0d68b 9526fb8c23a90751cdd619b6cea564742e1e4bf33006ba41 hashes.db