windows認證過程


更新_2020_01_16

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 Hash與NTLM的關系:

在Windows中,密碼Hash目前稱之為NTLM Hash,其中NTLM全稱是:"NT LAN Manager"。

這個NTLM是一種網絡認證協議,與NTLM Hash的關系就是: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(Unicode編碼) = 610064006d0069006e00
610064006d0069006e00 -> MD4(MD4算法加密) = 209c6174da490caeb422f3fa5a7ae634(NTLM Hash)

本地認證流程:

winlogon.exe -> 接收用戶輸入 -> lsass.exe -> (認證)

首先,用戶注銷、重啟、鎖屏后,操作系統會讓winlogon.exe顯示登錄界面,也就是輸入框,接收輸入后,將密碼交給lsass進程,這個進程中會存一份明文密碼,將明文密碼加密成NTLM Hash,對SAM數據庫比較認證。

Windows Logon Process(即 winlogon.exe):是Windows NT 用戶登陸程序,用於管理用戶登錄和退出。

LSASS:用於微軟Windows系統的安全機制。它用於本地安全和登陸策略


LM Hash 和 NTLM的關系:

在NTLM協議問世之前,它的前身就是LM(LAN Manager)協議。

不同點:加密算法

相同點:認證機制,就是上文中說的認證流程

目前大多數的Windows都采用NTLM協議認證,LM協議已經基本淘汰了,這里講就是當作了解。

LM Hash的加密:

將所有小寫字母轉換為大寫字母
• >123ABC // 未達到7個字符
• 將密碼轉化為16進制,分兩組,填充為14個字符,空余位使用0x00字符填補
• >31323341424300000000000000
• 將密碼分割為兩組7個字節的塊
• >31323341424300 00000000000000 // 16進制
• 將每組轉化為比特流,不足56Bit則在左邊加0
• >31323341424300 ->(轉換為二進制) 110001001100100011001101000001010000100100001100000000-> (補 足56Bit) 00110001001100100011001101000001010000100100001100000000
• 將比特流按照7比特一組,分出8組,末尾加0

由於后者都為0,結果可想而知,那就都是0;
• 將每組比特流轉換為16進制作為被加密的值,使用DES加密,字符串 “KGS!@#$%”為Key(0x4B47532140232425),得到8個結果,每個結果轉換為16進制。
• -> 00110000100110001000110001101000000101000001001000001100 00000000
• ->30988C6814120C00 -> DES(30988C6814120C00) -> 48-D7-EB-91- 2F-5E-69-7C
• 由於我們的密碼不超過7字節,所以后面的一半是固定的:
• AA-D3-B4-35-B5-14-04-EE
• 連接兩個DES加密字符串。這是LM哈希。
• 48-D7-EB-91-2F-5E-69-7C-AA-D3-B4-35-B5-14-04-EE

LM HASH的特點和問題:

1、口令不區分大小寫
2、口令長度最大為14字節,另外如果口令長度不超過7字節,則LM Hash的后8字節是固定值
3、DES算法強度不夠

技巧:根據LM Hash特征,也能夠判斷用戶的密碼是否是大於等於7位。


LM協議

早期SMB協議在網絡上傳輸明文口令。后來出現 LAN Manager Challenge/Response 驗證機制,簡稱LM,它是如此簡單以至很容易就被破解,現在又有了NTLM以及Kerberos。

LAN Manager Challenge/Response::LAN Manager Challenge/Response 驗證機制,簡稱LM。該方案比NTLM響應時間更早,安全性更低。

SMB通信,Client A訪問Server B通過LM身份驗證的過程

1、首先我們假設Server B的密碼為 "WELCOME" ,Server B已經緩存了密碼的LM-HASH (原始密碼在任何情況下都不能被緩存) 我們通過上面的腳本計算"WELCOME"的LM-HASH為 "c23413a8a1e7665faad3b435b51404ee"

2、Server B -- 8bytes Challenge --> Client A,Server B向Client A發送了一個8字節挑戰碼 "0001020304050607"

3、Client A會根據自己的訪問Server B的密碼明文計算並緩存密碼的LM-HASH(Client A緩存輸入密碼的哈希值,原始密碼會被丟棄,“原始密碼在任何情況下都不能被緩存”,這是一條基本的安全准則) -然后在LM-HASH后5個0x00變成 "c23413a8a1e7665faad3b435b51404ee0000000000" ,變為21字節,然后划分成三組,每組7字節

| C23413A8A1E766 | 5FAAD3B435B514 | 04EE0000000000 |

每組7字節做為參數傳遞給str_to_key()函數,最終得到三組DESKEY,每組8字節

| C21A04748A0E9CCC | 5ED4B47642ACD428 | 0476800000000000 |

分別用三組DESKEY對8字節挑戰 "0001020304050607" 進行標准DES加密后得到

