前言
前一阵先在雷神众测上发了遍,正好有空再blog也再发下,原地址:
https://mp.weixin.qq.com/s/wkjcmhEg3JDP7GUyB3gI_A
win10都自带了defender,查杀能力也都比较强,有时候可能木马或许不会被杀,但是工具依旧可能会被杀,那么可能就需要尝试看看能否关闭defender,此处尝试以高权限用户命令行进行关闭,前提需要本地管理员,以利用TrustedInstaller的权限对defender服务进行操作
因为常规操作经过尝试后发现如下,无法通过服务或者进程来直接停止或关闭目标程序,此处考虑针对非图形化方向来尝试关闭defend
实际利用前先简单补充下令牌、TrustedInstaller相关的知识点
令牌
windows token又叫access token,是一个描述进程或者线程安全上下文的一个对象,不同的用户登录计算机后,都会生成一个access token,这个toekn在用户创建进程或者线程时候就会被不断拷贝,也就解释了A用户创建一个进程而该进程不会有B用户的权限,重点还是关注进程或线程,当他有足够的权限就可以实现模拟另个用户,这也就是令牌模拟,目标可以是复制或使用另个进程线程的令牌,此处是需要有足够的权限才能打开并使用
更多说明:https://docs.microsoft.com/zh-cn/windows/win32/secauthz/access-tokens?redirectedfrom=MSDN
实际使用过程中,通过模拟目标进程令牌token以实现开启新进程从而获得到更高权限,比如本地管理员针对些system进程,从而获取system权限,效果如下
除了winlogon.exe可以被拿来获取system进程,其他的也可以比如lsass
openprocess失败
尝试过程中发现,并不是所有的system进程都可以拿来利用,比如wininit.exe,openprocess时就出现失败,对比错误代码确认Access is denied,该问题后面可以解决
查阅资料后进步比较利用成功的winlogon.exe和利用失败的wininit.exe
对比成功利用的lsass后可以确认与会话sessionid无关
进步查看acl相关配置,两者也近乎相同
过程中进程权限打开不动,于是乎尝试更换其他的失败进程对比看看是否有不同之处,后面继续尝试
openprocesstoken失败
通过多次尝试,发现了openprocess成功,但openprocesstoken失败
尝试查看相关不同之处
winlogon.exe、lsass.exe的用户都为system、但所有者都是administrators,同1632的这个svchost对比可发现所有者的区别所在
github上正好有份可以拿来看token的ps1非常方便
https://gist.githubusercontent.com/vector-sec/a049bf12da619d9af8f9c7dbd28d3b56/raw/eaddf4151ebe4345623b7066a2c768665805fcad/Get-Token.ps1
对比下进程可确认,机器中间重启过,此处换了个svchost
username、ownername也就是用户、所有者,似乎就是成功利用system进程创建令牌的主要区别
也就是为什么在openprocesstoken失败的原因,因为用户不是所有者,知道了这个特征那么可以再去找下其他可以拿来利用的system进程,如ChsIME.exe成功利用如下
因为在上图进程尝试的过程中也有部分OpenProcess出现同样的失败问题
再回openprocess
对比进程后,发现了一个特征保护属性PsProtectedSignerWinTcb-Light
关于PPL,简略介绍,在Windows 8.1/ Server 2012 R2 开始引入这个概念的,而PPL实际上是对之前Protected Process模型的扩展,增加了“Protection level”的概念,基本上就是说一些PP(L)进程可以比其他进程受到更多的保护
此时是需要修改openprocess的安全描述符从原先的PROCESS_QUERY_INFORMATION为PROCESS_QUERY_LIMITED_INFORMATION,从而能够实现在我们的进程上openprocess,最终效果如下,以此可以成功获得到system权限
重点代码
HANDLE processHandle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, true, PID_TO_IMPERSONATE);
// 进程令牌获取OpenProcessToken
if (!OpenProcessToken(processHandle, TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_QUERY, &OpenProcessTokenHandle)) {
// 用的是OpenProcessToken的返回句柄,当前线程模拟另一个用户
if (!ImpersonateLoggedOnUser(OpenProcessTokenHandle)) { //https://docs.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-impersonateloggedonuser
// 用的也是OpenProcessToken令牌
if (!DuplicateTokenEx(OpenProcessTokenHandle, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &duplicateTokenHandle)) {
// 创建目标进程
if (!(CreateProcessWithTokenW(duplicateTokenHandle, LOGON_WITH_PROFILE, "XXXXXXX", NULL, 0, NULL, NULL, &startupInfo, &processInformation))) {
TrustedInstaller
在Windows中拥有修改系统文件权限,本身是一个服务,以一个账户组的形式出现:NT SERVICE\TrustedInstaller
TrustedInstaller为Windows系统中众多系统内置安全主体中的一个,除了组之外也是系统重要服务,用户无法直接在此服务的上下文中运行程序或另一个服务。它是操作系统上用来对系统进行维护、更新等操作的组。SID是S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464。TrustedInstaller权限的意义是用来防止程序或用户无意或恶意破坏系统文件。这个安全主体本身是一个服务,名称为:Windows Modules Installer
各类百科文档说的更详细,此处就简单补充
一般常规情况下,进程默认打开未启动,需要先启动下服务才能启动
那么也就意味着要获得到TrustedInstaller的权限,需要先通过服务启动下
了解下权限划分即可知道,在windows下TrustedInstaller权限其实超过了system,再回到为什么没法直接关闭WinDefend,查看WinDefend服务的dcal,可以发现管理员、system只有start的权限没法进行stop
但服务本身和TrustedInstaller具备完全控制,可以实现stop功能
尝试利用
当前管理员,首先利用winlogon获得system权限,再获取到WinDefend权限,此处通过MsMpEng.exe进行令牌模拟,结合PROCESS_QUERY_LIMITED_INFORMATION即可,但经过测试发现因为一些原因后续依旧无法进行windefend的停止
更换思路,依旧从管理员到system出发,利用winlogon获得system权限,通过StartService启动trustedinstaller服务,从而进步获取trustedinstaller的权限,利用trustedinstaller来停止defender
利用当前权限通过服务以进行windefend的关闭,效果如下,机器重启后可恢复defender,或者手动点重启也可以
那么问题来了,是否有办法来达到无法恢复defender的目的?
查找资料后,发现进步通过ChangeServiceConfig2W可以来删除原有的PsProtectSignerAntimalware-Light保护,进步结合可以尝试删除、修改defender的相关组件,以导致无法进步正常重启运行,因为现有的停止服务是可以进行重启来恢复的
主要用到的代码
if (!QueryServiceConfig2W(hService, SERVICE_CONFIG_LAUNCH_PROTECTED, LPBYTE(&srvinfo), sizeof(SERVICE_LAUNCH_PROTECTED_INFO), &cbBufSize))
if (!ChangeServiceConfig2W(hService, SERVICE_CONFIG_LAUNCH_PROTECTED, &dwLaunchProtected)) {
对比效果如下
此处以mimikatz为示例,原mimikatz默认被杀
删除相关部分defender组件,导致defender无法重启使用,组件文件可以自己动手尝试,暂时就不放了,测试后电脑重启后依旧无法启动,具有一定破坏性..