恶意RDP攻击:重访初始访问技术

本文探讨了利用恶意RDP服务器、RDP中继和武器化.RDP文件进行初始访问的技术,包括文件枚举、二进制植入和数据窃取方法,并介绍了pyrdp开源工具的使用和防御措施。

恶意RDP攻击:重访初始访问方法

Mike Felch //

寻找初始访问途径

随着微软默认禁用来自互联网的VBA宏,威胁行为者和红队可能面临初始访问难度增加的问题。过去一年中,我投入时间研究使用远程桌面协议(RDP)作为替代初始访问向量,本文将涵盖相关内容。

为了重获优势,我引入了一种名为“恶意RDP”(Rogue RDP)的新技术。它利用恶意RDP服务器、RDP中继和武器化的.RDP连接文件,迫使不知情的受害者连接并转发其机器部分控制权。通过适当伪装,建立的连接将为攻击者提供访问文件、植入二进制文件执行以及在适当条件下执行远程代码的手段。

首先,我快速识别了Windows中注册的默认扩展及其对应的执行程序。使用PowerShell的ftypeassoc内置命令,我生成了扩展名、文件类型和可执行文件的网格。此外,我还为每个扩展生成了文件,以便通过点击测试默认执行行为。

查看扩展和可执行文件网格

1
2
C:\> $fm = @{}; cmd /c ftype | foreach { $ft, $ex = $_ -split '='; $fm.add($ft,$ex); }
C:\> cmd /c assoc | foreach { $e, $f = $_ -split '='; [pscustomobject]@{Extension = $e; FileType = $f; Executable = $fm[$f]; } } | out-gridview

从扩展生成文件

1
C:\> cmd /c assoc | foreach { $e, $f = $_ -split '='; "hax" > "hax$e"; }

在随机点击文件并调查启动的程序后,一个扩展不断引起我的注意:RDP!.RDP文件的优势(或危险)在于安全提供商、电子邮件网关和电子邮件客户端默认允许发送和接收.RDP文件。无论从网络浏览器下载、通过网络文件共享分享还是通过电子邮件发送,它们都能完好无损地到达目标。

截至本文发布时,Microsoft Outlook、Office365和Proofpoint的所有默认阻止附件列表都允许.RDP文件。

武器化.RDP文件

接下来,我需要确定可以在.RDP文件中利用什么进行初始访问。由于标准可执行文件是Microsoft终端服务客户端(MSTSC),这是一个合适的起点!.RDP文件包含远程桌面连接的配置设置,由于大多数企业环境使用RDP在员工之间共享计算机资源,Microsoft添加了许多功能,如文件和打印机共享、访问剪贴板内容、音频和视频捕获设备、智能卡甚至即插即用设备。

在过去18年中大量使用RDP后,我最初的想法是专注于迫使不知情受害者将其本地文件系统和剪贴板映射到我控制的恶意RDP服务器。这样,我可以在我的服务器上执行恶意程序,与受害者(其MSTSC客户端)文件系统交互。这被证明是成功的,因为Microsoft提供了一种巧妙的方式,让在终端服务器环境中运行的代码使用设备重定向与终端服务器客户端交互。这种能力是通过远程桌面访问本地驱动器和打印机等资源的方式。服务器可以使用文件夹路径(如\\tsclient\c\用于C驱动器)甚至挂载的网络文件共享(使用\\tsclient\<映射共享的驱动器>\)枚举连接客户端的映射文件系统。

例如,客户端的计算机有以下挂载路径:

  • 本地磁盘(C:)
  • USB驱动器(D:)
  • 网络文件共享(S:)

它们可以通过以下方式访问:

  • 本地磁盘:\\tsclient\c\
  • USB驱动器:\\tsclient\d\
  • 网络文件共享:\\tsclient\s\

自带服务器(BYOS)

为了与客户端交互,我们需要一些面向互联网的基础设施。它不必复杂,但.RDP文件需要连接到我们控制的服务器,以便我们可以与客户端交互。大多数在互联网上启用RDP的Windows服务器不会持续很长时间,就会被试图暴力访问的威胁行为者淹没。为了遏制这种行为,我建议将RDP端口修改为更高的随机端口。此外,通过防火墙阻止自己的IP地址以暂时禁用RDP访问进行测试。我们将在后文进一步减少暴露,但现在您只需要:

  • 标准Windows服务器
  • 启用远程桌面
  • 添加具有RDP权限的新用户

使用PowerShell,您可以修改RDP监听端口:

1
2
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -name "PortNumber" -Value 21390
New-NetFirewallRule -DisplayName 'RDPPORTLatest' -Profile 'Public' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 21390

如果我们停在这里,有几个问题对我们的不知情目标变得明显。首先,对于初始访问,我们总是希望减少要求受害者进行的交互次数。这很困难,因为为了让他们的客户端自动连接到我们的服务器,我们必须在发送给他们的.RDP文件中预加载凭据,由于数据保护API(DPAPI),这在现在是不可能的。我们可以使用空白账户密码,但这也需要奇怪的交互,更不用说它暴露我们的服务器给任何能猜出用户名的人。因为我们的RDP服务器身份目前未验证和未知,发布者看起来非常可疑,带有大的黄色警告横幅。最后,如果目标网络阻止了出站端口3389怎么办?虽然我们有许多障碍要克服,但我们将尝试解决所有这些问题!

