终端服务(或远程桌面服务)为想要深入探索的用户提供了许多隐藏功能。其中一项服务是动态虚拟通道,它使我们能够在开放的 RDP 连接上进行通信,而无需打开新的套接字、连接或防火墙端口。这些通道可用于向活跃网络设备隐藏数据、绕过防火墙、通过网络实现设备驱动程序,或仅仅帮助渗透测试人员传输数据。其可能性是无限的。
本项目创建的实际原因是 XFLTReaT。它可用于在隔离网络之上构建“VPN”,并最终允许通过跳板机进行测试,而无需请求防火墙更改。简而言之,它让渗透测试人员的工作更轻松。
你需要在用于连接 RDP 服务器的客户端计算机上安装一个插件(.dll)。在 RDP 服务器上,你需要使用项目的另一半,即 .exe 文件,它在插件和服务器可执行文件之间创建通道。 如果你想了解更多细节,请向下滚动。
仅限 Windows。 动态虚拟通道在 Windows Server 2008 和 Windows Vista SP1 中引入。这些版本及其更新版本应该都可正常运行。
你可以获取整个项目并自行编译,或者直接使用 Releases 部分 中的已编译二进制文件。在所有情况下,使用正确的二进制文件非常重要,请选择与相应架构匹配的版本(如果你的客户端是 32 位但服务器是 64 位,则获取 32 位的 dll 和 64 位的 exe)。
.dll 需要放置在客户端计算机的任何目录中(对于长期使用,可以将其放入 %SYSROOT%\system32\ 或 %SYSROOT%\SysWoW64\),并以提权用户(即管理员)身份使用以下命令安装:
regsvr32.exe UDVC-Plugin.dll
如果你的用户不是管理员,则还需要在你的用户下导入注册表设置。请使用 UDVC-Plugin.reg 文件。
如果你希望卸载它:
regsvr32.exe /u UDVC-Plugin.dll
从现在开始,每次连接到 RDP 服务器时,此插件都会被加载,并根据注册表中的指定配置自身(见下文)。
.exe 需要放在 RDP 服务器上,并可以由任何用户运行。
目前两端都支持三种模式:
启用此模式时,将在指定的端口和接口(IP 地址)上设置一个监听器。
在此模式下,将向指定 IP 地址和端口上的监听器发起连接。
此模式使用指定的名称设置一个命名管道。例如:此模式可用于让其他工具通过 RDP 进行 IPC 通信。不幸的是,命名管道会写入磁盘,因此与套接字模式相比被认为速度较慢。如果你关心带宽,请使用套接字模式。
客户端和服务器二进制文件的行为相同,并且可以使用相同的选项进行配置。
服务器二进制文件将从命令行读取选项。
PS C:\Users\UDVC\> .\UDVC-Server.exe -h
Universal Dynamic Virtual Channel server application
Usage: C:\Users\UDVC\UDVC-Server.exe [-s | -c [-p port [-h ip]] | -m [-n name]] [-0 | -1 | -2 | -3]
Socket server mode -s (default) OR
Socket client mode -c:
-p port port to bind the listener (default: 31337)
-i ip ip to bind the listener (default: 127.0.0.1)
Named pipe mode -m:
-n name name of the named pipe (by default: "\\.\pipe\UDVC_{RDP SESSION NUMBER}")
Data transfer priority parameters:
-0 real time (WTS_CHANNEL_OPTION_DYNAMIC_PRI_REAL)
-1 high priority (WTS_CHANNEL_OPTION_DYNAMIC_PRI_HIGH) - default
-2 medium priority (WTS_CHANNEL_OPTION_DYNAMIC_PRI_MED)
-3 low priority (WTS_CHANNEL_OPTION_DYNAMIC_PRI_LOW)
客户端 .dll 从注册表中读取所有选项,这些值位于以下键下:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Terminal Server Client\Default\AddIns\UDVC-Plugin
每次启用模块并在建立连接之前,都会显示一个提醒警告。如下图所示:

此警告确保用户知道插件已加载及其设置。
仅当服务器可执行文件能够成功连接到插件 dll 时,才会创建监听器、连接或命名管道。这取决于你的配置,但默认情况下,当虚拟通道连接建立后(插件已正确加载,服务器二进制文件已执行),它会在两端监听 localhost:31337。当你连接到这些端口并通过套接字发送数据时,数据将出现在另一端。
仅展示该工具可以使用的几个用例。
非常基本的端口转发。隔离机器 1 上有一个 HTTP 服务运行在 tcp/80。该网络未从 192.168.0.0/24 网络路由,必须使用双宿主跳板机进行访问。在客户端侧配置监听模式在 0.0.0.0:31337,并且服务器二进制文件以连接模式设置执行,以创建到 Web 服务器的连接。RDP 客户端上的用户可以使用其浏览器打开 http://127.0.0.1:31337 来访问来自 http://10.13.37.2:80 的内容。

一个更高级的文件传输场景。两个端点都配置为监听 0.0.0.0:31337。首先,黑客机器连接到 RDP 客户端并等待输入。然后,隔离机器 2 连接到跳板机并将整个文件读入套接字。

此外,还可以使用命名管道。在这种情况下,RDP 客户端和跳板机都在两端创建命名管道(hIPC-client 和 hIPC-server),其他机器可以连接到这些管道。写入管道的内容将出现在另一端。这与上面的监听模式示例没有本质区别,只是它使用命名管道而不是 TCP 套接字。

如果插件未加载或可执行文件因缺少某些 DLL(例如 VCRUNTIME140.DLL)而无法运行,你可能需要安装 Visual C++ Redistributable for Visual Studio 2015 包。