RDP
在 Windows 系统中,远程桌面能提供 GUI 的远程访问,在企业环境里使用极多,对于攻击者而言也是一种天然的横向移动的方式。如果我们已经拥有了受害用户的明文密码,并且受害用户是其他主机的本地管理员或者是 Remote Desktop Users 组成员,那么我们便可使用 mstsc.exe,即 RDP 客户端远程访问。在 Linux 平台,我们可以使用工具 xfreerdp 或者 rdesktop。
RDP 远程登陆是典型的交互式认证情景,交互式登陆需要明文密码,那也意味着,如果受害用户使用 RDP 登录到已经被入侵的主机上,凭证会留在被入侵的主机的内存之中,并且即便断开连接也不会让凭证消失。进而攻击者可以通过 Mimikatz 之类的工具导出凭证。我们甚至可以利用 BoF RdpThief (https://github.com/0x09AL/RdpThief) 实现窃取明文密码,原理是检测 mstsc.exe 进程并且通过 API Hooking 来劫持明文凭证的输入。
此外,我们在之前章节提到过受限管理员模式,它可以解决凭证窃取的问题,但也可以让攻击者在不知道被攻陷的用户的明文密码的情况下实现 RDP 横向移动。
以及,我们来讨论一下 RDP 劫持。在 Web02 上,我们是以 serveradm 用户的身份交互式完成交互式登陆的,在任意一主机上以本地管理员帐号 administrator : Passw0rdweb02 以 RDP 访问 Web02,这样,Web02 上就同时有着至少这 2 个交互式登陆了。我们可以通过任务管理器确认这一点。
我们可以切换至另一个用户,但需要提供密码。
输入正确的密码后,我们当前的会话会从 serveradm 切换至 Administrator 了。那么,我们怎么样可以不需要密码就能切换至另一个用户呢?我们需要提升至 SYSTEM 权限,可以通过 PsExec 或者 PowerRunAsSystem (GitHub - DarkCoderSc/PowerRunAsSystem: Run application as system with interactive system process support (active Windows session)) 实现。
然后执行如下命令:
cmd /k tscon <想要切换至的 ID> /dest:console
很快,我们就又切换回去了,并不需要输入密码。那么,这有什么作用呢?当我们拿到了一台主机的最高权限,如果这时候还有其他用户正在通过 RDP 连接该主机,我们可以劫持他们的 RDP 会话,以观察与推测他们当前进行的操作。不过这么做,多多少少会有些不隐蔽,但其他用户可能只是以为网络波动、其他人恰好也在连接。
2 周前,一款基于 TinyNuke (https://github.com/rossja/TinyNuke) 的名为 HiddenDesktop (https://github.com/WKL-Sec/HiddenDesktop) 的 BOF 解决了 RDP 会话劫持中“挤下线”的问题,即可以在用户不知情的情况下与他的桌面会话交互,效果可以如下所示:
此外,RDP 的连接选项可以高度自定义化,其中对于攻击者非常有用的有磁盘映射,即在 RDP 服务器上可以访问到 RDP 客户端的本地磁盘。我们在 Dc05 上发起对 Web02 的 RDP 连接,勾选磁盘映射,以 Web02\Administrator 身份。
尽管 RDP 客户端会警告用户可能的风险,但因为磁盘映射并不是默认选项,用户既然这么配置了说明他有这样的需求,例如更加方便的文件传输、软件安装、数据备份等。
当连接成功创建后,发起 RDP 的用户可以通过 UNC 路径 \\tsclient 来访问映射的磁盘。因为连接从 Dc05 发起的,那么可以通过 \\tsclient\c 访问到 Dc05 的 C 盘。
不仅如此,还具有读写权限,因为对于 RDP 客户端主机的文件系统的权限与发起的用户 white-bird\administrator 是一致的。
但是,这个 UNC 路径只有在 RDP 会话中才能访问到,作为攻击者,可以劫持该 RDP 会话,但是势必会引起警戒惕。更隐蔽的方法是向 RDP 的会话进程注入载荷,得到新的 Beacon,然后访问该 UNC 路径。
目前我们寄居在这个 RDP 的进程中,但只要用户访问结束退出连接,我们的 Beacon 也会丢失。但既然目前我们有写权限了,回想一下,怎么做可以返回一个稳定的 Beacon 呢?