文章总结: 本文探究利用Impacket的dcomexec.py进行DCOM内网横向移动。测试了三种DCOM对象,发现ShellWindows因权限限制在Server2016后失效,而MMC20.Application全版本有效但在Server2025被Defender拦截,修改代码可绕过。防御方可监控mmc.exe进程链及屏幕闪现特征。 综合评分: 92 文章分类: 内网渗透,渗透测试,红队
DCOM内网横向探究
原创
ybdt
卡卡罗特取西经
2026年1月12日 12:01 吉林
前言
本文首发于先知社区:https://xz.aliyun.com/news/91029
Windows下命令执行横向攻击主要经历了从PsExec到WMI再到DCOM(当然还有远程注册表、PtH/PtT等等),PsExec、WMI、DCOM在Impacket中都有对应实现,本文主要探究Impacket中DCOM横向移动在各个Windows下的可行性、免杀性,Impacket中DCOM横向移动对应的文件是dcomexec.py,下图中可以看到,它使用三种DCOM对象进行内网横向,分别是:ShellWindows、ShellBrowserWindow、MMC20.Application
image
环境准备
Attack Machine: Kali Linux 2025.3 x64 | 172.20.10.2
Impacket官方支持的python版本是3.9 – 3.13,推荐的安装方式是python3 -m pipx install impacket
测试环境如下
Victim Machine: Windows Server 2008 R2 6.1 7601 SP1 | 172.20.10.7
Victim Machine: Windows Server 2012 R2 6.3 9600 | 172.20.10.5
Victim Machine: Windows Server 2016 1607 14393.8688 | 172.20.10.6
Victim Machine: Windows Server 2019 1809 17763.8146 | 172.20.10.4
Victim Machine: Windows Server 2022 21H2 20348.4529 | 172.20.10.8
Victim Machine: Windows Server 2025 24H2 26100.7462 | 172.20.10.12
Victim Machine: Windows 7 6.1 7601 SP1 | 172.20.10.9
Victim Machine: Windows 10 22H2 19045.6466 | 172.20.10.10
Victim Machine: Windows 11 24H2 26100.6584 | 172.20.10.11
ShellWindows
COM对象ShellWindows的CLSID为:9BA05972-F6A8-11CF-A442-00A0C90A8F39,位于如下注册表位置
image
它实现了IShellWindows接口,IShellWindows接口用于枚举当前打开的Shell窗口(如资源管理器窗口、Internet Explorer窗口等),本质是一个dll,执行时位于进程explorer.exe中
IShellDispatch是用于Windows Shell自动化的接口,它有一个名为ShellExecute的方法,类似于Win32 API中的ShellExecute,功能是执行程序,原型如下
HRESULT ShellExecute(
[in] BSTR bstrFile,
[in, optional] VARIANT vArgs,
[in, optional] VARIANT vDir,
[in, optional] VARIANT vOperation,
[in, optional] VARIANT vShow
);
可以使用COM对象ShellWindows枚举当前打开的Shell窗口(如资源管理器),对于每个窗口,通过其Document属性(在资源管理器中,该属性返回一个表示文件夹视图的对象,如FolderView),再访问该视图对象的Application属性,即可获得Shell.Application对象(它实现了IShellDispatch接口),进而可以调用ShellExecute等方法
我们可以通过Process Explorer验证下COM对象ShellWindows执行时是否位于进程explorer.exe中,在kali中成功执行攻击后,可以看到explorer.exe中有了链接,也印证了我们说的,执行时位于进程explorer.exe中
image
阅读代码可以发现,执行攻击后,会在远程主机上创建COM对象的实例,dcomexec.py创建的shell其实是个半交互式shell,每次用户输入一个命令,远程主机中COM对象中的函数将被调用,命令输出被重定向到一个文件,脚本通过SMB协议读取那个文件,并在shell中显示,以此来模拟一个shell
我们在kali中抓包,可以看到其访问了属性Document、属性Aplication、方法ShellExecute,以及使用方法Invoke
image
在wireshark中还能看到,远程主机执行命令后,结果被重定到__17673
image
本质执行的命令是
cmd.exe /Q /c cd \ 1> \\127.0.0.1\ADMIN$\__17602 2>&1
以安静模式执行、执行完终止、切换到当前盘符的根目录,标准输出重定向到ADMIN$下的文件__17602中,标准错误重定向到标准输出
经测试,使用COM对象ShellWindows进行横向移动(前提是端口135、445开放,以及管理员权限)
- 1. Windows Server 2008 R2 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- 2. Windows Server 2012 R2 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- 3. 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
image
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开放,以及管理员权限)
- 1. Windows Server 2008 R2 失败 Class not registered,不知道是我环境问题还是什么原因
- 2. Windows Server 2012 R2 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- 3. 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服务器有三种形式
- 1. EXE形式,也叫LocalServer32,执行的时候进程就是EXE
- 2. DLL形式,也叫InProcServer32,执行的时候注入到COM客户端中
- 3. DLL Surrogate,它本身是dll,但执行的时候由dllhost.exe调用,也就是注入到dllhost.exe中
这个MMC20.Application是第1种形式,也就是说,相比ShellWindows的执行实体是explorer.exe,MMC20.Application的执行实体是mmc.exe,下图中可以看到
image
从防守角度讲,知道执行实体后,我们就可以创建检测规则,svchost.exe -> mmc.exe -> cmd.exe,发现这样的进程链,就需要进一步排查了
经测试,使用COM对象MMC20.Application进行横向移动(前提是端口135、445开放,以及管理员权限)
- 1. Windows Server 2008 R2 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- 2. Windows Server 2012 R2 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- 3. Windows Server 2016 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- 4. Windows Server 2019 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- 5. Windows Server 2022 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- 6. Windows 7 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- 7. Windows 10 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
- 8. Windows 11 成功(需要注意,默认情况下管理员组其他用户不可以,会返回rpc_s_access_denied,需要用户Administrator)
执行结果如下图,我就不一一展示了
image
在测试Window Server 2025的时候,被Microsoft Defender AntiVirus报毒阻断了
image
通过Wireshark抓包查看,首先排除了rpc_s_access_denied,发现已经获取到ExecuteShellCommand执行命令
image
很有可能命令已经执行了,但在重定向输出到文件这块被Microsoft Defender AntiVirus识别为恶意,那我们修改下输出文件的位置,以及相关代码,修改后的代码可以成功执行
image
修改后的代码位于:https://github.com/ybdt/post-hub/tree/main/07-横向攻击/DCOM横向移动
尾语
测试发现,使用这几个DCOM对象进行横向移动,在Victim端可能会出现黑框一闪而过的情况,所以要考虑到Victim端屏幕前是否有人
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:卡卡罗特取西经 ybdt《DCOM内网横向探究》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论