微软从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-NTLMv1和Net-NTLMv2。
通常如果使用Ntlm relay的话是需要Net-NTLM Hash的,这类Hash并不能直接用来Pth,但是如果版本较低可以通过暴力破解来获取明文密码。而Net-NTLM Hash也就是NTLM认证的第二个包中Response字段的值
默认情况下,客户端和服务器之间的所有 SMB 流量都未签名,但是在域控中签名是默认开启的,所以我们是不能对域控进行中继。签名作用是确保内容在发送和接受之间没有被篡改。
普通计算机中数字签名默认关闭
在请求的数据包中,如果该标志为0时,则表示客户端不支持签名
域控中数字签名默认开启
在请求的数据包中,如果该标志为1时,则表示客户端支持签名,这是在向域控请求时获得的数据包
当我们向域控发送请求后,我们是支持签名的但是不需要签名
域控返回给我的包是它支持签名,而且还需要签名
都支持签名
只要是支持NTLM SSP的协议,都可以Relay过去,那么如果所有协议都集成的NTLM,那么就会变得很乱,微软提供了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字段的值,而blob为Response去掉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-ntlmv2的Hash。
NetBIOS(网络基本输入/输出系统)是一种网络服务,它使不同计算机上的应用程序能够通过局域网相互通信,NetBIOS也就是我们的计算机名,我们通过计算机名可以找到对应的IP,在windows中默认在安装TCP/IP时会自动安装。
攻击者:192.168.192.135
目标server:192.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用户去执行操作。
推荐阅读
查看更多精彩内容,还请关注橘猫学安全:
每日坚持学习与分享,觉得文章对你有帮助可在底部给点个“再看”