在思考解决这些困难的方法时,我开始考虑编写某种RDP代理的想法。在深入研究RDP协议并快速意识到众多层的复杂性目前会花费太多努力后,我开始寻找可能已经实现了一些通信和认证通道的开源项目。我希望设置某种监听器,可以将流量转发到我的服务器,然后让受害者客户端连接到我的代理。这将消除凭据漂浮的问题,并让我能够自动认证连接的受害者。此外,它增加了额外的防火墙保护层,以便只有代理能够连接到真实的RDP服务器。

事实证明,有一个惊人的开源项目叫pyrdp,已经实现了大部分协议!它充当中间人(MiTM)代理,不仅允许您自动认证,还可以在任何端口上设置监听器,甚至记录实时RDP连接。它有许多内置功能,如自动提取匹配签名的文件、在真实服务器(非客户端机器)上运行命令或PowerShell脚本、监控剪贴板甚至克隆证书。

参考:https://www.gosecure.net/blog/2018/12/19/rdp-man-in-the-middle-smile-youre-on-camera

我将省略实现细节,但如果您查看上图,您会注意到必须实现的众多协议、认证层和设备重定向。协议包括通过RC4算法的128位加密、用于GUI的疯狂位图绑定、用于与操作系统交互的虚拟通道(磁盘/打印机/剪贴板等),以及一系列其他认证、编码和通信规范。

这为我们提供了预加载.RDP文件配置的能力,使用任何用户名、我们的代理主机名、我们的代理监听端口(以避免潜在防火墙)并启用转发所有驱动器、打印机和设备。一旦我们生成了.RDP文件,我们可以使用LetsEncrypt为我们在代理服务器上想要使用的任何域生成SSL证书,然后使用OpenSSL将证书转换为PFX文件。在Windows机器上,您可以将PFX导入证书存储,并使用名为rdpsign.exe的内置Windows实用程序签署.RDP文件。可能有更简单的方法来完成所有这些。通过用您的LetsEncrypt证书签署.RDP文件,我们现在有了一个看起来更安全的连接对话框!

RDP攻击

随着我们的pyrdp代理运行并指向我们的真实Windows服务器,我们需要的只是一些在登录会话建立后执行的代码。客户端将通过MSTSC连接到我们的代理,我们的代理将自动认证到我们的服务器,并在受害者客户端和我们的服务器之间发生双向通信。这意味着客户端的驱动器将被我们的代理和服务器访问。

二进制植入和数据窃取

我最喜欢的.RDP攻击是枚举映射的驱动器,然后识别可写的启动位置,以便植入恶意负载。因为代码在我的服务器上运行,EDR在预防和响应方面大多无用,除非它检测到文件写入活动或后来的执行。以下是一些考虑事项:

  • 如果您在用户桌面上植入LNK,键盘快捷键不会触发执行,直到客户端计算机重启
  • 在常见的自动运行位置植入二进制文件
  • 植入DLL用于侧加载(例如,用于Microsoft Teams的dbghelp.dll)
  • 植入.NET配置/二进制文件用于AppDomainManager注入

您还可以搜索敏感数据/文件。根据我目标的对象,我喜欢寻找像AWS/Azure凭据和PowerShell历史文件这样的东西。

远程代码执行

如果客户端启用了Hyper-V并具有可写文件共享,您有可能立即执行代码,尽管我还没有发现这是真实世界的红队经验。一位名为Abdelhamid Naceri的研究员介绍了一种方法,通过NTFS符号链接将负载写入C:\Program Files\Hyper-V\wfs.exe,然后由于控制代码调度,通过客户端打印机名称使用打印机重定向触发Microsoft Windows传真和扫描执行。

高级RDP策略

一个很酷的技术是监控和/或植入剪贴板内容的能力。当我在进行一些测试时,我在Windows虚拟机内执行.RDP文件,但捕获主机计算机的剪贴板内容。这是因为我的主机剪贴板映射到我的虚拟机,当虚拟机连接到我的恶意RDP服务器时,它正在设置剪贴板重定向器。此外,因为我在虚拟机内启用了共享,我的一个主机文件夹也可以从RDP服务器访问。

最终想法

虽然我已经自动化了部署pyrdp和生成/签署RDP文件的大部分繁重工作,但我暂时不发布工具RogueRDP。目前似乎只有少数补救措施值得提及。对于那些对实现一些服务器端代码感兴趣的人,我鼓励您查看Cassia C#库。

  • 阻止电子邮件的.RDP扩展
  • 正确配置GPO以防止重定向

组策略设置

1
计算机配置\管理模板\Windows组件\远程桌面服务\远程桌面会话主机

此外,考虑.RDP文件的传递方法。我通常使用电子邮件,但常见的聊天程序甚至日历注入也很有效。在某些情况下,社交网络也允许.RDP文件。鉴于情况,这是一个优秀的攻击向量,除非微软进行补救,否则将在未来几年内证明是富有成果的。

我故意在本文中保留了一些实现细节的模糊性,直到我们从供应商那里获得一些减少攻击面的动力,以及公司限制其终端服务配置的机会。此外,它为感兴趣的读者决定如何实现他们的Windows服务器、服务器端代码和RDP中继留下了机会,而不将钥匙交给威胁行为者。一个例子是,我倾向于设置我的中继监听常见端口,以防目标网络阻止出站端口3389,然后使用pyrdp提取有趣的文件,而不是从我的恶意Windows服务器运行枚举代码。

有关恶意RDP技术的更多信息,请关注我在Wild West Hacking Fest的演讲“社会可接受的走进前门的方式”,我和Steve Borosh(@rvrsh3ll)去年在Deadwood 2021上进行了演讲。我期待其他研究人员调查执行远程代码的方法,甚至建立RDP会话的其他方式(咳嗽 我在看你们RDP COM对象 咳嗽)。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计