域滲透之初識LM&NTLM認證過程

smileleooo發表於2024-06-16

目錄
  • 前言
  • 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的產生過程如下:

  1. 首先對密碼進行大寫轉換:123456 -> 123456

  2. 轉換為16進位制字串:123456 -> 313233343536

  3. 密碼不足14位元組要求用0補全:313233343536(6bytes)-> 3132333435360000000000000000(14bytes)

  4. 密碼分割成兩個7個位元組長的段:31323334353600 00000000000000

  5. 分別轉換成位元串,若長度不足56bits使用0在左邊補齊長度:

31323334353600 -> 00110001001100100011001100110100001101010011011000000000
00000000000000 -> 00000000000000000000000000000000000000000000000000000000
  1. 每7bits分為一組,每組末尾加0,再組成一組,轉換成16進位制:
0011000010011000100011000110011001000010101010001101100000000000 -> 40a0d0862298d000
0000000000000000000000000000000000000000000000000000000000000000 -> 0000000000000000
  1. 分別作為key對 KGS!@#$% 進行DES加密:44efce164ab921ca aad3b435b51404ee

  2. 將兩組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的產生過程如下:

  1. 首先對密碼進行十六進位制轉換:123456 -> 313233343536

  2. 轉換成Unicode格式(每個位元組之後新增0x00):313233343536 -> 310032003300340035003600

  3. 使用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程序負責驗證使用者的憑據。

image

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。

image

如果仍想使用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驗證:在質詢完成後驗證結果

認證的主要過程:

  1. 客戶端首先傳送type1 訊息(協商)和伺服器之間進行協議版本等資訊的協商。

  2. 伺服器用type 2訊息(質詢)進行響應,並生成一個隨機的挑戰值Challenge傳送給客戶端。

  3. 客戶端用type 3訊息(驗證)回覆質詢,使用自己的NTLM Hash對挑戰值進行加密,生成響應Response併傳送回伺服器。

  4. 伺服器接收到響應後,使用已儲存的使用者密碼雜湊對挑戰值進行計算,再與客戶端回覆的響應值進行比對,若兩者一致則認證成功。

在域環境中,如果客戶端嘗試使用域賬戶登入,由於域成員伺服器不儲存域賬戶的密碼雜湊,伺服器會將使用者名稱、挑戰和響應透過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...

image

完成之後會彈出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( ̄▽ ̄)ブ

相關文章