跳转至

T1559-001-win-利用进程间通信执行-组件对象模型-COM

来自ATT&CK的描述

攻击者可能会使用Windows组件对象模型(COM)来执行本地代码。 COM是原生的Windows应用程序编程接口(API)的进程间通信(IPC)组件,它使实现一个或多个接口的可执行代码或软件对象之间能够进行交互。通过COM,客户端对象可以调用服务器对象的方法,这些服务器对象通常是二进制动态链接库(DLL)或可执行文件(EXE)。

可以通过各种编程语言(例如C,C ++,Java和Visual Basic)滥用已经暴露的不同的COM接口来执行任意代码。还存在特定的COM对象,它们具有除直接执行代码之外的功能,例如创建计划任务/作业,无文件下载/执行,以及与特权提升和持久性相关的其他攻击行为。

测试案例

COM

COM即组件对象模型(Component Object Model,COM) ,是基于 Windows 平台的一套组件对象接口标准,由一组构造规范组件对象库组成。COM是许多微软产品和技术,如Windows媒体播放器和Windows Server的基础。

一般的对象是由数据成员和作用在其上的方法组成,而组件对象和一般对象虽有相似性,但又有较大不同。组件对象不使用方法而用接口来描述自身。接口被定义为“在对象上实现的一组语义上相关的功能”,其实质是一组函数指针表,每个指针必须初始化指向某个具体的函数体,一个组件对象实现的接口数量没有限制。

DCOM

DCOM(分布式组件对象模型)是微软基于组件对象模型(COM)的一系列概念和程序接口,它支持不同的两台机器上的组件间的通信,不论它们是运行在局域网、广域网、还是Internet上。利用这个接口,客户端程序对象能够向网络中另一台计算机上的服务器程序对象发送请求。

DCOM是COM(组件对象模型)的扩展,它允许应用程序实例化和访问远程计算机上COM对象的属性和方法。DCOM 使用远程过程调用(RPC)技术将组件对象模型(COM)的功能扩展到本地计算机之外,因此,在远程系统上托管COM服务器端的软件(通常在DLL或exe中)可以通过RPC向客户端公开其方法。

攻击者可使用 DCOM 进行横向移动,通过 DCOM,攻击者可在拥有适当权限的情况下通过 Office 应用程序以及包含不安全方法的其他 Windows 对象远程执行命令。

使用DCOM进行横向移动的优势之一在于,在远程主机上执行的进程将会是托管COM服务器端的软件。例如我们滥用ShellBrowserWindow COM对象,那么就会在远程主机的现有explorer.exe进程中执行。对攻击者而言,这无疑能够增强隐蔽性,由于有大量程序都会向DCOM公开方法,因此防御者可能难以全面监测所有程序的执行。

在本地通过DCOM执行命令

获取本地DCOM程序列表

在powershell中执行如下命令获取DCOM程序列表:

Get-CimInstance Win32_DCOMApplication

Get-CimInstance 这个cmdle(powershell命令行)默认只在powershell 3.0以上版本中存在,所以只有 Windows server 2012 及以上版本的操作系统才可以使用Get-Ciminstance。

Windows 7、Windows Server 2008中默认安装的是powershell 2.0,所以他们都不支持Get-CimInstance,可以用以下命令代替Get-CimInstance:

Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication
本地使用DCOM执行任意命令

我们在获取DCOM应用程序的时候,遇到了一个MMC Application Class(MMC20.Application)。这个COM对象可以编程MMC管理单元操作的组件脚本。我们在本地启动一个管理员权限的powershell,执行如下命令通过PowerShell与DCOM进行交互,创建一个“MMC20.Application”对象的实例(我们只需要提供一个DCOM ProgID和一个IP地址,就返回一个COM对象的实例):

$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))

获得COM对象的实例后,我们还可以执行如下命令枚举这个COM对象中的不同方法和属性:

此时可执行如下命令获得"MMC20.Application"支持的操作
$com.Document.ActiveView | Get-Member

可以发现该对象有一个 ExecuteShellCommand 方法,可用来执行命令。然后再通过ExecuteShellCommand执行命令,这里启动计算器:

$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimized")    // 启动计算器
除了MMC20.Application,还有ShellWindows、ShellBrowserWindow、Excel.Application以及Outlook.Application等等都可以为我们所利用。

我们通过MMC20.Application的ExecuteShellCommand方法在本地运行了一个“计算器”程序。如果我们提供一个远程主机的IP,便可以使用[activator]::CreateInstance([type]::GetTypeFromProgID(ProgID,IP))[Activator]::CreateInstance([Type]::GetTypeFromCLSID(CLSID,IP))命令通过Powershell与远程DCOM进行交互,只需要提供DCOM ProgID和对方的IP地址,就会向对方提供该DCOM对象的实例,然后就可以利用这个DCOM应用程序和ExecuteShellCommand方法来在对方目标主机上执行命令了。如果攻击者把“计算器”程序换成恶意的payload,就会对系统安全造成威胁。

**更多案例可参看:内网渗透测试:利用DCOM进行横向渗透

检测日志

测试复现

测试留痕

检测规则/思路

建议

监控加载DLL和其他通常与应用程序不相关的模块的COM对象。通过查询注册表PowerShell枚举COM对象也可能存在恶意使用。

监视与COM对象关联的进程的产生,特别是由不同于当前登录用户的用户调用的进程。

相关TIP

[[T1559-002-win-利用进程间通信执行-动态数据交换-DDE]] [[T1559-002-win-利用进程间通讯执行-动态数据交换-OLE]]

参考推荐

MITRE-ATT&CK-T1559-001

https://attack.mitre.org/techniques/T1559/001/

内网渗透测试:利用DCOM进行横向渗透

https://www.freebuf.com/articles/network/261454.html