使用 Sysmon 来检测利用 CMSTP 绕过 UAC 的攻击

背景

当我前几天仔细阅读MITRE的ATT&CK框架以了解我不太熟悉的技术时,我遇到了听起来模棱两可的CMSTP(T1191 in ATT&CK),MITRE状态可用于绕过UAC和代码执行。据说最近也被一个国家的攻击者使用过,所以我想研究一下潜在的检测策略,并思考可能的盲点。

初步研究发现,CMSTP是一个旧的远程访问配置工具,它附带一个名为Config Manager Admin Kit的配置向导。该向导将输出一个INF配置文件,可以在各个维度上实现武器化。

使用CMSTP调用武器化INF可以运行任意脚本(本地和远程)并绕过用户帐户控制,从而将安全上下文从中等完整性提升到高完整性。

由于CMSTP是一个位于System32目录中合法的Microsoft签名二进制文件,这意味着攻击者可以登陆系统,利用CMSTP绕过配置不佳的应用程序白名单列表,并通过WebDAV获得提权的shell或远程下载任意代码。

为了获得更多的背景资料,OddvarMoe撰写了一些关于CMSTP是如何工作的研究,这为我提供了一个很好的基础。

本文将探讨在尝试沿着这些不同的方法检测CMSTP利用时的各种注意事项,使用Windows Sysinals的Sysmon工具,使用Swift on Security的基本配置,GitHub地址

 

CMSTP滥用向量

我调查了三种不同类型的CMSTP滥用的检测策略,它们都涉及任意代码执行,其中两种允许绕过UAC执行代码:

  1. 调用武器化的.INF安装文件来运行包含恶意VBScript或JScript代码的本地或远程.SCT脚本。
  2. 调用武器化的.INF文件来运行本地可执行文件,同时启用UAC绕过/提升完整性级别,从而允许提升shell。
  3. 直接利用CMSTP连接到的COM接口,允许更隐蔽的UAC绕过。

让我们深入研究每种方法的检测注意事项。

方法1-INF-SCT启动

Bohops写了一篇很棒的文章,有一些关于INF-SCT获取和执行技术的背景。

要点是,可以修改恶意INF文件中的“UnRegisterOCXSection”来调用scrobj.dll,并让它执行包含恶意VBScript或JScript代码的本地脚本或远程获取的.SCT脚本。

让我们看一个示例(T1191.inf),对应CMSTP Mitre Technique (T1191),它是从Atomic Red Team repo中下载的:

执行命令“cmstp.exe /s t1191.inf”将下载并执行位于https://raw.githubusercontent.com/redcanaryco/atomic-red-team/master/atomics/T1191/T1191.sct 的SCT脚本。

该脚本如下所示:

在事件查看器中深入挖掘Sysmon日志后,我们看到生成了几个Sysmon事件。注意,生成的calc.exe具有c:windowssystem32cmstp.exe作为ParentImage,而IntegrityLevel是Medium,即没有出现完整性提升。

现在让我们看看Sysmon 3网络连接。其中一个连接看起来是通过一个高数目的端口连接到本地主机。另一个显示了cmstp.exe通过443端口作为Image访问到151.101.120.133(Gitrub)。

因此,方法1潜在的Sysmon检测规则可能是:

  • Sysmon Event 1,其中ParentImage包含cmstp.exe
  • Sysmon Event 3,其中Image包含cmstp.exe,DestinationIP是外部的

方法2-通过INF RunPreSetupCommandSection 实现绕过UAC

正如Odvar Moe在他的研究中发现的那样,事实证明INF文件中的RegisterOCXSection并不是唯一容易被武器化的部分。查看由Connection Manager Admin Kit生成的另一个INF文件,可以插入任意二进制文件,以便在RunPreSetupCommandSection下执行。在本例中,我们生成一个shell,然后清除cmstp可执行文件。

这个方法在命令行上与在方法1中略有不同,需要一些新选项,确保在弹出的对话框中选中了“All Users/所有用户”,然后单击OK。

然后我们就有了shell。请注意,与前面的方法不同,可执行文件以这种方式运行,在不通知用户的情况下提升了它们的安全上下文,从而绕过UAC。我们将在方法3中研究一种更隐蔽的方法来实现这一点,该方法不涉及弹出窗口。

