Windows 下的密码 hash——NTLM hash 和 Net-NTLM hash 介绍

发布于 2024-10-07 00:19:20 字数 11782 浏览 16 评论 0

0x00 前言

在 Windows 系统中,比较常见是从系统导出来的 NTLM hash,通过 Hashcat 能够破解出明文密码。

Hashcat 支持超过 200 种高度优化的 hash 算法,其中和 NTLM hash 相关的有 4 个,分别为 NetNTLMv1NetNTLMv1+ESSNetNTLMv2NTLM

NetNTLM 具体是什么呢?又是如何获得的呢?本文受到 byt3bl33d3r 文章的启发,下面将结合自己的心得,介绍这部分内容

学习链接:https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html

0x01 简介

  • NTLM hash 和 Net-NTLM hash 区别
  • NTLM hash 的加密方法
  • Net-NTLM hash 的破解

0x02 NTLM hash

通常是指 Windows 系统下 Security Account Manager 中保存的用户密码 hash

该 hash 的生成方法:

  1. 将明文口令转换成十六进制的格式
  2. 转换成 Unicode 格式,即在每个字节之后添加 0x00
  3. 对 Unicode 字符串作 MD4 加密,生成 32 位的十六进制数字串

实际测试:

用户密码为 test123

  • 转换成十六进制的格式为 74657374313233
  • 转换成 Unicode 格式为 7400650073007400310032003300

对字符串 7400650073007400310032003300 作 MD4 加密,结果为 c5a237b7e9d8e708d8436b6148a25fa1

注:

MD4 加密可使用工具 HashCalc,如下图

Alt text

下面使用 mimikatz 导出用户密码的 hash,对比进行验证,结果相同,验证成功,如下图

Alt text

在渗透测试中,通常可从 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)的消息交换模式,流程如下:

  1. 客户端向服务器发送一个请求,请求中包含明文的登录用户名。服务器会提前存储登录用户名和对应的密码 hash
  2. 服务器接收到请求后,生成一个 16 位的随机数(这个随机数被称为 Challenge),明文发送回客户端。使用存储的登录用户密码 hash 加密 Challenge,获得 Challenge1
  3. 客户端接收到 Challenge 后,使用登录用户的密码 hash 对 Challenge 加密,获得 Challenge2(这个结果被称为 response),将 response 发送给服务器
  4. 服务器接收客户端加密后的 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,捕获数据包,如下图

Alt text

前四个数据包对应 NTLM 认证的四个步骤

查看第二个数据包,获得 Challenge,为 c0b5429111f9c5f4 ,如下图

Alt text

查看第三个数据包,获得客户端加密后的 Challenge,为 a9134eee81ca25de ,如下图

Alt text

Response 数据为 a5f1c47844e5b3b9c6f67736a2e1916d:0101000000000000669dae86ba8bd301a9134eee81ca25de0000000002001e00570049004e002d003100550041004200430047004200470049005500330001001e00570049004e002d003100550041004200430047004200470049005500330004001e00570049004e002d003100550041004200430047004200470049005500330003001e00570049004e002d003100550041004200430047004200470049005500330007000800669dae86ba8bd30106000400020000000800300030000000000000000000000000300000e9d9e613613097d1e2f47c1fd97fa099f65dfd78075d8bdb5ca162492ea5d2990a001000000000000000000000000000000000000900260063006900660073002f003100390032002e003100360038002e00360032002e00310033003900000000000000000000000000 ,如下图

Alt text

下面,使用 Hashcat 对该 Net-NTLM hash 进行破解

NTLMv2 的格式为:username::domain:challenge:HMAC-MD5:blob

注:

challenge 为 NTLM Server Challenge,domian 由数据包内容获得(IP 或者机器名)

HMAC-MD5 对应数据包中的 NTProofStr,如下图

Alt text

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

成功破解出登录的明文密码,输出如下图

Alt text

在渗透测试中,通常有以下两种利用方法

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,如下图

Alt text

NTLMv2 hash 为 a::WIN-FVJLPTISCFE:A944CF357E0938DA:C1BB2CDD038D3AA6FA53FD360D7CBA9C:0101000000000000937115D1BC8BD301033605ACA1ACA1C00000000002001E00570049004E002D003100550041004200430047004200470049005500330001001E00570049004E002D003100550041004200430047004200470049005500330004001E00570049004E002D003100550041004200430047004200470049005500330003001E00570049004E002D003100550041004200430047004200470049005500330007000800937115D1BC8BD30106000400020000000800300030000000000000000100000000200000E9D9E613613097D1E2F47C1FD97FA099F65DFD78075D8BDB5CA162492EA5D2990A001000000000000000000000000000000000000900260063006900660073002F003100390032002E003100360038002E00360032002E00310033003900000000000000000000000000

