利用远程桌面执行命令的另类用法
2020-03-27 09:58:09 Author: www.4hou.com(查看原文) 阅读量:237 收藏

攻击者正在寻找新的技术来进行横向移动,这已经不是什么秘密了。 然而,通常使用的公众都知道的技术屈指可数。 这篇文章并没有强调一种新的横向移动技术,而是提供了一种在你最喜欢的命令和控制(C2)平台上利用已知方法的新方法。 我将展示如何利用远程桌面协议(Remote Desktop Protocol,RDP)对目标执行非图形身份验证的远程命令。 当使用 RDP 进行横向移动时,攻击者通常会启动 SOCKS 代理,使用 RDP 应用程序 / 客户端,执行有效载荷,并关闭会话。 但是这样做总是让人觉得执行一次行动是多余的开销。

在没有 SOCKS 代理或 GUI RDP 客户端的情况下,通过现有的 C2通道执行 RDP 横向移动的想法似乎总是可行的,但并没有人真正公开讨论过。 在搜索现有工作的过程中,我发现了几个留言板和论坛,人们在上面提到了这个想法,并发布了一些小的代码片段,但我从未找到一个完全武器化的版本。 在编译完全不同的信息和代码并与同事讨论这个主题之后,我有了一个可以开始工作的起点。

最终,我发现 Windows 有一个库 mstscax.dll,可以访问任何可能的 RDP 操作,并且几乎被所有 RDP 客户端使用,包括远程桌面连接或 Royal TSX。 此 DLL 是用于微软终端服务的 ActiveX COM 库。 通过利用这个 DLL,攻击者可以创建一个通过 RDP 执行经过身份验证的远程命令执行控制台应用,而不需要 GUI 客户端或 SOCKS 代理。

今天,我发布了 SharpRDP工具,它是一个 . Net 控制台应用,可用于为横向移动的目的对远程目标执行经过身份验证的命令。

它是如何工作的

终端服务库(mstscax.dll)有两种不同的形式可以使用,一种是 web 客户端或脚本可以使用的脚本控件,另一种是本机代码或托管代码中使用的非脚本控件。 SharpRDP 依赖于 COM 库的非脚本控件。 Activex 导入器 aximp.exe,它是 .Net SDK 的一部分,能从 mstscax.DLL 中生成适当的 DLL 例如 MSTSCLib.DLL 和 AxMSTSCLib.DLL。 Dll 包含库的托管定义,而 AxMSTSCLib.dll 包含 ActiveX 类的 Windows Form 控件。 两个 dll 都包含执行横向移动所需操作需要的类。

点击查看演示视频

图1——通过 CobaltStrike 执行 SharpRDP

Windows 窗体在终端服务连接对象实例化过程中使用,因此我们创建了一个 Windows 窗体对象,该对象对于我们正在执行的用户是不可见的。 通过这种形式,我们可以调用方法来执行所有横向运动步骤所需的动作,例如:

· 连接

· 认证

· 对目标的操作(命令执行)

· 与主机断开连接

这些操作中的每一个都被注册为事件和事件处理程序,这些事件和事件处理程序决定了要采取的操作过程。

有两种方法进行身份验证,要么提供纯文本凭证(可能是最常见和最有用的场景) ,要么使用受限管理模式的当前用户上下文。 受限管理模式是一种 Windows 保护机制,它执行网络类型登录而不是交互式登录,以防止在 RDPing 到主机时缓存凭据。 这通常会被攻击者通过 RDP 传递哈希进行滥用。

验证之后,SharpRDP 通过一个名为 SendKeys 的方法向远程系统发送虚拟按键。 由于 SharpRDP 目前只支持按键,默认情况下,这将打开一个运行对话框并输入指定的命令。 此外,还可以作为 Cmd.exe 或 PowerShell.exe 的子进程运行,这些进程将从运行对话框中产生。

OPSEC 考虑因素——当从运行对话框中运行任何内容时,将在 HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU  中创建一个注册表条目,显示输入到框中的内容。 出于横向移动的目的,在建立一个新的代理之后,建议使用 CleanRunMRU 来清除刚刚执行的命令。