注意Sysmon 12和Sysmon 13注册表value add和value set事件:

Dllhost.exe在Sysmon 12中创建对象cmmgr32.exe,然后在随后的Sysmon 13中将ProfileInstallPath值设置为C:ProgramDataMicrosoftNetworkConnectionsCm。

让我们看看实际上产生cmd.exe的Sysmon 1事件:

与方法1不同的是,在方法1中,cmstp.exe是ParentImage,目标二进制文件是子文件,这里Dllhost.exe是父文件。

我们在ParentCommand行字段中看到,Dllhost.exe使用带有某种GUID的ProcessID选项。为了理解GUID在那里做什么,我们将重新运行,但这次使用修改的Sysmon配置,允许我们获得Sysmon事件10s进程访问。

为了限制事件10的收集孔径,避免系统陷入停顿,我们将遵循Tim Burrell的做法,在这里设置Sysmon,以便我们只提取那些请求高度特权级别的进程访问的Sysmon 10事件,或者在CallTrack中包含一个“unknown”字符串:

我们需要让Sysmon知道通过运行以下命令来使用更新后的配置:

sysmon -c <modified_config.xml>

重新运行时,我们会看到另外几个Sysmon 10事件。其中特别有趣的是,Dllhost.exe访问TargetImage cmd.exe。

注意CallTrack数据。其中一个被调用的DLL是cmlua.dll,[@hFireF0X]将它作为包含一个名为CMLUAUTIL的自动提升的COM接口调用。当我们使用方法3时,我们将再次看到CMLUAUTIL。现在,让我们回顾一下方法2的潜在检测:

  • Sysmon 1,其中ParentImage包含dllhost.exe,Image包含cmd.exe
  • Sysmon 10,其中CallTrack包含cmlua.dll
  • Sysmon 12或13,其中TargetObject包含cmmgr32.exe

方法3-通过COM接口直接利用UAC绕过

正如@hFireF0X在他的tweet中所说的,cmlua.dll分别通过cmlua.dll和cmstplua.dll引用自动提升COM接口CMLUAUTIL和CMSTPLUA。在他的UAC绕过项目UACME(https:/github.com/hfire0x/UACME)中,列举了几个实现绕过的方法,但是#41包含了一个PoC,可以执行我们在方法2中看到的相同的攻击,除了不处理cmstp.exe,它是弹出对话框,并且依赖DLL与COM接口进行对接,我们直接与它们进行对接。

如果使用这个方法,对Sysmon可见性的潜在影响是什么?

要在2018年7月开始执行这种UACME驱动的攻击,我们需要在“Compiled”和“Source”目录仍然有效的情况下获取UACME REPO的前一次提交(他已经删除了我们所需的可执行文件,因此需要使用2018年5月或6月的提交)。在Compiled目录下,让我们运行“Akagi32.exe 41”。

如果我们回到方法2中所分析的Sysmon 10事件,其中Dllhost.exe访问cmd.exe并查看CallTrack,则没有提到cmlua.dll。还请注意,没有Sysmon 12或13事件。这表明查找cmlua.dll或注册表adds / mods 可能很难:

让我们重新访问Sysmon 1事件,其中dllhost.exe产生cmd.exe。事实证明,我们在ParentCommandLine字段中看到的GUID实际上是我们连接到的COM对象的类ID,在本例中是支持自动提升的CMSTPLUA。

然后,检测方法2和3的一个潜在的高级方法是在ParentCommand行中对dllhost.exe以及CMSTPLUA的GUID发出警报:

  • Sysmon 1,其中ParentCommandLine包含dllhost.exe并包含CMSTPLUA COM对象的GUID(3E5FC7F9-9A51-4367-9063-A120244FBEC7)

我需要做进一步的研究来了解如何进一步混淆,这可能不是很容易但它可能是一个很好的基础。

总之,CMSTP及其依赖关系能够促进几种不同的代码执行方法和UAC绕过,每种方法都有它自己的细微差别和影响。请注意,在将这些检测部署到生产中之前,必须对网络上正在发生的情况进行基线化,并围绕为什么实现这些检测中的任何一个都会对你产生影响做出假设。

审核人:yiwang   编辑:边边

(完)