Hashcat 参数如下:

hashcat -m 5600 a::WIN-FVJLPTISCFE:A944CF357E0938DA:C1BB2CDD038D3AA6FA53FD360D7CBA9C:0101000000000000937115D1BC8BD301033605ACA1ACA1C00000000002001E00570049004E002D003100550041004200430047004200470049005500330001001E00570049004E002D003100550041004200430047004200470049005500330004001E00570049004E002D003100550041004200430047004200470049005500330003001E00570049004E002D003100550041004200430047004200470049005500330007000800937115D1BC8BD30106000400020000000800300030000000000000000100000000200000E9D9E613613097D1E2F47C1FD97FA099F65DFD78075D8BDB5CA162492EA5D2990A001000000000000000000000000000000000000900260063006900660073002F003100390032002E003100360038002E00360032002E00310033003900000000000000000000000000 /tmp/password.list --force

成功破解出登录的明文密码,输出如下图

Alt text

2、通过多种方式强制目标客户端向伪造的服务器发起 SMB 连接,在伪造的服务器上捕获数据包,获得 Net-NTLM hash

对于 SMB 协议,客户端在连接服务端时,默认先使用本机的用户名和密码 hash 尝试登录

实际测试:

  • 客户端 IP: 192.168.62.139
  • 服务端 IP: 192.168.62.130

服务端运行 Wireshark,捕获数据包

客服端尝试连接服务器,为便于演示,通过界面操作,地址栏直接输入 \\192.168.62.130 ,弹框提示用户名密码不正确,如下图

Alt text

此时,服务端的 Wireshark 已经捕获到数据包,组装 Net-NTLMv2 hash,内容如下:

a::WIN-FVJLPTISCFE:a05179df44d8cd35:43589a30aea29cf24fbd9c01a85e4b7e:0101000000000000eb8e1d9bf08ed301ca0ea89448cceba80000000002001e00570049004e002d003100550041004200430047004200470049005500330001001e00570049004e002d003100550041004200430047004200470049005500330004001e00570049004e002d003100550041004200430047004200470049005500330003001e00570049004e002d003100550041004200430047004200470049005500330007000800eb8e1d9bf08ed30106000400020000000800300030000000000000000100000000200000e4ab58611d3ed61427fa3c7075c75897aebae420dd42b71c73886ebca92b3c3b0a001000000000000000000000000000000000000900260063006900660073002f003100390032002e003100360038002e00360032002e00310033003900000000000000000000000000

Hashcat 参数如下:

hashcat -m 5600 a::WIN-FVJLPTISCFE:a05179df44d8cd35:43589a30aea29cf24fbd9c01a85e4b7e:0101000000000000eb8e1d9bf08ed301ca0ea89448cceba80000000002001e00570049004e002d003100550041004200430047004200470049005500330001001e00570049004e002d003100550041004200430047004200470049005500330004001e00570049004e002d003100550041004200430047004200470049005500330003001e00570049004e002d003100550041004200430047004200470049005500330007000800eb8e1d9bf08ed30106000400020000000800300030000000000000000100000000200000e4ab58611d3ed61427fa3c7075c75897aebae420dd42b71c73886ebca92b3c3b0a001000000000000000000000000000000000000900260063006900660073002f003100390032002e003100360038002e00360032002e00310033003900000000000000000000000000 /tmp/password.list --force

成功破解出客户端当前用户的明文密码,输出如下图

Alt text

实际利用举例:发送钓鱼邮件,用户打开邮件时会隐蔽访问伪造的服务器,服务器通过捕获数据包就能获得目标当前用户的 Net-NTLM hash,进一步破解还原出明文密码

0x04 小结

本文介绍了 NTLM hash 和 Net-NTLM hash 的区别,实际演示 NTLM hash 的加密方法和 Net-NTLMv2 hash 的破解方法。如果破解不出明文密码,对于 NTLM hash 可使用 Pass-The-Hash 作进一步利用,那么对于 Net-NTLM hash 呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

冷情

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

小瓶盖

文章 0 评论 0

wxsp_Ukbq8xGR

文章 0 评论 0

1638627670

文章 0 评论 0

仅一夜美梦

文章 0 评论 0

夜访吸血鬼

文章 0 评论 0

近卫軍团

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文