COM劫持原理

COM是Component Object Model (组件对象模型)。是Windows上的一个系统,可以通过操作系统实现软件组件之间的交互。攻击者可以使用该系统,通过劫持COM引用和关系在合法软件中插入恶意代码,达成持久化目标。劫持COM对象需要修改Windows注册表,替换某个合法系统组件的引用,该操作可能导致该组件无法正常执行。当系统组件通过正常系统调用执行时,攻击者的代码就会被执行。攻击者可能会劫持频繁使用的对象,以维持一定程度的持久化驻留,但不大会破坏系统内的常见功能,避免系统出现不稳定状态导致攻击行为被发现。

InprocServer32和LocalServer32(以及InprocServer和LocalServer)键值是COM服务(例如DLL、CPL、EXE和OCX)的引用点。一种常见的COM劫持方法是,将恶意DLL或者EXE文件放置到废弃的COM组件引用路径中。当COM组件通过正常系统调用执行时,攻击者的恶意代码就会被执行。该方法也是本文主要讨论的。

另一种常见的方法是在程序读取注册表信息中的DLL或者EXE功能的路径上,做一个拦截,让程序提前读取我们的设置好的恶意DLL或者EXE。COM劫持原理在某种程度上近似于DLL劫持。

Windows系统中应用程序读取COM注册表信息的顺序如下:

HKEY_CURRENT_USER\Software\Classes\CLSID
HKEY_CLASSES_ROOT\CLSID
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellCompatibility\Objects\

COM与DCOM的区别与联系

DCOM本身就是COM的一种表现形式,COM一般就把它当成在本地执行的COM,而DCOM当然就是分布的COM,在网络上的另一台计算机上执行。 关于COM与DCOM的区别与联系可以参考这篇文章,关于GUID及其与UUID、CLSID、IID的区别与联系可以参考这篇文章

关于CLSID,LocalServer32和InprocServer32

大多数COM类是在操作系统中注册的,并由一个GUID标识,该GUID代表注册表中的类标识符(CLSID)(通常在HKLM\Software\Classes\CLSID或HKCU\Software\Classes\CLSID下)。COM类实现的背后是CLSID下注册表项内引用的“服务”(某些二进制文件)。LocalServer32项表示可执行文件(exe)的路径,而InprocServer32项表示动态链接库(DLL)的路径。

在注册表中,CLSID结构如下所示:

LocalServer32

InprocServer32

枚举LocalServer32/InprocServer32键并找到废弃的二进制引用

在Windows中有许多COM类,而在LocalServer32/InprocServer32的数据字段中缺少对二进制路径的引用的COM类的数量取决于一些因素,例如:

  • 操作系统版本,家族和功能;
  • 第三方软件(已安装/卸载后);
  • 先前的DLL/COM注册。

要找到这些丢失的路径,请考虑以下常规步骤:

  1. 枚举所有LocalServer32和InprocServer32值(路径)
  2. 标准化二进制路径以删除参数等信息
  3. 验证二进制路径是否存在并定位丢失的文件

基于该思路,我实现了一个powershell脚本,用于枚举可能存在COM劫持的LocalServer32/InprocServer32值

实现COM劫持

我们找到了很多废弃的InprocServer32键,其中一个COM组件是优酷注册的,软件卸载之后没有移除注册表信息,于是该COM组件很有可能用于COM劫持。 目标文件并不存在,但目标目录可读可写,于是我们只需要创建相应的文件夹,并将相应的DLL文件放置于目录中。 我们构造的“恶意”DLL文件代码如下,出于演示,我们另其被成功加载时弹出计算器

我们使用rundll32直接加载恶意DLL文件,一种通过CLSID键(或PROGID)调用有效负载的方法是利用rundll32中鲜为人知的-sta(单线程单元)开关,如下所示:

rundll32.exe -sta {CLSID}
- or -
rundll32.exe -sta ProgID

在我们的示例中,我们直接使用该技术来直接调用COM组件,并成功弹出计算器。

防御思考

卸载应用软件时,供应商应删除(例如注销)COM注册表工件(和磁盘工件)。此外,供应商不应创建指向不存在的二进制文件的CLSID二进制路径注册表键值。 网络防御者应监视一些有趣的主机活动,尤其是rundll32.exe的使用情况。请注意,可以使用诸如“staggg”或“staggggggggggg”之类的后缀以及CLSID成功地调用“sta”开关。 企业应实施强大的“应用白名单”(AWL)策略,并超越默认规则。

一些关于COM滥用的参考资料

https://payloads.online/archivers/2018-10-14/1
https://cloud.tencent.com/developer/article/1498505
https://bohops.com/2018/06/28/abusing-com-registry-structure-clsid-localserver32-inprocserver32/
https://bohops.com/2018/08/18/abusing-the-com-registry-structure-part-2-loading-techniques-for-evasion-and-persistence/
https://bohops.com/2018/04/28/abusing-dcom-for-yet-another-lateral-movement-technique/
https://www.anquanke.com/post/id/159211
https://www.anquanke.com/post/id/215960
https://www.anquanke.com/post/id/217928
https://www.anquanke.com/post/id/179927