参考:https://www.freebuf.com/articles/network/256372.html
前言DCOM是COM的扩展,允许应用程序实例化和访问远程计算机上的COM对象。
这里简要说一下几个有关COM的概念
CLSID:又叫CLASSID 一个COM类的唯一标识符,每一个Windows注册类与一个CLSID相关联。长得像这样 {20D04FE0-3AEA-1069-A2D8-08002B30309D}
ProgID:其可被用作对用户更友好的替代的一个CLSID,比如MMC20.APPLICATION.1就是一个ProgID。ProgID不能保证是唯一的,并非每个类都与ProgID相关联
Appid: 为了保证COM对象能被顺利的远程调用(即为了使DCOM可访问COM对象),需要把APPID与该类的CLSID相关联,且AppID需设置权限来规划哪些客户端能够访问
我们可以通过powershell执行get-CimInstance 来列出本地COM程序列表
远程DCOM对象实例化的流程:
客户端从远程计算机请求实例化由CLSID表示的对象。如果客户端使用ProgID则先将其本地解析为CLSID。
远程计算机检查是否存在由该CLSID所关联的AppID,并验证客户端的权限。
DCOMLaunch服务将创建所请求的类的实例,通常是通过运行LocalServer32子项的可执行文件,或者通过创建DllHost进程来承载InProcServer32子项引用的dll。
客户端应用程序和服务器进程间建立通信,客户端便可以访问新创建的对象。
MMC20.APPLICATION.1
中文名为:Microsoft管理控制台(MMC)2.0包括脚本对象模型。我们一步步抽丝剥茧跟踪一下这个对象的利用点,需要注意的一点是调用该对象必须要有管理员权限。
如上图,我们先列出在MMC20.APPLICATION中的模块,然后继续列出其中Document中的属性,再继续列出Document.ActiveView中的属性。可以发现一个名为ExecuteShellCommand的方法,光是听名字就知道是可以执行shell命令的方法了。到微软文档查一查这个方法,获得了以下信息。
ExecuteShellCommand([命令][目录][叁数][窗口状态])
命令
一个值,指定要执行的命令。可以指定标准路径。Command中包含的所有环境变量(例如“%windir%”)都将被扩展。
目录
一个值,用于指定工作目录的名称。Directory中包含的所有环境变量都将被扩展。如果“目录”为空字符串,则将当前目录用作工作目录。
参数
一个指定Command要使用的参数(如果有)的值;参数必须用空格分隔。例如,将参数指定为“ Param1 Param2”会导致Command接收Param1和Param2作为参数。如果要求单个参数用双引号引起来,请使用适合您的编程语言的技术。例如,在Microsoft Visual Basic中,将参数指定为“ Param1”“这是Param2”“”导致命令接收到参数1和“这是Param2”。
窗口状态
一个指定窗口状态的值。该值可以是以下字符串值之一,也可以是空字符串。如果为空字符串,则默认为“已恢复”。
“Maximized”
该命令在最大化的窗口中执行。
“Minimized”
该命令在最小化的窗口中执行。
“Restored”
该命令在已恢复或正常的窗口中执行。注意:这里会弹个黑框框
返回值
此方法不返回值。
于是乎,我们就能理所应当的想到这个东西可以被用于本地任意命令执行,就像这样
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application")).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored")