# RDP

在 Windows 系统中，远程桌面能提供 GUI 的远程访问，在企业环境里使用极多，对于攻击者而言也是一种天然的横向移动的方式。如果我们已经拥有了受害用户的**明文密码**，并且受害用户是其他主机的**本地管理员**或者是 **Remote Desktop Users** 组成员，那么我们便可使用 **mstsc.exe**，即 RDP 客户端远程访问。在 Linux 平台，我们可以使用工具 **xfreerdp** 或者 **rdesktop**。

RDP 远程登陆是典型的**交互式认证**情景，交互式登陆需要**明文密码**，那也意味着，如果受害用户使用 RDP 登录到已经被入侵的主机上，凭证会留在被入侵的主机的内存之中，并且即便断开连接也不会让凭证消失。进而攻击者可以通过 Mimikatz 之类的工具导出凭证。我们甚至可以利用 BoF RdpThief ([https://github.com/0x09AL/RdpThief](https://github.com/0x09AL/RdpThief)) 实现窃取明文密码，原理是检测 mstsc.exe 进程并且通过 API Hooking 来劫持明文凭证的输入。

此外，我们在之前章节提到过**受限管理员模式**，它可以解决凭证窃取的问题，但也可以让攻击者在不知道被攻陷的用户的明文密码的情况下实现 RDP 横向移动。

以及，我们来讨论一下 RDP 劫持。在 Web02 上，我们是以 serveradm 用户的身份交互式完成交互式登陆的，在任意一主机上以本地管理员帐号 **administrator : Passw0rdweb02** 以 RDP 访问 Web02，这样，Web02 上就同时有着至少这 2 个交互式登陆了。我们可以通过**任务管理器**确认这一点。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/PXuTj4eDcFjQbrvE-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/PXuTj4eDcFjQbrvE-image.png)

我们可以切换至另一个用户，但需要提供密码。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/p9skH2HPEDyKvAGK-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/p9skH2HPEDyKvAGK-image.png)

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/wFLBC46lejINNEaf-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/wFLBC46lejINNEaf-image.png)

输入正确的密码后，我们当前的会话会从 serveradm 切换至 Administrator 了。那么，我们怎么样可以不需要密码就能切换至另一个用户呢？我们需要提升至 SYSTEM 权限，可以通过 PsExec 或者 **PowerRunAsSystem** ([GitHub - DarkCoderSc/PowerRunAsSystem: Run application as system with interactive system process support (active Windows session)](https://github.com/DarkCoderSc/PowerRunAsSystem)) 实现。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/GyKIVfzuCninoduD-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/GyKIVfzuCninoduD-image.png)

然后执行如下命令：

```powershell
cmd /k tscon <想要切换至的 ID> /dest:console
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/7Rg1w0VJUbQRLjVX-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/7Rg1w0VJUbQRLjVX-image.png)

很快，我们就又切换回去了，并不需要输入密码。那么，这有什么作用呢？当我们拿到了一台主机的最高权限，如果这时候还有其他用户正在通过 RDP 连接该主机，我们可以劫持他们的 RDP 会话，以观察与推测他们当前进行的操作。不过这么做，多多少少会有些不隐蔽，但其他用户可能只是以为网络波动、其他人恰好也在连接。

2 周前，一款基于 **TinyNuke** ([https://github.com/rossja/TinyNuke)](https://github.com/rossja/TinyNuke)) 的名为 **HiddenDesktop** ([https://github.com/WKL-Sec/HiddenDesktop](https://github.com/WKL-Sec/HiddenDesktop)) 的 BOF 解决了 RDP 会话劫持中**挤下线**的问题，即可以在用户不知情的情况下与他的桌面会话交互，效果可以如下所示：

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/EuCsG300OGJVtM1i-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/EuCsG300OGJVtM1i-image.png)

因为 HiddenDesktop 的服务器需要在 Windows 主机上运行，因此团队服务器需要能连通一台 Windows 主机。

此外，RDP 的**连接选项**可以高度自定义化，其中对于攻击者非常有用的有**磁盘映射**，即在 RDP 服务器上可以访问到 RDP 客户端的本地磁盘。我们在 Dc05 上发起对 Web02 的 RDP 连接，勾选磁盘映射，以 Web02\\Administrator 身份。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/U0u7Ivh9O0PZV04m-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/U0u7Ivh9O0PZV04m-image.png)

尽管 RDP 客户端会警告用户可能的风险，但因为磁盘映射并不是默认选项，用户既然这么配置了说明他有这样的需求，例如更加方便的**文件传输**、**软件安装**、**数据备份**等。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/vG47PVNp1XkvCiKK-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/vG47PVNp1XkvCiKK-image.png)

当连接成功创建后，发起 RDP 的用户可以通过 UNC 路径 **\\\\tsclient** 来访问映射的磁盘。因为连接从 Dc05 发起的，那么可以通过 **\\\\tsclient\\c** 访问到 Dc05 的 C 盘。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/d30n67beB38S3nWO-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/d30n67beB38S3nWO-image.png)

不仅如此，还具有**读写**权限，因为对于 RDP 客户端主机的文件系统的权限与发起的用户 white-bird\\administrator 是一致的。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/j6CTEDpJwrexjogd-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/j6CTEDpJwrexjogd-image.png)

但是，这个 UNC 路径只有在 **RDP 会话中**才能访问到，作为攻击者，可以劫持该 RDP 会话，但是势必会引起警惕。更隐蔽的方法是向 RDP 的会话进程**注入载荷**，得到新的 Beacon，然后访问该 UNC 路径。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/OO3YHMjEFCFgDAIP-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/OO3YHMjEFCFgDAIP-image.png)

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/H1ft9kOlE8lsSOGF-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/H1ft9kOlE8lsSOGF-image.png)

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/6tF2THUtJ3QwZEoa-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/6tF2THUtJ3QwZEoa-image.png)

目前我们寄居在这个 RDP 的进程中，但只要用户访问结束退出连接，我们的 Beacon 也会丢失。但既然目前我们有写权限了，回想一下，怎么做可以返回一个稳定的 Beacon 呢？