認識Windows Hash
早期SMB協議在網絡上傳輸明文口令。后來出現LAN Manager 挑戰/響應驗證機制(LM),其很容易破解,因此微軟提出了WindowsNT挑戰/響應驗證機制(NTLM)
現在已經誕生NTLMv2以及Kerberos驗證體系。Windows的系統密碼hash默認情況下一般由兩部分組成:第一部分是LM Hash,第二部分是NT Hash
NT Hash與LM Hash算法相比,明文口令大小寫敏感,但無法根據NT Hash判斷原始明文口令是否小於8字節,擺脫了魔術字符串KGS!@#$%
,MD4是真正的單向哈希函數,窮舉做為數據源出現的明文,難度較大
問題在於,微軟一味強調NT Hash的強度高,卻避而不談一個事實,為了保持向后兼容性,NT Hash總是與LM Hash一起使用。這意味着NT Hash強度再高也是無助於安全,相反存在潛在危害
認識LM Hash、NTLM Hash、Net-NTLM Hash
LM Hash
LM Hash是Windows使用的最古老的密碼存儲,其歷史可追溯到1980年代的OS / 2。在LAN Manager協議中使用,由於允許的字符集有限,因此它們很容易破解。如果仍然可用,則可以從Windows系統上的SAM數據庫或域控制器上的NTDS數據庫中獲取它們
從Windows Vista / Server 2008開始,默認情況下已關閉LM,但某些工具的參數需要填寫固定格式LM hash:NT hash
,可以將LM Hash填0(LM hash可以為任意值),即00000000000000000000000000000000:NT hash
NT Hash(aka NTLM Hash) new technology
通常人們稱其為NTLM Hash,這具有誤導性,因為Microsoft將其稱為NT Hash(至少在某些地方)。建議稱其為NT Hash,以免造成混淆
Vista之后現代Windows系統使用的Hash,它的前身是LM Hash,兩者相差不大,只是使用的加密算法不同。通常意義上的NT Hash指存儲在SAM數據庫及NTDS數據庫中對密碼進行摘要計算后的結果,NT Hash可以通過轉儲SAM數據庫或使用Mimikatz來獲得,可直接用於PtH,並且通常存在於lsass進程中,便於SSP使用
NT Hash是支持Net NTLM認證協議及本地認證過程中的一個重要參數。其長度為32位,由數字與字母組成
本地認證
Windows不存儲用戶的明文密碼,它會將用戶的明文密碼經過加密后存儲在SAM數據庫中。SAM文件的路徑是%SystemRoot%\system32\config\sam
。在進行本地認證的過程中,當用戶登錄時,系統將用戶輸入的明文密碼加密成NTLM Hash,與SAM數據庫中的NTLM Hash進行比較,從而實現認證
在域環境下,域控制器中也存在這樣的數據庫AD (Account Database),位於ntds.dit
winlogon.exe -> 接收用戶輸入 -> lsass.exe -> (認證)
用戶注銷、重啟、鎖屏后,操作系統會讓winlogon顯示登錄界面,也就是輸入框,接收輸入后,將密碼交給lsass進程,這個進程中會存一份明文密碼,將明文密碼加密成NTLM Hash,對比SAM數據庫中的hash進行驗證
NT Hash生成算法
- 明文轉換為16進制ASCII碼
- 使用little-endian(小端)序將其在轉換為Unicode格式。0x80之前的標准ASCII碼轉換成Unicode碼,就是簡單地從0x??變成 0×00??。此類標准ASCII串按little-endian序轉換成Unicode串,就是簡單地在原有每個字節之后添加0×00
- 對所獲取的 Unicode串進行標准MD4單向哈希,無論數據源有多少字節,MD4固定產生128-bit的哈希值
plain 123456
-> 313233343536
-> 16字節 310032003300340035003600
-> MD4 Hash 32ED87BDB5FDC5E9CBA88547376818D4
NT Hash 32ED87BDB5FDC5E9CBA88547376818D4
Net-NTLM Hash
Net-NTLM Hash用於網絡身份認證(例如NTLM認證),目前分為兩個版本:
- Net-NTLMv1
- Net-NTLMv2
通常使用Responder等工具獲取到的就是Net-NTLM,Het-Hash並不能直接用來PtH,但有可能通過暴力破解來獲取明文密碼
NTLMv1 (aka Net-NTLMv1)
NTLM協議在服務器和客戶端之間的質詢/響應中使用NT Hash。協議v1同時使用NT Hash和LM Hash
NTLMv2 (aka Net-NTLMv2)
NTLM協議的新版本和改進版本,這使其很難破解。該概念與NTLMv1相同,只是發送到服務器的算法和響應不同,也可以通過Responder或類似對象捕獲。從Windows 2000開始,在Windows中為默認值
聯系&總結
LM和NT哈希是Windows存儲密碼的方式。NT令人困惑,也稱為NTLM。可以破解以獲取密碼,或用於傳遞哈希值。
NTLMv1 / v2是用於Windows環境中身份驗證的質詢響應協議。它們在算法中使用NT哈希,這意味着可以通過Brute Force/Dictionary攻擊將其還原成明文密碼,也可以用於中繼攻擊
NTML網絡認證機制
NTLM 協議
NTLM是除Kerberos之外的一種網絡認證協議,只支持Windows。它是一種基於質詢/應答 (Challenge/Response)消息交換模式的認證機制, 常用於工作組和域環境下登錄場景的身份認證
NTLM驗證(Windows Challenge/Response)
NTLM憑據包括域名,用戶名和用戶密碼的單向Hash。用戶的密碼不會在網絡鏈路中傳輸,加密之后的Challenge值取代原本密碼的作用進行對比驗證,與傳統傳輸密碼的方式相比,具有較高的安全性
NTML的認證方式分為Interactive(交互式)和Noninteractive(非交互式)
-
通過網絡進行的交互式NTLM身份驗證通常涉及兩個系統:客戶端系統,用戶用於請求身份驗證;域控制器,其中保留與用戶密碼有關的信息;交互式提供必要憑據,應用場景通常為用戶要登錄某台客戶端
-
HTLM非交互式身份驗證通常涉及三個系統:客戶端,服務器和代表服務器進行身份驗證計算的域控制器;無需交互式提供憑據,實際應用更多為已登錄某客戶端的用戶去請求另一台服務器的資源 ,即用戶只需要登錄一次即可訪問所有相互信任的應用系統及共享資源
域和工作組
工作組和域宏觀上都是一群計算機的集合,域中計算機的數量規模通常大於工作組內的計算機。
工作組內的機器名義上雖然是屬於一個集合,但是內部各計算機還是各自管理各自的,沒有一個相對成熟的信任機制,工作組內各個計算機的關系依舊是點對點。因此,在工作組環境下進行訪問認證,僅涉及Client和Server。我們使用的個人計算機,默認便處於WORKGROUP工作組環境下
域是一個有安全邊界的計算機集合,同一個域中的計算機通過共同的第三方信任機構建立信任關系,這個第三方信任機構角色由DC(域控制器)擔當。通俗來講,域中的機器都信任域控制器,那么只要域控制器信任我們,我們就可以在域內獲得對其他服務器的訪問權限。在這種認證體系中涉及三方:Client、Server、DC
工作組環境NTML認證流程
- (僅交互式身份驗證存在此步驟)用戶訪問客戶機並提供域名,用戶名,密碼。客戶端計算密碼的Hash,並丟棄實際密碼
- 客戶端將用戶名發送到服務器
- 服務器生成一個16字節的隨機數Challenge並發送給客戶端
- 客戶端使用用戶密碼的Hash對Challenge進行加密,然后將結果response(Net-NTLM hash)返回給服務器
- 服務器使用用戶名從SAM數據庫中檢索用戶密碼Hash,使用此密碼Hash對Challenge進行加密
- 服務器將其加密的Challenge(在步驟5中)與客戶端計算的response(在步驟4中)進行比較。如果它們相同則身份驗證成功
域環境NTML認證流程
- (僅交互式身份驗證存在此步驟)用戶訪問客戶機並提供域名,用戶名,密碼。客戶端計算密碼的Hash,並丟棄實際密碼
- 客戶端將用戶名發送到服務器
- 服務器生成一個16字節的隨機數Challenge並發送給客戶端
- 客戶端使用用戶密碼的Hash對Challenge進行加密,然后將結果response(Net-NTLM hash)返回給服務器
- 服務器將三個信息發送到域控制器:用戶名,發送給客戶機的Challenge,返回給服務器的response
- 域控制器使用用戶名從SAM數據庫中檢索用戶密碼Hash。使用此密碼Hash對Challenge進行加密
- 域控制器將其加密的Challenge(在步驟6中)與客戶端計算的response(在步驟4中)進行比較。如果它們相同則身份驗證成功
工作組環境和域環境NTLM驗證區別
域環境Server會將認證信息使用netlogon協議發送給域控制器,由域控制器完成檢驗並返回認證結果
本地抓取Hash
在滲透測試中,通常可從Windows系統中的SAM文件和域控的NTDS.dit文件中獲得用戶hash,通過讀取lsass.exe(注意 l為小寫的L)進程能獲得已登錄用戶的NTLM hash。但需要注意的是大部分本地抓取hash工具都需要管理員權限
-
Mimikatz
Mimikatz可以抓到本機的明文密碼和其他用戶的Hash密碼,原因是因為其抓取本地lsass文件,lsass中有經過其它非Hash加密后的密碼,此加密算法可逆因而得到明文密碼;而得到其它用戶Hash加密后的密碼是因為ntds.dit中存儲本來就是用戶Hash加密后的密碼
privilege::debug sekurlsa::logonpasswords
-
Procdump
procdump是微軟提供的一個命令行實用程序,用於監視應用程序並生成故障轉儲。可以用其先dump對方主機的lsass內存文件,然后用mimikatz等工具進行處理。這種方式的好處是可以避免被查殺
轉儲lsass內存文件 procdump.exe -accepteula -ma lsass.exe lsass.dmp Mimikatz破解lsass sekurlsa::minidump lsass.dmp sekurlsa::logonpasswords
Reference
https://medium.com/@petergombos/lm-ntlm-net-ntlmv2-oh-my-a9b235c58ed4
https://docs.microsoft.com/en-us/windows/win32/secauthn/microsoft-ntlm
https://ssooking.github.io/yu-shen-tou-zhi-ntml-hash/
http://blog.sycsec.com/2018/10/02/What-is-Pass-the-Hash-and-the-Limitations-of-mitigation-methods/
右下角還有打賞功能呦~要不測試一下打賞功能能否正常運行?