0x01、前言
NTLM使用在Windows NT和Windows 2000 Server或者之後的工作組環境中(Kerberos用在域模式下)。在AD域環境中,如果需要認證Windows NT系統,也必須採用NTLM。較之Kerberos,基於NTLM的認證過程要簡單很多。NTLM採用一種質詢/應答(Challenge/Response)訊息交換模式
0x02、LM hash & NTLM hash
假設我的密碼是admin,那麼作業系統會將admin轉換為十六進位制,經過Unicode轉換後,再呼叫MD4加密演算法加密,這個加密結果的十六進位制就是NTLM Hash
admin -> hex(16進位制編碼) = 61646d696e
61646d696e -> Unicode = 610064006d0069006e00
610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634
LM HASH加密:
假設明文口令是“Welcome”,首先全部轉換成大寫“WELCOME”,再做將口令字串大寫轉後後的字串變換成二進位制串: “WELCOME” -> 57454C434F4D4500000000000000
如果明文口令經過大寫變換後的二進位制字串不足14位元組,則需要在其後新增0x00補足14位元組。然後切割成兩組7位元組的資料,分別經str_to_key()函式處理得到兩組8位元組資料:
57454C434F4D45 -str_to_key()-> 56A25288347A348A
00000000000000 -str_to_key()-> 0000000000000000
這兩組8位元組資料將做為DESKEY對魔術字串“KGS!@#$%”進行標準DES加密
"KGS!@#$%" -> 4B47532140232425
56A25288347A348A -對4B47532140232425進行標準DES加密-> C23413A8A1E7665F
0000000000000000 -對4B47532140232425進行標準DES加密-> AAD3B435B51404EE
將加密後的這兩組資料簡單拼接,就得到了最後的LM Hash
LM Hash: C23413A8A1E7665FAAD3B435B51404EE
NTLM HASH加密:
假設明文口令是“123456”,首先轉換成Unicode字串,與LM Hash演算法不同,這次不需要新增0x00補足14位元組
"123456" -> 310032003300340035003600
從ASCII串轉換成Unicode串時,使用little-endian序,微軟在設計整個SMB協議時就沒考慮過big-endian序,ntoh*()、hton*()函式不宜用在SMB報文解碼中。0x80之前的標準ASCII碼轉換成Unicode碼,就是簡單地從0x??變成0x00??。此類標準ASCII串按little-endian序轉換成Unicode串,就是簡單地在原有每個位元組之後新增0x00。對所獲取的Unicode串進行標準MD4單向雜湊,無論資料來源有多少位元組,MD4固定產生128-bit的雜湊值,
16位元組310032003300340035003600 -進行標準MD4單向雜湊-> 32ED87BDB5FDC5E9CBA88547376818D4
就得到了最後的NTLM Hash: 32ED87BDB5FDC5E9CBA88547376818D4
0x03、本地認證
本地登入windows的情況下作業系統會使用使用者輸入的密碼作為憑據,去跟系統中的sam檔案中的密碼去做比較;就類似web網站登入一樣原理。
當使用者選擇登入時,會彈出winlogon.exe接收輸入的密碼,這時候會將密碼交給lsass.exe,這個程式重會儲存一份明文密碼;將明文密碼加密成NTLM HASH,對SAM資料庫再進行認證比較
0x04、網路認證
網路認證是什麼呢?其實就是NTLM 協議。那NTLM
和NTLM hash
有什麼關係?
NTLM是一種網路認證協議,它是基於挑戰(Chalenge)/響應(Response)認證機制的一種認證模式
關於NTLM Hash與NTLM
在Windows中,密碼Hash目前稱之為NTLM Hash,其中NTLM全稱是:“NT LAN Manager”。
這個NTLM是一種網路認證協議,與NTLM Hash的關係就是:NTLM網路認證協議是以NTLM Hash作為根本憑證進行認證的協議。
1、NTLM v2協議認證過程
NTLM協議的認證過程分為三步:
- 協商
- 質詢
- 驗證
協商:主要用於確認雙方協議版本
質詢:就是挑戰(Chalenge)/響應(Response)認證機制起作用的範疇,本小節主要討論這個機制的運作流程。
驗證:驗證主要是在質詢完成後,驗證結果,是認證的最後一步。
伺服器端收到客戶端的Response後,比對Chanllenge1與Response是否相等,若相等,則認證通過。
2、質詢的完整過程
- 1、客戶端向伺服器端傳送使用者資訊(使用者名稱)請求
- 2、 伺服器接受到請求,生成一個16位的隨機數,被稱之為“Challenge”, 使用登入使用者名稱對應的NTLM Hash加密Challenge(16位隨機字元), 生成Challenge1。同時,生成Challenge1後,將Challenge(16位隨機 字元)傳送給客戶端。
- 3、客戶端接受到Challenge後,使用將要登入到賬戶對應的NTLM Hash加密Challenge生成Response,然後將Response傳送至伺服器端。
其中,經過NTLM Hash加密Challenge的結果在網路協議中稱之為Net NTLM Hash。
更為細節的流程圖如下
流程大致這樣,那response是怎麼回事呢?其實就是net-ntlm hash。總的來說,就是response的內容,就是net-ntlm hash
3、NET-NTLM hash格式
認證成功:
認證失敗:
檢視第二個資料包,獲得Challenge,為:77effc5381037df8
Net-NTLM Hash格式為:username::domain:challenge:HMAC-MD5:blob
username(要訪問伺服器的使用者名稱):xie
domain(訪問者主機名或者ip):WIN7
challenge(資料包2中伺服器返回的challenge值):77effc5381037df8
HMAC-MD5(資料包3中的NTProofStr): b6b777ced0128e3f587fe08b98853e13
blob(blob對應資料為NTLMv2 Response去掉NTProofStr的後半部分):0101000000000000f27fa3a7aa61d501ba3237c701d9f3970000000002000e00570049004e00320030003000380001000e00570049004e00320030003000380004000e00570049004e00320030003000380003000e00570049004e00320030003000380007000800f27fa3a7aa61d50106000400020000000800300030000000000000000100000000200000ca0ee75c65eaa5367775b826f949798912fa871a19e5d17f9b49587485a8e6620a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e00310030002e0031003500000000000000000000000000
4、NTLM V2協議
NTLM v1與NTLM v2最顯著的區別就是Challenge與加密演算法不同,共同點就是加密的原料都是NTLM Hash。
下面細說一下有什麼不同:
- Challage:NTLM v1的Challenge有8位,NTLM v2的Challenge為16位。
- Net-NTLM Hash:NTLM v1的主要加密演算法是DES,NTLM v2的主要加密演算法是HMAC-MD5。
現在應該能夠理解什麼是NTLM、NTLM Hash、LM、LM Hash、Net NTLM Hash了吧?
0x05、Pass The Hash
要完成一個NTLM認證,第一步需要客戶端將自己要認證的 使用者名稱傳送至伺服器端,等待伺服器端給出的Challenge
其實雜湊傳遞就是使用使用者名稱對應的NTLM Hash將伺服器給出的 Chanllenge加密,生成一個Response,來完成認證。
windows 常見SID
administrator - 500
Guest - 501
kbrtgt - 502
doamin admins - 512
Domain users - 513
Domain Controllers - 515
Domain Controllers - 516
Enterprise Admins - 519
1、工作組 - Pass the Hash
- Windows Vista 之前的機器,可以使用本地管理員組內使用者進行攻擊。
- Windows Vista 之後的機器,只能是administrator使用者的雜湊值才能進行雜湊傳遞攻擊,其他使用者(包括管理員使用者但是非administrator)也不能使用雜湊傳遞攻擊,會提示拒絕訪問。(主要以為SID不為500原因)
privilege::debug #先提權
#使用administrator使用者的NTLM雜湊值進行攻擊
sekurlsa::pth /user:使用者名稱 /domain:目標機器IP /ntlm:密碼雜湊
執行完mimikatz即可彈出該機器cmd
2、域環境 - Pass the Hash
在域環境中,當我們獲得了域管理員組內使用者的NTLM雜湊值,我們可以使用域內的一臺主機用mimikatz對域內任何一臺機器(包括域控)進行雜湊傳遞攻擊。執行完命令後,會彈出CMD視窗,在彈出的CMD視窗我們可以訪問域內任何一臺機器。前提是我們必須擁有域內任意一臺主機的本地管理員許可權和域管理員的密碼NTLM雜湊值。
- 域:hack.com
- 伺服器地址:WIN2008.hack.com
- 域管理員: test
privilege::debug #先提權
#使用域管理員test的NTLM雜湊值對域控進行雜湊傳遞攻擊,域使用者test在域管理員組中
sekurlsa::pth /user:test /domain:hack.com /ntlm:6542d35ed5ff6ae5e75b875068c5d3bc
執行完mimikatz即可彈出該機器cmd