- 前言
- LM Hash
- NTLM Hash
- Windows本地認證
- LSASS程序
- Mimikatz抓取明文密碼
- Windows網路認證
- Net NTLM
- NTLMv1 & NTLMv2
- Hash傳遞攻擊
前言
LAN Manager 和 NT LAN Manager 認證是Windows系統中的一種挑戰-響應身份驗證機制。LM認證是早期Windows版本中使用的一種認證協議,而NTLM是LM的改進版本,安全性比LM要高一些。
LM Hash
LM Hash是LM協議認證的憑證,但是LM採用密碼雜湊形式安全性不好。所以從Windows Vista和Windows Server 2008版本開始,Windows系統預設禁用了LM Hash。
LM Hash的產生過程:
假設密碼為123456
那麼它所對應的LM Hash的產生過程如下:
-
首先對密碼進行大寫轉換:
123456
->123456
-
轉換為16進位制字串:
123456
->313233343536
-
密碼不足14位元組要求用0補全:
313233343536
(6bytes)->3132333435360000000000000000
(14bytes) -
密碼分割成兩個7個位元組長的段:
31323334353600
00000000000000
-
分別轉換成位元串,若長度不足56bits使用0在左邊補齊長度:
31323334353600 -> 00110001001100100011001100110100001101010011011000000000
00000000000000 -> 00000000000000000000000000000000000000000000000000000000
- 每7bits分為一組,每組末尾加0,再組成一組,轉換成16進位制:
0011000010011000100011000110011001000010101010001101100000000000 -> 40a0d0862298d000
0000000000000000000000000000000000000000000000000000000000000000 -> 0000000000000000
-
分別作為key對
KGS!@#$%
進行DES加密:44efce164ab921ca
aad3b435b51404ee
-
將兩組DES加密後的字串拼接得到最終的32位的十六進位制數字串:
44efce164ab921caaad3b435b51404ee
LM加密演算法存在的缺陷:
-
LM Hash對密碼的長度有限制,只考慮前14個字元,並且會對密碼進行大寫轉換
-
採用的加密方式是分組的DES加密,所以如果密碼強度是小於等於7位,那麼加密後的結果的後半部分就會是固定的
aad3b435b51404ee
-
分組加密極大程度降低了密碼的複雜度,DES演算法強度低
NTLM Hash
為了解決LM協議認證中固有的安全缺陷,Microsoft於1993年在Windows NT 3.1中引入了NTLM協議。
NTLM Hash的產生過程:
假設密碼為123456
那麼它所對應的NTLM Hash的產生過程如下:
-
首先對密碼進行十六進位制轉換:
123456
->313233343536
-
轉換成Unicode格式(每個位元組之後新增0x00):
313233343536
->310032003300340035003600
-
使用MD4摘要演算法對Unicode編碼資料進行Hash雜湊,生成32位的十六進位制數字串:
32ed87bdb5fdc5e9cba88547376818d4
import hashlib
import binascii
# 進行Unicode編碼
a = "123456".encode("utf-16le")
# 計算MD4雜湊值
b = hashlib.new("md4", a)
print(binascii.hexlify(b.digest()))
b'32ed87bdb5fdc5e9cba88547376818d4'
對所獲取的Unicode字串進行標準MD4單向雜湊,總會固定產生128bits的雜湊值。
可以看到NTLM Hash明顯比LM Hash要安全一些,因為無法根據NTLM Hash判斷出原始明文密碼的密碼強度是否小於等於7位。
Windows本地認證
在Windows系統中,登入密碼不是直接明文儲存,而是會計算成雜湊值儲存。
本地使用者的密碼被加密儲存在 C:\Windows\System32\config\SAM
檔案中。當使用者登入Windows時,系統會自動地讀取SAM檔案中的雜湊值與我們輸入的密碼(雜湊運算後的)進行比對,如果相同則認為認證成功。
在Windows內部執行流程大致如下:winlogon.exe -> 接收使用者輸入 -> lsass.exe -> 認證
LSASS程序
LSASS是使用者登入驗證、密碼更改、安全策略管理和其他安全相關操作的核心元件。當使用者嘗試登入Windows系統時,LSASS程序負責驗證使用者的憑據。
lsass.exe程序用來處理使用者輸入的密碼,程序將密碼計算成NTLM Hash與SAM進行比對,所以lsass.exe會在記憶體中短暫儲存密碼資訊。
Mimikatz抓取明文密碼
mimikatz是一個除錯神器,最常用的功能就是抓取明文或Hash。
上面提到lsass.exe在認證的過程中,會在記憶體中短暫儲存密碼資訊。所以就可以使用Mimikatz來抓取密碼資訊。然而從Windows 8.1和Windows Server 2012 R2開始,lsass.exe不再預設儲存使用者的明文密碼,而是以加密形式儲存。
所以如果嘗試使用Mimikatz直接從lsass.exe程序中提取明文密碼,密碼欄位會顯示為null。
如果仍想使用Mimikatz抓取明文密碼,需要修改登錄檔設定以強制lsass.exe儲存明文密碼。然後還需要使用者重新登入,之後Mimikatz才可能抓取到明文密碼。
Mimikatz需要管理員許可權:
privilege::debug 提升許可權
sekurlsa::logonpasswords 抓取密碼
需要修改登錄檔:
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
修改登錄檔之後,需要使用者登出或者重啟重新登陸之後才會生效。
還有其他的方式,比如使用procdump把lsass.exe程序的記憶體dump下來,然後mimikatz進行讀取內容。
Windows網路認證
在Windows系統中,網路認證協議主要包括Kerberos和Net NTLM兩種。其中Kerberos相對來說會複雜一些,同時也更加安全。
Net NTLM
Net NTLM認證是一種 Challenge/Response 驗證機制,由三種訊息組成:
-
type 1協商:主要用於確認雙方協議版本
-
type 2質詢:Challenge/Response 認證機制的核心部分
-
type 3驗證:在質詢完成後驗證結果
認證的主要過程:
-
客戶端首先傳送type1 訊息(協商)和伺服器之間進行協議版本等資訊的協商。
-
伺服器用type 2訊息(質詢)進行響應,並生成一個隨機的挑戰值Challenge傳送給客戶端。
-
客戶端用type 3訊息(驗證)回覆質詢,使用自己的NTLM Hash對挑戰值進行加密,生成響應Response併傳送回伺服器。
-
伺服器接收到響應後,使用已儲存的使用者密碼雜湊對挑戰值進行計算,再與客戶端回覆的響應值進行比對,若兩者一致則認證成功。
在域環境中,如果客戶端嘗試使用域賬戶登入,由於域成員伺服器不儲存域賬戶的密碼雜湊,伺服器會將使用者名稱、挑戰和響應透過Netlogon協議傳遞給域控制器,由DC來進行驗證。
經過NTLM Hash加密Challenge的結果在網路協議中稱為Net NTLM Hash
,網路中沒有傳輸與密碼本身相關的任何資料。
NTLMv1 & NTLMv2
NTLM存在v1和v2兩個版本,主要區別在Challenge和加密演算法不同。
-
v1是8位的Challenge,而v2是16位的Challenge
-
v1的主要加密演算法是DES,而v2的主要加密演算法是HMAC-MD5
-
type3訊息Response的構建方式不同
Net NTLM Hash的格式:
v1的格式為:
username::hostname:LM response:NTLM response:challenge
v2的格式為:
username::domain:challenge:HMAC-MD5:blob
如果可以從系統匯出來的NTLM Hash,嘗試透過Hashcat能夠破解出明文密碼。
Hash傳遞攻擊
Pass The Hash也叫hash傳遞攻擊,簡稱PTH。
在域環境中,使用者登入計算機時使用的大都是相同的域賬號。因此,如果計算機的本地管理員賬號和密碼也是相同的,攻擊者就能使用雜湊傳遞攻擊的方法登陸內網中的其他計算機。
這個過程不需要使用者明文密碼,只需要使用者Hash。Hash傳遞就只是完成一個不需要輸入密碼的NTLM協議認證流程。
Hash傳遞攻擊利用工具很多,比如mimikatz:
# 本地管理員的執行許可權
privilege::debug
sekurlsa::logonpasswords
複製拿到的NTLM Hash的值。
sekurlsa::pth /user:administrator /domain:XIAN.COM /ntlm:496d9d8e5b84059203b50fa8fc...
完成之後會彈出cmd.exe
除了比如mimikatz還有其他的方式,比如msf內建的mimikatz獲取hash,還有kiwi模組和psexec模組,python第三方庫impacket下的secretsdump等。
參考文章:
https://xxe.icu/domain-security.html
https://www.cnblogs.com/chalan630/p/15063693.html
https://www.cnblogs.com/Xy--1/p/13216686.html
https://www.freebuf.com/articles/system/224171.html
https://daiker.gitbook.io/windows-protocol/ntlm-pian/4#id-1.-pass-the-hash
https://www.cnblogs.com/husterlong/p/14271976.html
若有錯誤,歡迎指正!o( ̄▽ ̄)ブ