为了使用 C2工具,比如 Cobalt Strike,需要克服两个小障碍。 首先,需要将两个 dll 编译到程序集中。 因为 MSTSCLib.DLL 和 AxMSTSCLib.DLL 中都有我们需要的方法,所以我们需要把它们作为资源添加并编译到程序集中。 应用程序域程序集解析事件用于捕获不在同一目录中的 dll 加载失败的情况并加载添加的资源。 其次,dll 的组合大小大约略小于1.5 MB,通过将这些 dll 编译到程序集中,它使其大于了 Cobalt Strike 对程序集大小的限制(1mb)。 为了克服这个问题,这两个dll都被压缩为资源,并在调用程序集解析事件时进行解压以获得可用性。

用例

有时候 RDP 会是执行横向移动技术的首选方法,但是使用传统的 RDP 客户端 GUI 可能会有困难。 我们想到的最常见的一种方法是尝试通过高延迟的连接使用 RDP 客户端。

其次,有了这个,我们可以减少以前使用 RDP 时的大量开销,现在就像通过 C2植入运行单个命令一样简单。 对于 RDP,一般情况下,当我们在系统上没有本地管理特权,但是对该系统拥有 RDP 权限时,我们可以使用它,这可以从 BloodHound (图2)或者是你最喜欢的侦察工具中看到。

 image.png

图2—— BloodHound 显示了当前用户拥有 RDP 权限的主机

正如前面提到的,除非目标主机启用了限制性的管理模式(HKLM\ System\ CurrentControlSet\ Control\ Lsa DisableRestrictedAdmin设置为0) ,否则这个工具通常需要纯文本凭证,它将从当前用户上下文执行。 如果命令中没有提供凭据,它将退回到尝试使用受限制的管理模式验证到当前上下文。

虽然这个工具有它的用途,但也有一些情况是它不能处理的。

· 双重身份验证: 目前无法处理 MFA 身份验证,SharpRDP 将断开会话。

· UAC 绕过——如果操作员希望在特权环境下操作,他们需要为新执行的命令设置升级特权或绕过 UAC

· 文件移动—— SharpRDP 不具备在 RDP 协议上复制或移动文件的能力。 如果3389是主机上唯一打开的端口,你将无法使用此工具将文件拖放到目标上

SharpRDP 已经公开,可以在这里找到

攻击检测

在引擎盖下,这个工具使用与其他 RDP 客户使用的相同的方法,但仍然有工具和技术特定的指标。

RunMRU 注册表项——如前所述,因为 SharpRDP 依赖于向目标系统发送按键,并通过 Windows 运行对话框执行命令。 在运行对话框中输入某些内容并运行时,将在 HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU 创建一个注册表条目,显示已执行的命令历史记录。 如果攻击者没有清理这个条目,就会留下他们执行了什么命令取证指示器。

父子进程关系——通过 SharpRDP 执行的任何命令的父进程都是 Explorer.exe,除非命令执行类型设置为 Cmd 或 PS,那么继承关系就是 explorer -> cmd 或 explorer -> ps。

Windows 事件日志——监视 Windows 事件 ID (EID)4624 的类型为 10或 类型为 3(如果启用 NLA 或受限管理)登录到目标主机,以获得远程登录活动的证据。

非标准模块加载——一个更健壮的技术聚焦检测可以查找加载到不是 mstsc.exe (或环境中使用的其他基线 RDP 应用程序)的进程中的 mstscax.dll。 这可以在图3中看到,其中进程 rundll32 可以将 DLL 加载到其中。

image.png

图 3 — Rundll32已将mstscax.dll加载到Rundll32进程中 

在 %LOCALAPPDATA%\Local\Microsoft\Terminal Server Client\cache 中查找RDP BMC缓存文件可以显示攻击者的一些操作行为。

使用TCP 3389的非标准进程——查找不是通过TCP端口3389通信的mstsc.exe(或预定义的基线RDP客户机)的进程。

虽然目前已经有人给出了一些基本的检测逻辑,但从攻击者的角度来看,对于遗留下来的取证分析工作,RDP可能是一个难以使用的协议。JPCert 发布了一些关于RDP检测和取证分析的优秀信息

未来的工作

用例部分强调了 SharpRDP 当前状态中缺少的一些领域,并将在未来解决这些问题。 此外,还有一些功能需要修复(例如,确保正确传递哈希值(假定启用了受限制的管理模式) ,以便明文或当前上下文不是唯一的身份验证方法)。 我计划积极维护项目,任何报告的问题或要求的改进将被修正或考虑。

本文翻译自:https://posts.specterops.io/revisiting-remote-desktop-lateral-movement-8fb905cb46c3如若转载,请注明原文地址:


文章来源: https://www.4hou.com/posts/8BZr
如有侵权请联系:admin#unsafe.sh