域滲透基礎的兩個認證協議ntlm和Kerberos協議是必須總結的~ 這篇簡單總結下ntlm協議 晚上寫下kerberos
0x01 NTLM簡介
NTLM使用在Windows NT和Windows 2000 Server(or later)工作組環境中(Kerberos用在域模式下)。在AD域環境中,如果需要認證Windows NT系統,也必須采用NTLM。較之Kerberos,基於NTLM的認證過程要簡單很多。NTLM采用一種質詢/應答(Challenge/Response)消息交換模式。
NTLM協議的認證, 包括 NTLMv1 和 NTLMv2 兩個版本。 涉及到NTLM的認證全過程,以及NTLM 的 EPA(Extended Protection for Authentication)實現。
在本地登錄Windows的情況下,操作系統會使用用戶輸入的密碼作為憑證去與系統中的密碼進行驗證,操作系統中的密碼存儲在
%SystemRoot%\system32\config\sam
當我們登錄系統的時候,系統會自動地讀取SAM文件中的“密碼”與我們輸入的“密碼”進行比對,如果相同,證明認證成功。
這個SAM文件中保留了計算機本地所有用戶的憑證信息,可以理解為是一個數據庫。
Windows本身不保存明文密碼,只保留密碼的Hash。
ntlm認證大致流程:
winlogon.exe -> 接收用戶輸入 -> lsass.exe -> (認證)
關於NTLM Hash與NTLM
在Windows中,密碼Hash目前稱之為NTLM Hash,其中NTLM全稱是:“NT LAN Manager”。
這個NTLM是一種網絡認證協議,與NTLM Hash的關系就是:NTLM網絡認證協議是以NTLM Hash作為根本憑證進行認證的協議。
在本地認證的過程中,其實就是將用戶輸入的密碼轉換為NTLM Hash與SAM中的NTLM Hash進行比較。
NTLM Hash的產生
假設我的密碼是admin,那么操作系統會將admin轉換為十六進制,經過Unicode轉換后,再調用MD4加密算法加密,這個加密結果的十六進制就是NTLM Hash
admin -> hex(16進制編碼) = 61646d696e 61646d696e -> Unicode = 610064006d0069006e00 610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634
首先,用戶注銷、重啟、鎖屏后,操作系統會讓winlogon顯示登錄界面,也就是輸入框,接收輸入后,將密碼交給lsass進程,這個進程中會存一份明文密碼,將明文密碼加密成NTLM Hash,對SAM數據庫比較認證。
-
Windows Logon Process(即 winlogon.exe),是Windows NT 用戶登 陸程序,用於管理用戶登錄和退出。
-
LSASS用於微軟Windows系統的安全機 制。它用於本地安全和登陸策略。
NTLM(V1/V2)的hash是存放在安全賬戶管理(SAM)數據庫以及域控的NTDS.dit數據庫中,獲取該Hash值可以直接進行PtH攻擊。
Net-NTLM(V1/V2)的hash值是基於用戶的NT的hash值經過一定的算法產生的。
#NTLM-Hash aad3b435b51404eeaad3b435b51404ee:e19ccf75ee54e06b06a5907af13cef42 前面是LMhash后面是NT的Hash #Net-NTLM-Hash admin::N46iSNekpT:08ca45b7d7ea58ee:88dcbe4446168966a153a0064958dac6:5c7830315c7830310000000000000b45c67103d07d7b95acd12ffa11230e0000000052920b85f78d013c31cdb3b92f5d765c783030
0x02 LM Hash && NTLM Hash加密算法
常見Hash算法:
(1)MD4
MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年設計的,MD是 Message Digest的縮寫。它適用在32位字長的處理器上用高速軟件實現,它是基於 32 位操作數的位操作來實現的。
(2) MD5
MD5(RFC 1321)是 Rivest於1991年對MD4的改進版本。它仍以512位分組來輸入,其輸出是4個32位字的級聯,與 MD4 相同。MD5比MD4來得復雜,並且速度較之要慢一點,但更安全,在抗分析和抗差分方面表現更好
(3)SHA1 及其他
SHA1是由NIST NSA設計為同DSA一起使用的,它對長度小於264的輸入,產生長度為160bit的散列值,因此抗窮舉(brute-force)性更好。SHA-1 設計時基於和MD4相同原理,並且模仿了該算法。
Windows系統下的hash密碼格式
Windows系統下的hash密碼格式為:用戶名稱:SID:LM-HASH值:NT-HASH值,例如:
Administrator:500:C8825DB10F2590EAAAD3B435B51404EE:683020925C5D8569C23AA724774CE6CC:::
表示
用戶名稱為:Administrator
SID為:500
LM-HASH值為:C8825DB10F2590EAAAD3B435B51404EE
NT-HASH值為:683020925C5D8569C23AA724774CE6CC
(1)Windows下LM Hash值生成原理
假設明文口令是“Welcome”,首先全部轉換成大寫“WELCOME”,再做將口令字符串大寫轉后后的字符串變換成二進制串: “WELCOME” -> 57454C434F4D4500000000000000
技巧:可以將明文口令復制到UltraEdit編輯器中使用二進制方式查看即可獲取口令的二進制串。
說明:如果明文口令經過大寫變換后的二進制字符串不足14字節,則需要在其后添加0x00補足14字節。然后切割成兩組7字節的數據,分別經str_to_key()函數處理得到兩組8字節數據:
57454C434F4D45 -str_to_key()-> 56A25288347A348A 00000000000000 -str_to_key()-> 0000000000000000
這兩組8字節數據將做為DESKEY對魔術字符串“KGS!@#$%”進行標准DES加密
"KGS!@#$%" -> 4B47532140232425
56A25288347A348A -對4B47532140232425進行標准DES加密-> C23413A8A1E7665F
0000000000000000 -對4B47532140232425進行標准DES加密-> AAD3B435B51404EE
將加密后的這兩組數據簡單拼接,就得到了最后的LM Hash
LM Hash: C23413A8A1E7665FAAD3B435B51404EE
如果不足7位
-
由於我們的密碼不超過7字節,所以后面的一半是固定的:
-
AA-D3-B4-35-B5-14-04-EE
並且根據LM Hash特征,也能夠判斷用戶的密碼是否是大於等於7位。
PS:可以看到LM Hash加密是對固定字符串“KGS!@#$%”進行DES加密(對稱加密),這也是可以破解的本質原因。
(2) Windows下NTLM Hash生成原理
假設明文口令是“123456”,首先轉換成Unicode字符串,與LM Hash算法不同,這次不需要添加0x00補足14字節
"123456" -> 310032003300340035003600
從ASCII串轉換成Unicode串時,使用little-endian序,微軟在設計整個SMB協議時就沒考慮過big-endian序,ntoh*()、hton*()函數不宜用在SMB報文解碼中。0x80之前的標准ASCII碼轉換成Unicode碼,就是簡單地從0x??變成0x00??。此類標准ASCII串按little-endian序轉換成Unicode串,就是簡單地在原有每個字節之后添加0x00。對所獲取的Unicode串進行標准MD4單向哈希,無論數據源有多少字節,MD4固定產生128-bit的哈希值,
16字節310032003300340035003600 -進行標准MD4單向哈希-> 32ED87BDB5FDC5E9CBA88547376818D4
就得到了最后的NTLM Hash
NTLM Hash: 32ED87BDB5FDC5E9CBA88547376818D4
與LM Hash算法相比,明文口令大小寫敏感,無法根據NTLM Hash判斷原始明文口令是否小於8字節,擺脫了魔術字符串"KGS!@#$%"。MD4是真正的單向哈希函數,窮舉作為數據源出現的明文,難度較大。
NTLM V2協議
NTLM v1與NTLM v2最顯著的區別就是Challenge與加密算法不同,共同點就是加密的原料都是NTLM Hash。
下面細說一下有什么不同:
-
Challage:NTLM v1的Challenge有8位,NTLM v2的Challenge為16位。
-
Net-NTLM Hash:NTLM v1的主要加密算法是DES,NTLM v2的主要加密算法是HMAC-MD5。
0x03 NTLM詳細流程
NTLM 協議
NTLM是一種網絡認證協議,它是基於挑戰(Chalenge)/響應(Response)認證機制的一種認證模式。
這個協議只支持Windows
Chalenge/Response
NTLM協議的認證過程分為三步:
-
協商
-
質詢
-
驗證
協商:主要用於確認雙方協議版本
質詢:就是挑戰(Chalenge)/響應(Response)認證機制起作用的范疇。
驗證:驗證主要是在質詢完成后,驗證結果,是認證的最后一步。
質詢的完整過程:
-
1.客戶端向服務器端發送用戶信息(用戶名)請求
-
2.服務器接受到請求,判斷本地賬戶列 表是否有用戶名,如果有,生成一個16位的隨機數,被稱之為“Challenge”, 使用登錄用戶名對應的NTLM Hash加密Challenge(16位隨機字符), 生成Challenge1。生成一 個Net-NTLM Hash存在內存中,同時,生成Challenge1后,將Challenge(16位隨機 字符)發送給客戶端。
-
3.客戶端接受到Challenge后,使用將要登錄到賬戶對應的NTLM Hash加密Challenge生成Response,然后將Response發送至服務器端。
其中,經過NTLM Hash加密Challenge的結果在網絡協議中稱之為Net NTLM Hash。
驗證: 服務器端收到客戶端的Response后,比對Chanllenge1與Response是否相等,若相等,則認證通過。
注意:
1.Chanllenge是Server產生的一個16字節的隨機數,每次認證都不同
2.Response的表現形式是Net-NTLM Hash,它是由客戶端 提供的密碼Hash加密Server返回的Chanllenge產生的結果。
NTLM 認證消息的結構.
NTLM的消息很簡單, 只有三種,協商、質詢、驗證。 它們都有相似的結構。 認證消息都是二進制的,但是通常我們見到的都是它們的Base64的編碼格式。 類似這樣:
TlRMTVNTUAADAAAAGAAYAHAAAACSAJIAiAAAAAAAAAAAAAAAGgAaAEgAAAAOAA4AYgAAAAAAAAAAAAAABYKIogAAAAAAAAAPYQBkAG0AaQBuAGkAcwB0AHIAYQB0AG8AcgBOAEUASQBMAC0AUABDALZLpLeO2n6Sx1s9JjrAfQOqf2QsmfTeP9cjC86k7BsjZEsKzjOoYBcBAQAAAAAAAEDGE3IuR88Bqn9kLJn03j8AAAAAAgAEAEsAQQABAAoARgBTAFcARQBCAAQADABrAGEALgBjAG8AbQADABgAZgBzAHcAZQBiAC4AawBhAC4AYwBvAG0ABQAMAGsAYQAuAGMAbwBtAAcACAC0gtdyLkfPAQAAAAAAAAAA
消息頭
4字節的int值, 作為消息的Flags
前面首先是 8個字節+4個字節的 協議頭。
然后是四個字節的Flags。 這個Flags中表達了客戶端想要使用的NTLM的認證服務, 以及客戶端自己所支持的服務。
然后,是若干個可選的security buffer。
security buffer:
參考文檔:
MS-NLMP-NT-LAN-Manager-NTLM-Authentication-Protocol-Specification
The NTLM Authentication Protocol and Security Support Provider
Mozilla Firefox source code Developer Guide – MDN-firefox 源碼
samba.org-pub-unpacked-samba_3_current-librpc-idl-ntlmssp.idl