DCOM内网横向探究
前言
Windows下命令执行横向攻击主要经历了从PsExec到WMI再到DCOM(当然还有远程注册表、PtH/PtT等等),PsExec、WMI、DCOM在Impacket中都有对应实现,本文主要探究Impacket中DCOM横向移动在各个Windows下的可行性、免杀性,Impacket中DCOM横向移动对应的文件是dcomexec.py,下图中可以看到,它使用三种DCOM对象进行内网横向,分别是:ShellWindows、ShellBrowserWindow、MMC20.Application
环境准备
Attack Machine: Kali Linux 2025.3 x64 | 172.20.10.2
Impacket官方支持的python版本是3.9 - 3.13,推荐的安装方式是python3 -m pipx install impacket
测试环境如下
1 | Victim Machine: Windows Server 2008 R2 6.1 7601 SP1 | 172.20.10.7 |
ShellWindows
COM对象ShellWindows的CLSID为:9BA05972-F6A8-11CF-A442-00A0C90A8F39,位于如下注册表位置
它实现了IShellWindows接口,IShellWindows接口用于枚举当前打开的Shell窗口(如资源管理器窗口、Internet Explorer窗口等),本质是一个dll,执行时位于进程explorer.exe中
IShellDispatch是用于Windows Shell自动化的接口,它有一个名为ShellExecute的方法,类似于Win32 API中的ShellExecute,功能是执行程序,原型如下
1 | HRESULT ShellExecute( |
可以使用COM对象ShellWindows枚举当前打开的Shell窗口(如资源管理器),对于每个窗口,通过其Document属性(在资源管理器中,该属性返回一个表示文件夹视图的对象,如FolderView),再访问该视图对象的Application属性,即可获得Shell.Application对象(它实现了IShellDispatch接口),进而可以调用ShellExecute等方法
我们可以通过Process Explorer验证下COM对象ShellWindows执行时是否位于进程explorer.exe中,在kali中成功执行攻击后,可以看到explorer.exe中有了链接,也印证了我们说的,执行时位于进程explorer.exe中
阅读代码可以发现,执行攻击后,会在远程主机上创建COM对象的实例,dcomexec.py创建的shell其实是个半交互式shell,每次用户输入一个命令,远程主机中COM对象中的函数将被调用,命令输出被重定向到一个文件,脚本通过SMB协议读取那个文件,并在shell中显示,以此来模拟一个shell
我们在kali中抓包,可以看到其访问了属性Document、属性Aplication、方法ShellExecute,以及使用方法Invoke
在wireshark中还能看到,远程主机执行命令后,结果被重定到__17673
本质执行的命令是
1 | cmd.exe /Q /c cd \ 1> \\127.0.0.1\ADMIN$\__17602 2>&1 |
以安静模式执行、执行完终止、切换到当前盘符的根目录,标准输出重定向到ADMIN$下的文件__17602中,标准错误重定向到标准输出
经测试,使用COM对象ShellWindows进行横向移动(前提是端口135、445开放,以及管理员权限)
- Windows Server 2008 R2 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- Windows Server 2012 R2 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- Windows Server 2016 失败 [-] rpc_s_access_denied
我们在kali中用wireshark抓包进行分析,可以看到Windows Server 2016(172.20.10.4)给kali(172.20.10.2)返回了nca_s_fault_access_denied
nca_s_fault_access_denied是微软RPC运行时返回的标准错误码,表示客户端没有权限执行RCP调用,就是说微软自Windows Server 2016起,禁用了对COM对象ShellWindows的远程RPC调用,所以自Windows Server 2016起,没法用这个DCOM对象进行横向移动
ShellBrowserWindow
和ShellWindows类似的一个COM对象,ShellWindows是Windows Shell窗口的集合,ShellBrowserWindow是集合中具体的对象
经测试,使用COM对象ShellBrowserWindow进行横向移动(前提是端口135、445开放,以及管理员权限)
- Windows Server 2008 R2 失败 Class not registered,不知道是我环境问题还是什么原因
- Windows Server 2012 R2 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- Windows Server 2016 失败 [-] rpc_s_access_denied
和ShellBrowserWindow类似,甚至限制更多,不多探究了
MMC20.Application
MMC20.Application是用于微软管理控制台(MMC)自动化的COM对象,它中的方法和属性允许自动化操作MMC,提到用于自动化的COM对象,首先想到的是它继承了IDispatch接口,通过IDispatch先获取Document,再获取ActiveView,这俩都是COM对象,其中ActiveView继承了接口IActiveView,接口IActiveView中有一个方法ExecuteShellCommand,最终通过这个方法执行命令
COM服务器有三种形式
- EXE形式,也叫LocalServer32,执行的时候进程就是EXE
- DLL形式,也叫InProcServer32,执行的时候注入到COM客户端中
- DLL Surrogate,它本身是dll,但执行的时候由dllhost.exe调用,也就是注入到dllhost.exe中
这个MMC20.Application是第1种形式,也就是说,相比ShellWindows的执行实体是explorer.exe,MMC20.Application的执行实体是mmc.exe,下图中可以看到
从防守角度讲,知道执行实体后,我们就可以创建检测规则,svchost.exe -> mmc.exe -> cmd.exe,发现这样的进程链,就需要进一步排查了
经测试,使用COM对象MMC20.Application进行横向移动(前提是端口135、445开放,以及管理员权限)
- Windows Server 2008 R2 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- Windows Server 2012 R2 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- Windows Server 2016 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- Windows Server 2019 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- Windows Server 2022 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- Windows 7 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- Windows 10 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- Windows 11 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
执行结果如下图,我就不一一展示了
在测试Window Server 2025的时候,被Microsoft Defender AntiVirus报毒阻断了
通过Wireshark抓包查看,首先排除了rpc_s_access_denied,发现已经获取到ExecuteShellCommand执行命令
很有可能命令已经执行了,但在重定向输出到文件这块被Microsoft Defender AntiVirus识别为恶意,那我们修改下输出文件的位置,以及相关代码,修改后的代码可以成功执行
修改后的代码位于:https://github.com/ybdt/post-hub/tree/main/07-横向攻击/DCOM横向移动
尾语
测试发现,使用这几个DCOM对象进行横向移动,在Victim端可能会出现黑框一闪而过的情况,所以要考虑到Victim端屏幕前是否有人
参考链接
https://sud0ru.ghost.io/yet-another-dcom-object-for-command-execution-part-1/
