前言
前幾天自己在學習域滲透時突然對Windows的身份認證機制產生了興趣,但看了好幾天自己還是懵懵懂懂,期間自己看了許多師傅的優質文章,也做了一些例子的復現,於是有了這篇文章,可以說是自己的筆記或總結吧。
由於自己了解的也不是很深入,這篇文章寫的技術可能比較淺,像NTLM和Kerberos的中間過程並沒有寫的很詳細。自己還畫了簡單的過程圖來加深理解和記憶,圖畫的不好,這些還請各位師傅見諒。
如果本文的內容有錯誤,還請各位師傅指正。
Windows身份認證機制
Windows身份認證機制主要有NTLM和Kerberos兩種,其中NTLM主要被用在本地以及工作組環境,而在域環境中優先使用的是Kerberos。
在早期的windows系統(win2000以前)還有一種認證方式叫LM,但該方式的加密算法較脆弱,基本已經被淘汰掉了。
NTLM
NTLM(NT LAN Manager)是Windows中最常見的身份認證方式,主要有本地認證和網絡認證兩種情況。
NTLM Hash
在介紹NTLM之前,需要介紹NTLM中最關鍵的憑證:NTLM Hash。正常的明文密碼加密為NTLM Hash的方法如下:
password ----> 十六進制編碼 ----> Unicode轉換 ----> MD4加密 ----> 得到NTLM Hash
例如:
admin -> hex(16進制編碼) = 61646d696e
61646d696e -> Unicode = 610064006d0069006e00
610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634
本地認證
在本地認證過程中,當用戶進行注銷、重啟、開機等需要認證的操作時,首先Windows會調用winlogon.exe
進程(也就是我們平常見到的登錄框)接收用戶的密碼。
之后密碼會被傳送給進程lsass.exe
,該進程會先在內存中存儲一份明文密碼,然后將明文密碼加密為NTLM Hash后,與Windows本地的SAM數據庫(%SystemRoot%\system32\config\SAM)中該用戶的NTLM Hash對比,如果一致則通過認證
網絡認證
工作組環境
網絡認證需要使用NTLM協議,該協議基於挑戰(Challenge)/響應(Response)機制。
- 首先客戶端向服務端發送
用戶名以及本機的一些信息(此處更正) - 服務端接收到客戶端的用戶名后,先生成一個隨機的16位的Challenge(挑戰隨機數),本地儲存后將Challenge返回給客戶端
- 客戶端接收到服務端發來的Challenge后,使用用戶輸入密碼的NTLM Hash對Challenge進行加密生成Response(也叫Net NTLM Hash),將Response發送給服務端
- 服務端接收到客戶端發來的Response,使用數據庫中對應用戶的NTLM Hash對之前存儲的Challenge進行加密,得到的結果與接收的Response進行對比,如果一致則通過認證