中间商之 Ntlm Relay 攻击分析
2022-8-13 00:3:14 Author: 橘猫学安全(查看原文) 阅读量:23 收藏

微软从windows server 2003以后微软禁用了LM hash,使用NT hash进行代替,所以就先不去看LM hash了。因为NT hash使用的NTLM协议,所以大家都将NT hash错误地称为NTLM hash。其实应该称为NT hash。

通常NT hash存放在计算机的Sam文件中。如果在域内则存放在NTDS数据库中,这类Hash可以直接用于PTH,并且这类Hash会在Lsass进程中缓存,便于Ssp使用。

Net-NTLM Hash用于网络身份认证,分为两个版本,Net-NTLMv1Net-NTLMv2

通常如果使用Ntlm relay的话是需要Net-NTLM Hash的,这类Hash并不能直接用来Pth,但是如果版本较低可以通过暴力破解来获取明文密码。而Net-NTLM Hash也就是NTLM认证的第二个包中Response字段的值

默认情况下,客户端和服务器之间的所有 SMB 流量都未签名,但是在域控中签名是默认开启的,所以我们是不能对域控进行中继。签名作用是确保内容在发送和接受之间没有被篡改。

普通计算机中数字签名默认关闭

在请求的数据包中,如果该标志为0时,则表示客户端不支持签名

域控中数字签名默认开启

在请求的数据包中,如果该标志为1时,则表示客户端支持签名,这是在向域控请求时获得的数据包

当我们向域控发送请求后,我们是支持签名的但是不需要签名

域控返回给我的包是它支持签名,而且还需要签名

都支持签名

只要是支持NTLM SSP的协议,都可以Relay过去,那么如果所有协议都集成的NTLM,那么就会变得很乱,微软提供了SSPI可以处理身份验证的接口并处理不同的验证请求。

SSP&SSPI

SSP全称Security Support Provider,主要用于系统的认身份证,但是身份验证实现的机制不一样,其实SSP就是一个DLL文件。

SSPI全称Security Support Provider Interface,是微软提供的标准化身份验证接口,不同的包连接到这个接口来处理不同的认证请求,SSPI是windows在认证操作中所使用的API,也就是SSPI是SSP的API接口。

可以看到smb认证中使用的NTLMSSP, 是微软用来NTLM challenge-response身份验证

当前机器:192.168.192.135

目标机器:192.168.192.134

首先向目标服务发送我们的信息

目标服务接收到请求后,会返回给我们一个challenge,这个challenge是用来加密然后验证的

然后我们将需要登录账号对应的NT hash加密challenge得到Response,并将用户名以及域名和刚才得到的Response一起发送给目标服务

之后目标服务会在自己的sam文件中查找对应的用户名,如果找到,则通过找到的nt hash进行加密challenge,之后将发过来的结果进行对比,成功则允许访问,失败则不允许访问。

Net-NTLMv1几乎不用了,从server2008开始,微软默认使用Net-NTLMv2,所以Net-NTLMv1不去详细看,Net-NTLMv2格式为:

username::domain:challenge:HMAC-MD5:blob

其中HMAC-MD5的值为NTProofstr字段的值,而blobResponse去掉NTProofstr字段值之后的值

我们可以使用得到的值去使用hashcat进行爆破,但Net-NTLMv2 hash一般爆破不出来,需要强大的字典才可以。

admin::wjlab3: 285f6f947321b8e0:be06d69174d34cd95abf9fb6e8c63c8e:0101000000000000e5ebb2166b1ed801686671564b574e50000000000100160057004a004c004100420033002d00570049004e00370002000c0057004a004c0041004200330003002c0077006a006c006100620033002d00770069006e0037002e0077006a006c006100620033002e0063006f006d000400140077006a006c006100620033002e0063006f006d000500140077006a006c006100620033002e0063006f006d0007000800e5ebb2166b1ed8010900200063006900660073002f0057004a004c004100420033002d00570049004e0037000000000000000000

1、 首先client告诉server想要进行身份验证

2、 Server在本地生成一个16位随机数的challenge,并使用client的密码hash对challenge进行加密。

3、 Client收到challenge后,用当前账号的密码hash对challenge进行加密,之后发送给server,server将自己加密的内容与client发送的内容进行对比,相同则验证成功,不相同则失败。

首先我们要知道LLMNR是做什么用的,而且在什么情况下会触发。

LLMNR全称为Link-Local Multicast Name Resolution是一种基于DNS数据包格式的协议,也就是与DNS协议类似,同一网络中的某主机可以通过此协议去查询其他主机。

A向B发送请求时首先A会在本地的hosts文件中查找,如果没有找到的话会向DNS服务器中查找,如果还没有则会通过LLMNR协议NetBIOS协议向局域网中发送广播询问。

能够触发LLMNR的主要是smb请求,或者基于数据链路层的请求基本都会触发。

使用smb请求

获取的LLMNR数据包

使用Responder脚本进行监听

再发送请求后运行Responder的机器会响应当前机器,并获取到当前机器的Net-ntlmv2Hash。

NetBIOS(网络基本输入/输出系统)是一种网络服务,它使不同计算机上的应用程序能够通过局域网相互通信NetBIOS也就是我们的计算机名,我们通过计算机名可以找到对应的IP,在windows中默认在安装TCP/IP时会自动安装。

流程

攻击者:192.168.192.135

目标server192.168.192.134

client控高权限):192.168.192.133

在攻击机上使用impacket中的ntlmrelayx.py脚本监听并转发到目标机(192.168.192.134)

在已拿到高权限client上发一个smb请求

之后我们就可以获取到目标server (192.168.192.134)上用户的hash

原理

我们可以看到client (192.168.192.133)和目标server (192.168.192.134)进行通信中间都经过了我们的攻击者(192.168.192.135)这台计算机。红色标注出来的地方为攻击者与目标server进行交互的地方。

目标server将challenge发送给攻击者,攻击者又将目标发送的challenge转发给了高权限主机(192.168.192.133)

攻击者收到的challenge为:175a855d4466e8e6

转发给client (192.168.192.133) challenge为:175a855d4466e8e6

然后client使用自己的hash加密challenge生成Response,并将生成的Response和用户名、主机名等信息发送给攻击者(192.168.192.135)

然后攻击者将得到的包发送给目标server,由于包里的admin用户为高权限用户,则攻击者就可以代表admin用户去执行操作。

推荐阅读

实战|记一次奇妙的文件上传getshell

「 超详细 | 分享 」手把手教你如何进行内网渗透

神兵利器 | siusiu-渗透工具管理套件

一款功能全面的XSS扫描器

实战 | 一次利用哥斯拉马绕过宝塔waf

BurpCrypto: 万能网站密码爆破测试工具

快速筛选真实IP并整理为C段 -- 棱眼

自动探测端口顺便爆破工具t14m4t

渗透工具|无状态子域名爆破工具(1秒扫160万个子域)

查看更多精彩内容,还请关注橘猫学安全:

每日坚持学习与分享,觉得文章对你有帮助可在底部给点个“再看


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5OTY2NjUxMw==&mid=2247496354&idx=3&sn=4c448c25cee0ab2f1b434f5d88c49569&chksm=c04d759cf73afc8a5e5df0d5da83e383c74ca1c3649153c4b59d72ad597b8b5dee3482856985#rd
如有侵权请联系:admin#unsafe.sh