一、前言
LM Hash和NTLM Hash是Windows系統中的兩種加密算法,不過LM Hash加密算法存在缺陷,在Windows Vista 和 Windows Server 2008開始,默認情況下只存儲NTLM Hash,LM Hash將不再存在。所以我們會著重分析NTLM Hash。
在我們內網滲透的過程中,有通過抓取Windows服務器內部的hash值登錄到域環境中的其他服務器進行橫向滲透這一方式。
Windows(登錄)的認證方式有兩種:
?
1.1、本地認證
本地認證指操作系統運行winlogon進程顯示登錄界面,接收用戶的輸入,然后將輸入的密碼交給lsass進程,這個進程執行兩個操作:①使用動態秘鑰對稱加密(mimikatz可以解密)的方式在內存中緩存一份“明文密碼”? ②將密碼轉換成NTLM Hash,然后會將NTLM Hash與本地的SAM數據庫中存儲的密碼進行比對,如果一致則通過驗證。
補充:
windows內部是不保存明文密碼的,只保存密碼的hash。其中本機用戶的密碼hash是放在 本地的SAM文件 里面,域內用戶的密碼hash是存在域控的NTDS.DIT文件 里面。
?
1.2、網絡認證
內網中的網絡環境可以分為工作組環境和域環境,它們使用的加密協議:
工作組環境:NTLM Hash(默認) ||? ?LM Hash(被淘汰)
域環境:Kerberos(默認)? ||? NTLM Hash(不滿足Kerberos條件)
所以在某些情況下,域環境中的服務器也可以使用NTLM Hash加密算法。
用戶在內網中服務器之間的登錄操作是基于這些協議加密算法來建立安全的連接的,具體的實現請看下面的解析。
?
二、SSPI&SSP
在學習NTLM協議之前,我們需先了解兩個概念:SSPI&SSP
2.1、SSPI
SSPI是Windows定義的一套接口,該接口定義了與安全有關的功能函數,如:
????????1、身份驗證機制
????????2、為其他協議提供的Session Security機制(會話安全機制),為通訊提供數據完整性校驗以及數據的加、解密功能
該接口只是定義了一套接口函數,但是并沒有實現具體的內容。
?
2.2、SSP
SSP是SSPI的具體實現,微軟自己實現了如下的SSP,用于提供安全功能,如:
????????1、NTLM SSP:為Windows 2000之前的客戶端-服務器域和非身份域驗證(SMB/CIFS)提供NTLM質詢/響應身份驗證
????????2、Kerberos SSP:Windows2000及更高版本中首選的客戶端-服務器域相互身份驗證
????????3、Digest SSP
????????4、Negotiate SSP
? ? ? ? 5、Cred SSP
? ? ? ? 6、Schannel SSP
????????......
?
三、NTLM身份認證
NTLM協議是一種網絡協議認證,采用一種質詢/應答(Challenge/Response)的信息交換模式。
認證流程:
? ? ? ? 1、協商:確定雙方協議版本、加密等級
? ? ? ? 2、質詢:質詢/應答(Challenge/Response)信息交換的過程
? ? ? ? 3、認證:驗證結果
?
3.1、質詢過程
在工作組環境下:
①:用戶通過密碼登錄客戶端電腦
②:(type 1)客戶端向服務器發送type 1(協商)消息,它主要包含客戶端支持和服務器請求的功能列表,如設備信息、密碼信息等
③:接收請求,生成Challenge。加密Challenge,生成Net-NTLM Hash
④:(type 2)服務器用type 2消息(質詢)進行響應,這包含服務器支持和同意的功能列表。但是,最重要的是,它包含服務器產生的Challenge
⑤:接收到Challenge后,使用將要登錄到賬戶對應的NTLM Hash加密Challenge生成Response
⑥:(type 3)客戶端用type 3消息(身份驗證)回復質詢。將response,username,challenge發給服務器。消息中的response是最關鍵的部分,因為它們向服務器證明客戶端用戶已經知道帳戶密碼
⑦:比對Server生成的Net-NTLM Hash與Response是否相等
⑧:驗證成功
?
3.2、數據包信息
NTLM只是底層的認證協議,其必須鑲嵌在上層應用協議里面,消息的傳輸依賴于使用NTLM的上層協議,如SMB、HTTP等。
數據包的關鍵信息如下:
協商(type1):
Negotiate Flags具體內容如下:
質詢(type2):
其中最主要的信息是challenge,如下:
?
?
認證(type3):
這里的Challenge不同于type2 的Challenge,這里的Challenge是一個隨機的客戶端nonce。
?
數據包內容如下:
可以看到type3 Response響應消息數據包中的是NTLMv2響應。那NTLMv2響應是怎樣構建出type3 Response的呢?
請看下面介紹:
?
3.3、NTLMv2響應
在type3中的響應,有六種類型的響應:
-
LM(LAN Manager)響應 - 由大多數較早的客戶端發送,這是“原始”響應類型。
-
NTLMv1響應 - 這是由基于NT的客戶端發送的,包括Windows 2000和XP。
-
NTLMv2響應 - 在Windows NT Service Pack 4中引入的一種較新的響應類型。它替換啟用了 NTLM版本2的系統上的NTLM響應。
-
LMv2響應 - 替代NTLM版本2系統上的LM響應。
-
NTLM2會話響應 - 用于在沒有NTLMv2身份驗證的情況下協商NTLM2會話安全性時,此方案會更改LM NTLM響應的語義。
-
匿名響應 - 當匿名上下文正在建立時使用; 沒有提供實際的證書,也沒有真正的身份驗證。“存 根”字段顯示在類型3消息中。
NTLMv2加密算法
Net-ntlm hash v2的格式為:
username::domain:challenge:HMAC-MD5:blob
type3中Response的構成方式:
①將Unicode后的大寫用戶名與Unicode后的身份驗證目標(在Type 3消息的"TargetName"字段中指定的域或服務器名稱)拼在一起;
②構建一個blob信息;
③使用16字節NTLMv2哈希作為密鑰,將HMAC-MD5消息認證代碼算法加密一個值(來自type 2的Challenge與Blob拼接在一起),得到一個16字節的NTProofStr;
NTLMv2 Hash = HMAC-MD5(unicode(hex((upper(UserName)+DomainName))),NTLM Hash)
NTProofStr = HMAC-MD5(challenge+blob,NTLMv2 Hash)
④將NTProofStr與Blob拼接起來形成得到response。
?
3.4、MIC
MIC是校驗和,設計MIC主要是為了防止這個包中途被修改。
計算公式:
MIC = HMAC_MD5(exportedSessionKey,NEGOTIATE_MESSAGE+CHALLENGE_MESSAGE+AUTHENTICATE_MESSAGE)
?
關于exportedSessionKey,請看下面
3.5、簽名
keyExchangeKey是使用用戶password和severChallenge經過一定運算得到
SessionKey是由keyExchangeKey和exportedSessionKey經過一定運算得到
SessionKey是在要求進行簽名的時候用的,用來進行協商加密密鑰。
首先,客戶端會生成一個隨機數exportedSessionKey,后續都是使用這個exportedSessionKey來加解密流量。由于exportedSessionKey是客戶端生成的,服務端并不知道,那么是通過什么手段進行協商的呢?
客戶端使用keyExchangeKey做為Key,RC4加密算法加密exportedSessionKey,得到我們流量中看到的SessionKey。服務端拿到流量后,使用用戶密碼和質詢值Challenge經過運算生成keyExchangeKey,然后使用SessionKey跟keyExchangeKey一起運算(解密)得到exportedSessionKey,然后使用exportedSessionKey進行加解密流量。對于攻擊者來說,由于沒有用戶的密碼,無法生成keyExchangeKey。因此,攻擊者即使在拿到流量后,也無法計算出exportedSessionKey,自然也就無法解密流量了。
?
?
?