C21A04748A0E9CCC ---- 對0001020304050607進行標准DES加密 --> CA1200723C41D577

5ED4B47642ACD428 ---- 對0001020304050607進行標准DES加密 --> AB18C764C6DEF34F

0476800000000000 ---- 對0001020304050607進行標准DES加密 --> A61BFA0671EA5FC8

Client A最終獲得一個24字節響應應"CA1200723C41D577AB18C764C6DEF34FA61BFA0671EA5FC8"(這個結果被稱為response

Client A 將"CA1200723C41D577AB18C764C6DEF34FA61BFA0671EA5FC8" 送往Server B,Server B會根據自己緩存的LM-HASH進行同樣的計算,並將計算結果與來自A的響應進行比較,如果匹配則身份驗證通過。

C = 8-byte server challenge
K1 | K2 | K3 = LM-Hash | 5-bytes-0
response = DES(K1, C) | DES(K2, C) |  DES(K3, C)

簡單的概述就是:首先A保留了自己給B發送的明文密碼通過算法生成的LM-HASH,由於A向B發起請求,B會給A返回一個8字節的挑戰碼,然后A再把自己生成的LM-HASH拆分三組,每組7字節,然后對每組的LM-HASH用挑戰碼進行DES加密,再把這個值發送給B,B也同樣跟A一樣用挑戰碼進行同樣的操作,這里B不同的是,緩存的LM-HASH是自己服務器中存儲的,而不是A的,這樣就起到了區分的作用,然后再比較,如果一樣則通過,反之。


NTLM 協議:

NTLM是一種網絡認證協議,它是基於挑戰(challenge)/響應(Response)認證機制的一種認證模式。

NTLM協議的認證過程分為三步:

1、協商:主要用於確認雙方協議版本(NTLM v1/NTLM V2)
2、質詢:就是挑戰(Chalenge)/響應(Response)認證機制起作用的范疇,本小節主要討論這個機制的運作流程。
3、驗證:驗證主要是在質詢完成后,驗證結果,是認證的最后一步。

質詢的完整過程:

1、客戶端向服務器端發送用戶信息(用戶名)請求

2、服務器接受到請求,生成一個16位的隨機數,被稱之為Challenge, 使用登錄用戶名對應的NTLM Hash加密Challenge(16位隨機字符), 生成Response,並且保存到內存中(這里的Response可以稱之為Net NTLM Hash)。同時,生成Response后,將Challenge(16位隨機字符)發送給客戶端。

3、客戶端接受到Challenge后,使用將要登錄到賬戶對應的NTLM Hash加密Challenge生成Response,然后將Response發送至服務器端。

其中,經過NTLM Hash加密Challenge的結果Response,在網絡協議中稱之為Net NTLM Hash

驗證: 服務器端收到客戶端的Response后,比對兩邊的Response是否相等,若相等,則認證通過。

注意:

1.Chanllenge是Server產生的一個16字節的隨機數,每次認證隨機數都不同

2.Response的表現形式是Net-NTLM Hash,它是由客戶端 提供的密碼Hash加密Server返回的Chanllenge產生的結果。


Net-NTLMv1和Net-NTLMv2的加密方法:

Net-NTLMv1

客戶端向服務器發送一個請求
服務器接收到請求后,生成一個8位的Challenge,發送回客戶端
客戶端接收到Challenge后,使用登錄用戶的密碼hash對Challenge加密,作為response發送給服務器
服務器校驗response

Net-NTLMv2:

客戶端向服務器發送一個請求
服務器接收到請求后,生成一個16位的Challenge,發送回客戶端
客戶端接收到Challenge后,使用登錄用戶的密碼hash對Challenge加密,作為response發送給服務器
服務器校驗response

總結:

對於Net-NTLMv1的利用方法可以參考:https://xz.aliyun.com/t/2205

兩者的流程相同,但加密算法不同,Net-NTLMv1相對脆弱。

技巧:根據LM Hash特征,LM Hash的后8字節是固定值,也能夠判斷用戶的密碼是否是大於等於7位,是的話則小於,不是的話則大於

小知識點:自Windows Vista/Server2008開始,系統默認禁用Net-NTLMv1,使用Net-NTLMv2

前面三個,當密碼超過14位時候會采用NTLM加密 test:1003:E52CAC67419A9A22664345140A852F61:67A54E1C9058FCA16498061B9 6863248:::

前一部分是LM Hash,后一部分是NTLM Hash 當LM Hash是 AAD3B435B51404EEAAD3B435B51404EE 這表示空密碼或者是未使用LM_HASH

Hash一般存儲在兩個地方: 1、SAM文件,存儲在本機 對應本地用戶 2、NTDS.DIT文件,存儲在域控上 對應域用戶

文章參考:https://www.t00ls.net/articles-53261.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM