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