导语:本文将探讨使用Windows Sysinternals的Sysmon工具检测CMSTP绕过UAC攻击的各种注意事项。
前言
很多微软工具可以通过多种方式被武器化或被绕过,比如用户帐户控制(User Account Control, UAC),UAC是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序损坏系统的效果。最近,我就发现了由攻击者利用CMSTP绕过UAC。
这个发现还要从前些天我阅读ATT&CK(对抗战术、技术与常识)说起,ATT&CK是在公共和私营公司、学术机构和政府机构的帮助下建立的一个全球性网络对手战术和技术知识库。该知识库能够阐明威胁,并以通用的语言和框架来定义,从而跨越多学科的障碍以推动安全性的改进。通过在许多不同的组织中收集各种各样的攻击检测分析,用户可以更好地检测到攻击者,进而创建弹性和欺骗性策略,帮助客户快速适应和应对网络攻击。之所以对ATT&CK感兴趣,是因为我想了解一些关于CMSTP(它在ATT&CK中的代号为T1191)的详细技术,根据MITRE的评估,CMSTP可用于绕过UAC,然后执行代码。The MITRE Corporation是一个向美国政府提供系统工程、研究开发和信息技术支持的非营利性组织。作为介入政府项目的第三方机构,MITRE公司是管理美国联邦政府投资研发中心(FFRDCS),包括已为美国联邦航空局(FAA)提供50多年支持的高级航空系统开发中心。
MITRE最初的研究表明,CMSTP是一个旧的远程访问配置工具,且附带有一个名为Config Manager Admin Kit的配置向导。这个向导还会弹出一个INF配置文件,帮助攻击者实施攻击。
CMSTP是一个与Microsoft连接管理器配置文件安装程序关联的二进制文件。它是一个受信任的Microsoft二进制文件,位于以下两个Windows目录中:
C:\Windows\System32\cmstp.exe C:\Windows\SysWOW64\cmstp.exe
AppLocker默认规则允许在这些文件夹中执行二进制文件,也就是说可以利用CMSTP来作为绕过的一种方法,使用CMSTP调用被武器化的INF可以运行任意脚本(本地和远程)并绕过UAC。
由于CMSTP是一个存在于System32目录中的合法签名微软二进制文件,这意味着攻击者可以登录到系统上,利用CMSTP绕过配置不当的应用程序白名单,并通过WEBDAV(Web-based Distributed Authoring and Versioning,一种基于 HTTP 1.1协议的通信协议)远程获取高级命令shell或删除任意代码。
另外,我还阅读了Oddvar Moe写的一些关于CMSTP如何工作的研究,这些都是我能够写出本文的基础。
本文将探讨使用Windows Sysinternals的Sysmon工具检测CMSTP绕过UAC攻击的各种注意事项,Sysmon工具使用Swift on Security的基准配置进行配置。
System是一款windows系统服务和设备驱动程序,安装到系统上之后,可以监控和记录windows事件日志,且不受系统重启的影响。它能够提供关于进程创建、网络链接和文件创建或更改时间等详细信息。之后再结合WindowsEvent Collection或SIEM进行分析,可以识别网络上的异常入侵或运行的恶意软件。
CMSTP如何绕过UAC
我研究了三种不同类型的检测CMSTP滥用的策略,这三种不同方法都涉及任意代码执行,且其中的两种允许我绕过UAC进行代码执行:
1.调用武器化的.INF安装文件来运行包含恶意VBScript或JScript代码的本地或远程.SCT脚本;
2.调用武器化的.INF文件以运行本地可执行文件,同时启用UAC绕过或提升完整性级别,允许生成更高的命令shell。
3.直接利用CMSTP hook的COM接口,进行更隐蔽的UAC绕过;
让我深入研究一下,检测每种绕过方法所需考虑的因素。
方法1:通过INF配置文件来执行脚本文件(.sct)
Bohops写了一篇很棒的文章,其中介绍了INF-SCT获取和执行技术的背景,其要点是可以修改恶意INF文件中的“UnRegisterOCXSection”以调用scrobj.dll,并让它执行包含恶意VBScript或JScript代码的本地或远程获取的.SCT脚本。
让我看一下从Atomic Red Team repo中提取的一个样本 (T1191.inf) ,该样本利用的就是CMSTP(它在ATT&CK中的代号为T1191)的详细技术。
执行“cmstp.exe /s t1191.inf”命令将扩展并执行位于https://raw.githubusercontent.com/redcanaryco/atomic-red-team/master/atomics/T1191/T1191.sct的SCT脚本,这个脚本(生成一个高级持久计算器)看起来是这样的。
在运行该命令之后,我就可以在事件查看器中深入了解Sysmon日志,进而看到生成的几个Sysmon事件。请注意,生成的calc.exe将c:\windows\system32\cmstp作为ParentImage,并且完整性等级为中等,即未发生完整性等级的提升。
现在让我来看看Sysmon 3网络连接,其中一个连接看起来是通过高性能数字输出端口连接到本地主机。另一个显示的cmstp.exe可通过443端口作为映像被调用到151.101.120.133(Gitrub)。
根据方法1的攻击原理,使用Sysmon进行检测的关键点是:
Sysmon Event 1,其中ParentImage包含cmstp.exe;
Sysmon Event 3,其中映像包含cmstp.exe,DestinationIP是外部的;
方法2:通过INF RunPreSetupCommandSection绕过UAC
正如Odvar Moe在他的研究中发现的那样,INF文件的RegisterOCXSection并不是唯一容易被武器化的部分。查看Connection Manager Admin Kit生成的不同INF文件,可以在RunPreSetupCommandSection下插入任意二进制文件执行。在这种情况下,就可以生成一个命令shell,然后阻止cmstp可执行文件。
在命令行上使用此方法的过程与方法1略有不同,需要一些新选项,以确保在弹出的对话框中选中“所有用户”,然后单击“确定”。
设置完成后,我就有了命令shell。请注意,与前面的方法不同,以这种方式运行的可执行文件会在不通知用户的情况下提升其安全性,从而导致UAC被绕过。我将在方法3中寻找一种不涉及弹出窗口的更隐蔽的方法。
请注意Sysmon 12和Sysmon 13注册表中的value add和value set:
Sysmon 12的value add
Sysmon 13 的value set
Dllhost.exe在Sysmon 12中创建对象cmmgr32.exe,然后在随后的Sysmon 13中将ProfileInstallPath值设置为C:\ProgramData\Microsoft\Network\Connections\Cm。
让我来看看实际生成cmd.exe的Sysmon 1事件:
与方法1不同,其中cmstp.exe是ParentImage,目标二进制文件是子项,此处Dllhost.exe是父项。
我在ParentCommandLine字段中看到Dllhost.exe使用ProcessID选项,看起来是某种GUID。要了解GUID的运行过程,我将重新运行攻击,但这次使用修改过的Sysmon配置,该配置允许我获取Sysmon Event 10(进程访问)。
为了限制Sysmon Event 10的收集范围并避免使系统崩溃,我会使用Tim Burrell的方法并设置Sysmon,这样我就只提取那些请求高权限进程的Sysmon 10事件访问或包含CallTrace的“unknown” 字符串:
我需要让Sysmon知道如何使用更新后的配置:
sysmon -c <modified_config.xml>
重新运行攻击,我就看到了几个额外的Sysmon 10事件,特别是Dllhost.exe访问TargetImage cmd.exe的过程很有趣。
请注意CallTrace数据,其中一个被称为cmlua.dll的DLL,@hFireF0X称它为包含一个名为CMLUAUTIL的自动升级COM接口。当讲到方法3时,我将再次看到CMLUAUTIL。现在,让我来总结一下方法2包含的检测要素:
Sysmon 1,其中ParentImage包含dllhost.exe,映像包含cmd.exe,不过这种策略可能会产生大量噪音,但也会然你避免受到CMSTP的攻击;
Sysmon 10,其中CallTrace包含cmlua.dll;
Sysmon 12或13,其中TargetObject包含cmmgr32.exe;
方法3:通过直接利用COM接口绕过UAC
正如@ hFireF0X在他的推文中所述,cmlua.dll分别通过cmlua.dll和cmstplua.dll调用自动升级的COM接口CMLUAUTIL和CMSTPLUA。在他的UAC 绕过探索项目UACME(https://github.com/hfiref0x/UACME)中,总共列举了几种执行旁路的方法,但是#41包含了一个概念证明,可以执行我在方法2中说明的那种攻击,唯一的区别是不处理cmstp.exe可执行文件,因为它是一个弹出对话框,并依赖DLL与COM接口链接,不过我可以直接与COM接口链接。
如果要使用这种方法,如何使用Sysmon进行检测?
我在2018年7月,测试了一下这个UACME驱动的攻击,不过我需要获取UACME报告,其中“Compiled”和“Source”目录仍然存在(不过已经删除了我需要的任何可执行文件)。在Compiled目录下,我运行了“Akagi32.exe 41”。
如果返回我在方法2中分析的Sysmon 10事件中,其中Dllhost.exe负责访问cmd.exe并查看CallTrace,里面并没有提及cmlua.dll。请注意,没有Sysmon 12或13事件。这表明寻找cmlua.dll或 registry adds / mods可能有风险。
找不到cmlua.dll
现在,我会重新访问Sysmon 1事件,其中dllhost.exe生成了cmd.exe。事实证明,我在ParentCommandLine字段中看到的GUID实际上是我要连接的COM对象的类ID,本文所用的样本是安全性自动提升的CMSTPLUA。
然后检测攻击方法2和攻击方法3的潜在方法是在ParentCommandLine中的dllhost.exe以及CMSTPLUA的GUID上发出警报:Sysmon 1,其中ParentCommandLine包含dllhost.exe并包含CMSTPLUA COM对象的GUID(3E5FC7F9-9A51-4367-9063-A120244FBEC7)
不过,我还需要做进一步的研究,以弄清楚攻击者是如何混淆的。
总而言之,CMSTP及其相关的一些配置能够让攻击者找到一些非常规的代码执行和绕过UAC的方法,且每种方法都有自己对应的检测招数。请注意,部署任何检测前,都要先评估一下你的运行环境,并以此为基准设置各种对应的检测标准和配置。