此工具将 NTLMv1 哈希还原为 NTLM,更具体地说,它将 NTLMv1 挑战响应格式化为可以使用 hashcat 模式 14000 破解的格式。
如果你指定 --ct3,它会为你计算 NTLM 的最后 4 位数字;如果你指定 --json,则隐式启用 --ct3,并会以 pt3 元素的形式返回,例如:
python3 ntlmv1.py --ntlm "DC1$::MOG:AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E:AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E:1122334455667788" --json
{"ntlmv1": "DC1$::MOG:AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E:AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E:1122334455667788", "user": "DC1$", "domain": "MOG", "challenge": "1122334455667788", "lmresp": "AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E", "ntresp": "AC51EC464A91A35A04A862DA3106EC2B352661ECEF909C5E", "ct3": "352661ECEF909C5E", "ct3_crack": "ct3_to_ntlm.bin 352661ECEF909C5E 1122334455667788", "pt3": "8c71", "hash1": "AC51EC464A91A35A:1122334455667788", "hash2": "04A862DA3106EC2B:1122334455667788"}
最后,在此更新中,我将函数移入了 main(),这样你就可以直接导入该模块使用。
我新增了两个选项:--hashcat 和 --hcutils,它们分别设置你的 hashcat 和 hashcat-utils 路径,这样你可以直接从工具中复制粘贴使用。
如果你的 hashcat 目录位于 ~/git/hashcat,hashcat-utils 目录位于 ~/git/hashcat-utils,你可以这样运行该工具:
python3 ./ntlmv1.py --ntlm "SERVER1$::MOG:9DE7F41D81C1207400000000000000000000000000000000:DE766A98B60D1C911DCFFFDBB3E521314B2CE34EAB63CC7B:1122334455667788" --hashcat "~/git/hashcat" --hcutils "~/git/hashcat-utils"
是的,这应该是兼容 Python 3 的,我还合并了 ntlmv1 和 ntlmv1-ess。
NTLMv1 多功能工具
此工具修改 NTLMv1/NTLMv1-ESS/MSCHAPv2 哈希,使其可以通过 hashcat 中的 DES 模式 14000 进行破解。
此工具基于 Hashcat 团队 atom 的工作 https://hashcat.net/forum/thread-5832.html
同时也基于 https://hashcat.net/forum/thread-5912.html 和 https://www.youtube.com/watch?v=LIHACAct2vo
使用 uv 将 ntlmv1_nextgen.py 下一代工具安装为全局 ntlmv1-multi 命令:
uv tool install .
ntlmv1-multi --ntlmv1 "hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788"
或者不安装,直接从仓库运行:
uv run ntlmv1_nextgen.py --ntlmv1 "hashcat::DUSTIN-5AA37877:..."
该项目附带 pyproject.toml(要求 Python 3.14+,依赖 pycryptodome),因此 uv 会为你解析所有依赖;原始 ntlmv1.py 仍可在任何 Python 3 解释器下独立运行。
ntlmv1_nextgen.py)ntlmv1_nextgen.py(安装为 ntlmv1-multi 命令)是现代解析器。它接受 NTLMv1、$99$ blob 和 MSCHAPv2,自动处理 ESS,并且可以从已破解的 potfile 一步完成完整的 NTLMv1 -> NTLM 转换。可用选项:
要捕获,请使用带 --lm 标志的 responder;如果不使用 --lm,将启用 ESS,这会导致破解时间更长。另外还有一个新标志 --disable-ess,它会尝试禁用 ESS 并强制降级。请先尝试 --disable-ess,如果失败,请尝试 --lm。如果使用 --disable-ess 或 --lm,请确保你的客户端挑战值为 1122334455667788 以使用 FPGA,但这可能会触发一些网络 IDS/IPS 防护,如果它们检测到该流量。
捕获结果如下所示。
[SMB] NTLMv1 Client : 184.64.60.62
[SMB] NTLMv1 Username : DUSTIN-5AA37877\hashcat
[SMB] NTLMv1 Hash : hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
[*] Skipping previously captured hash for DUSTIN-5AA37877\hashcat
哈希部分如下所示:
hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
因此像这样使用多工具(它同样兼容 Python 2):
python3 ntlmv1.py --ntlmv1 hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788
它将输出以下数据,而不会修改服务器挑战等内容:
['hashcat', '', 'DUSTIN-5AA37877', '76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D', '727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595', '1122334455667788']
Hostname: DUSTIN-5AA37877
Username: hashcat
Challenge: 1122334455667788
LM Response: 76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D
NT Response: 727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595
CT1: 727B4E35F947129E
CT2: A52B9CDEDAE86934
CT3: BB23EF89F50FC595
To Calculate final 4 characters of NTLM hash use:
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
To crack with hashcat create a file with the following contents:
727B4E35F947129E:1122334455667788
A52B9CDEDAE86934:1122334455667788
To crack with hashcat:
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
本例中使用的密码是 "password",我们可以用以下命令验证 NTLM 哈希:
echo -n password | iconv -f utf8 -t utf16le | openssl dgst -md4
(stdin)= 8846f7eaee8fb117ad06bdd830b7586c
借助 atom 编写的 hashcat utils 中的 ct3_to_ntlm.bin,你可以根据工具输出的 NTLMv1 挑战计算出 NTLM 哈希的最后 4 个字符:
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
586c
这与 NTLM 哈希的末尾一致,因此我们可以继续。下一步是使用 hashcat 破解哈希,所以我们需要创建一个 hashes.txt 文件,内容如下:
727B4E35F947129E:1122334455667788
A52B9CDEDAE86934:1122334455667788
要使用 hashcat 破解此文件,请使用:
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
一个重要的注意事项:hashcat 返回的是 DES 密钥,而不是 NTLM 密钥。你需要使用 Hashcat Utils 中的 deskey_to_ntlm.pl 转换为 NTLM,可以通过以下命令完成:
./deskey_to_ntlm.pl [cracked des key 1]
./deskey_to_ntlm.pl [cracked des key 2]
然后你将两个 NTLM 密钥与密码的第三部分组合起来。第三部分通过以下命令计算(即工具输出的内容):
./ct3_to_ntlm.bin BB23EF89F50FC595 1122334455667788
将这 3 个部分组合在一起,就可以得到完整的 NTLM 哈希了。
如果你只是在测试我的代码,并且已经知道密码,可以使用 DES 转换器:
python ntlm-to-des.py --ntlm b4b9b02e6f09a9bd760f388b67351e2b
DESKEY1: b55d6d04e67926
DESKEY2: bcba83e6895b9d
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
基本上你需要执行以下操作:
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
./hashcat -m 14000 -a 0 hashes.txt des.cand
然后你应该能得到一些反转后的哈希。
ESS 会改变服务器挑战。如果你在 responder 中看到 ESS,是因为你没有使用 --lm,或者客户端被设置为不发出 LM 响应,此时 ESS 会被启用。另外,--disable-ess 会尝试强制关闭 ESS,但这需要较新版本(2021 年 8 月或更新)的 impacket 和 responder。
ESS 输出如下所示:
[SMB] NTLMv1-SSP Client : 184.64.60.62
[SMB] NTLMv1-SSP Username : DUSTIN-5AA37877\hashcat
[SMB] NTLMv1-SSP Hash : hashcat::DUSTIN-5AA37877:85D5BC2CE95161CD00000000000000000000000000000000:892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0:1122334455667788
实际的哈希如下所示:
hashcat::DUSTIN-5AA37877:85D5BC2CE95161CD00000000000000000000000000000000:892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0:1122334455667788
要使用该工具,请运行(它兼容 python3):
python3 ntlmv1.py --ntlmv1 "hashcat::DUSTIN-5AA37877:85D5BC2CE95161CD00000000000000000000000000000000:892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0:1122334455667788"
该工具将输出:
Hashfield Split:
['hashcat', '', 'DUSTIN-5AA37877', '85D5BC2CE95161CD00000000000000000000000000000000', '892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0', '1122334455667788']
Hostname: DUSTIN-5AA37877
Username: hashcat
LM Response: 85D5BC2CE95161CD00000000000000000000000000000000
NT Response: 892F905962F76D323837F613F88DE27C2BBD6C9ABCD021D0
Client Challenge: 1122334455667788
SRV Challenge: b36d2b9a8607ea77
To Calculate final 4 characters of NTLM hash use:
./ct3_to_ntlm.bin 2BBD6C9ABCD021D0 1122334455667788 85D5BC2CE95161CD00000000000000000000000000000000
To crack with hashcat create a file with the following contents:
892F905962F76D32:b36d2b9a8607ea77
3837F613F88DE27C:b36d2b9a8607ea77
To crack with hashcat:
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
现在,本例中我们使用的密码是 password,其 NTLM 哈希为 b4b9b02e6f09a9bd760f388b67351e2b
echo -n password | iconv -f utf8 -t utf16le | openssl dgst -md4
(stdin)= 8846f7eaee8fb117ad06bdd830b7586c
因此,为了计算我们的 NTLMv1-ESS 挑战对应的 NTLM 哈希的最后 4 个字符,我们使用工具输出中的以下命令来获取 586c
./ct3_to_ntlm.bin 2BBD6C9ABCD021D0 1122334455667788 85D5BC2CE95161CD00000000000000000000000000000000
根据工具提示,我们必须创建一个包含以下内容的哈希文件,其中包含了处理 ESS 所需的修改后的 SRV 挑战:
892F905962F76D32:b36d2b9a8607ea77
3837F613F88DE27C:b36d2b9a8607ea77
根据工具提示,我们使用以下命令通过 hashcat 破解:
./hashcat -m 14000 -a 3 -1 charsets/DES_full.charset --hex-charset hashes.txt ?1?1?1?1?1?1?1?1
一个重要的注意事项:hashcat 返回的是 DES 密钥,而不是 NTLM 密钥。你需要使用 Hashcat Utils 中的 deskey_to_ntlm.pl 转换为 NTLM,可以通过以下命令完成:
./deskey_to_ntlm.pl [cracked des key 1]
./deskey_to_ntlm.pl [cracked des key 2]
现在,假设我们事先已经知道了该场景中的 NTLM 哈希(因为它是我们生成的),并且想要验证工具,我们使用以下命令:
python ntlm-to-des.py --ntlm b4b9b02e6f09a9bd760f388b67351e2b
这将为我们输出一些数据:
DESKEY1: b55d6d04e67926
DESKEY2: bcba83e6895b9d
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
这里重要的部分是:
echo "$HEX[b55d6d04e67926]">>des.cand
echo "$HEX[bcba83e6895b9d]">>des.cand
现在我们可以使用以下命令通过 hashcat 进行破解,而无需等待 8 天:
./hashcat -m 14000 -a 0 hashes.txt des.cand
python ntlm-to-des.py --ntlm 8846f7eaee8fb117ad06bdd830b7586c
DESKEY1: b55d6d05e6792652
DESKEY2: bdba82e6895a9d6a
echo "$HEX[b55d6d05e6792652]">>des.cand
echo "$HEX[bdba82e6895a9d6a]">>des.cand
该工具现在支持 JSON 输出,设置 --json 标志后,它将输出 JSON 格式的结果:
python3 ntlmv1.py --ntlmv1 "SERVER1$::MOG:7EF3F506F5EA510E00000000000000000000000000000000:1217169BD7BE0270A033899BD440016D3E6DACAF5894D504:ff81dfd6b12c269d" --json
{"ntlmv1": "SERVER1$::MOG:7EF3F506F5EA510E00000000000000000000000000000000:1217169BD7BE0270A033899BD440016D3E6DACAF5894D504:ff81dfd6b12c269d", "user": "SERVER1$", "domain": "MOG", "challenge": "ff81dfd6b12c269d", "lmresp": "7EF3F506F5EA510E00000000000000000000000000000000", "ntresp": "1217169BD7BE0270A033899BD440016D3E6DACAF5894D504", "ct3": "3E6DACAF5894D504", "srvchallenge": "888f8ee0fa031808", "ct3_crack": "ct3_to_ntlm.bin 3E6DACAF5894D504 ff81dfd6b12c269d 7EF3F506F5EA510E00000000000000000000000000000000", "hash1": "1217169BD7BE0270:888f8ee0fa031808", "hash2": "A033899BD440016D:888f8ee0fa031808", "CRACK_SH": "$NETLM$888f8ee0fa031808$1217169BD7BE0270A033899BD440016D3E6DACAF5894D504"}
重要字段如下:
使用 hashcat 破解 mode 14000 DES 哈希后,破解出的 DES 密钥会以 ct:challenge:key 行的形式写入你的 potfile(由于是原始字节,密钥通常以 $HEX[...] 形式存储)。无需手动通过 --key1/--key2 将密钥复制回去,只需让 ntlmv1_nextgen.py 指向 potfile,它将恢复密钥、对照密文进行验证,并一步完成完整的 NTLMv1 -> NTLM 转换:
python3 ntlmv1_nextgen.py --ntlmv1 "hashcat::DUSTIN-5AA37877:76365E2D142B5612980C67D057EB9EFEEE5EF6EB6FF6E04D:727B4E35F947129EA52B9CDEDAE86934BB23EF89F50FC595:1122334455667788" --potfile ~/.local/share/hashcat/hashcat.potfile
恢复出的 NTLM 哈希将以 NTLM 字段输出(在 --json 中为 ntlm)。--potfile 可与 --ntlmv1、--99 和 --mschapv2 配合使用,能处理 ESS 哈希(根据 MD5 派生的挑战进行匹配),并忽略无关的 potfile 条目。显式指定的 --key1/--key2 仍优先于 potfile 匹配结果。
hashcat 和 rainbowcrackalack 的 potfile 均可接受。破解出的密钥字段可以是 hashcat $HEX[...] blob、裸的可打印字节、裸的 16 位十六进制 8 字节密钥,或裸的 14 位十六进制 7 字节密钥(rainbowcrackalack 输出的形式)——所有这些在使用前都会进行规范化并对照密文重新验证。
本仓库基于 hashcat 作者 atom 的论坛帖子以及 moxie marlinspike 的研究。由于 atom 的代码主要采用 MIT 许可证,本项目也采用该许可证以保持兼容。本项目不使用 GPL,以便任何实体都可以无限制地将其整合到商业项目中。
| Option | Description |
|---|
--ntlmv1 <hash> | Responder 格式的 NTLMv1 哈希(user::host:LM:NT:challenge)。 |
--99 <blob> | $99$ 风格的 base64 blob。 |
--mschapv2 <hash> | John the Ripper 格式的 MSCHAPv2 哈希。 |
--nthash <hex> | 32 字符 NTLM 哈希;由此推导 DES 密钥和 hashcat 候选值。 |
--password <pw> | 从已知密码推导 --key1/--key2 DES 密钥。 |
--key1 <hex> / --key2 <hex> | 直接提供 CT1/CT2 的 16 位十六进制 DES 密钥(优先于 --potfile)。 |
--potfile <path> | 已破解 mode 14000 密钥的 hashcat/rainbowcrackalack potfile;自动恢复 key1/key2 以完成 NTLMv1 -> NTLM 转换。 |
--hashcat | 输出 CT1/CT2 的 hashcat 格式字符串。 |
--json | 仅输出 JSON(隐式启用 CT3 计算)。 |