免杀系列之去除Defender令牌权限
本文展示了Windows存在的一个小bug,该问题允许攻击者绕过保护反恶意软件(AV/EDR)免受各种形式攻击的Windows安全机制(Windows Protected Process Light)。
Protected Anti-Malware Services
Windows 8.1 引入了受保护的反恶意软件服务的概念。这使经过特殊签名的程序在windows上安全运行,免受篡改和恶意终止,即使是管理员用户也不可以。Microsoft 文档(已存档)将其描述为:
In Windows 8.1, a new concept of protected service has been introduced to allow anti-malware user-mode services to be launched as a protected service. After the service is launched as protected, Windows uses code integrity to only allow trusted code to load into the protected service. Windows also protects these processes from code injection and other attacks from admin processes.
目的是防止恶意程序禁用用户机器上的防病毒软件然后肆无忌惮地运行。在下文中,我们将它们称为 Protected Process Light(PPL)。为了更深入地了解,Alex Ionescu 在NoSuchCon 2014的演讲中详细介绍了受保护的进程。
为了能够作为 PPL 运行,杀毒厂商必须向微软申请、证明其身份、签署具有效力的法律文件、加载Early Launch Anti-Malware (ELAM)驱动程序、通过测试套件运行并提交给微软,从而获得一个特殊的身份验证签名,这不是一个简简单单的过程。当以上操作完成后,反恶意程序厂商就可以使用ELAM 驱动程序令 Windows 将其软件产品作为 PPL 运行,达到保护其进程服务的目的。
在 Windows 10 上以SYSTEM权限启动的CMD窗口中,运行以下命令来查看 PPL 的运行情况:
# Protected Process Light in Action
C:\WINDOWS\system32>whoami
nt authority\system
C:\WINDOWS\system32>whoami /priv | findstr "Debug"
SeDebugPrivilege Debug programs Enabled
C:\WINDOWS\system32>taskkill /f /im MsMpEng.exe
ERROR: The process "MsMpEng.exe" with PID 2236 could not be terminated.
Reason: Access is denied.
可以看到,即使用SYSTEM 权限 SeDebugPrivilege 运行也无法终止 PPL Windows Defender 反恶意程序服务 (MsMpEng.exe)。这是因为非PPL进程(如 taskkill.exe)无法使用OpenProcess等API获取对PPL进程的PROCESS_TERMINATE访问权限的句柄。
总之,Windows 保护 PPL 进程免受非 PPL 进程的影响,即使是那些具有管理权限的进程。这是微软目前(截至本文发表时间2022年3月8日)依然施行的有效的安全策略。
Windows令牌
通常,当用户运行一个进程时,该进程会以当前用户的令牌运行,并且可以执行当前用户权限可执行的任何操作。可以将 Windows 令牌(Token)视作一种安全凭证,它规定了用户当前权限及可访问的内容。令牌中一些最重要的数据包括:
- User identity
- Group membership (如 Administrators)
- Privileges (如 SeDebugPrivilege)
- Integrity level
令牌(Token)是 Windows 授权的关键,每当Windows线程访问某个安全对象时,操作系统都会执行安全检查。它将线程的有效令牌与正在访问的对象的安全描述符(Security Identifier,SID)进行比对。有关令牌知识详情可见 Elastic 博客文章Microsoft 访问令牌文档和介绍 Windows 令牌。
令牌沙箱化
某些应用程序(例如 Web 浏览器)已多次成为攻击目标。由于浏览器进程共享浏览器的令牌,一旦攻击者成功对浏览器进行漏洞攻击,攻击载荷就可以执行浏览器进程可以执行的任何操作。
为了减轻此类攻击造成的危害,Web浏览器通过创建一个受限的安全执行环境,将其大部分程序代码移至较低权限的进程中执行。当运行在沙箱中的程序需要在系统上执行特殊操作时,例如下载文件,它可以请求非沙箱的代理进程替其执行操作,这样即使一个沙箱化进程被利用,则只会对沙盒可访问的资源进行攻击利用。
虽然现在的沙箱技术涉及操作系统中多个安全机制,但最重要的机制之一是低权限或受限令牌,使用 CreateRestrictedToken 等API即可创建新的低权限沙箱令牌。有时,某些沙箱化进程需要在执行一些初始化后将自己锁定,但是AdjustTokenPrivileges 和 AdjustTokenGroups API允许这种调整。这些系统API能够使现有进程“丧失”令牌中privileges和Groups的访问权限,这样就无法恢复令牌中的原有权限,除非创建新令牌。
常提到的沙箱是 Google 的Chromium,而如今一些安全产品也开始涉足沙箱技术。
获取令牌
Windows提供 OpenProcessToken API 来启用与进程令牌的交互,但是MSDN中声明必须拥有 PROCESS_QUERY_INFORMATION 权限才能使用 OpenProcessToken。上文提到过,非PPL进程无法调用系统API获取到访问PROCESS_TERMINATE权限句柄,只能获得对 PPL 进程的 PROCESS_QUERY_LIMITED_INFORMATION 访问权(注意是 LIMITED),所以从开发文档上看并不能获得访问 PPL 进程令牌的句柄。但是,国外大佬通过底层反编译内核代码已经解释过实际与文档介绍不符,仅使用 PROCESS_QUERY_LIMITED_INFORMATION,我们就可以成功打开受保护进程的令牌。
令牌(Token)本身也是安全对象,需要定期访问检查。对照正在被请求访问的令牌安全描述符(Security Identifier,SID),检查尝试访问令牌的线程的有效令牌(TOKEN_QUERY、TOKEN_WRITE、TOKEN_IMPERSONATE 等)。有关访问检查的更多详细信息,请参阅Microsoft文章“How Access Checks Work”。
利用思路
Process Hacker 提供了可视化的令牌安全描述符。查看 Windows Defender (MsMpEng.exe) 的令牌,我们看到以下自由访问控制列表(Discretionary Access Control List):

请注意,只有 SYSTEM 用户可以完全控制令牌。这意味着,除非有其他机制保护令牌,否则以 SYSTEM 身份运行的线程就可以修改令牌。如果可以进行此类修改,则违背了“PPL is protected from administrators”的设计初衷。
实现
具体代码已经托管在Github上,欢迎star

可以看到,左侧是默认情况下Windows Defender所拥有的权限,右侧是执行POC后的权限情况,并且右下方的 Integrity 已经被成功置为 Untrusted,此时Defender已形同虚设,我们可以大胆的执行mimikatz等后渗透操作了。
注意,这项技术不局限于Defender,其他反恶意软件产品同样可以使用此方法绕过,实战中针对不同EDR产品做不用场景分析,灵活应对,才是真正的红队思想。
最后,我想说的是,没有一直免杀的恶意程序,只有不会免杀的伪开发者。
Reference
https://blog.51cto.com/281816327/1409081
https://blog.csdn.net/wzsy/article/details/50923549
https://www.sohu.com/a/112545600_457968
https://www.tiraniddo.dev/2017/05/reading-your-way-around-uac-part-2.html
https://elastic.github.io/security-research/whitepapers/2022/02/02.sandboxing-antimalware-products-for-fun-and-profit/article/#
https://blog.csdn.net/weixin_39614546/article/details/111016652
免杀系列之去除Defender令牌权限的更多相关文章
- [原创]K8_Delphi源码免杀系列教程
[原创]K8_Delphi源码免杀系列教程[2014] 虽是2014年的,但免杀思路方法并未过时 比如函数动态调用\代码注释法等至今依然有效 链接:https://pan.baidu.com/s/1H ...
- 2018-2019-2 20165312《网络攻防技术》Exp3 免杀原理与实践
2018-2019-2 20165312<网络攻防技术>Exp3 免杀原理与实践 课上知识点总结 1.恶意软件检测机制 基于特征码的检测(需要定期更新病毒库) 启发式恶意软件检测(实时监控 ...
- Powershell免杀从入门到实践
转载https://www.jianshu.com/p/fb078a99e0d8 前言 文章首发于Freebuf 在之前发布的一篇 渗透技巧之Powershell实战思路 中,学习了powershel ...
- 2018-2019-2 网络对抗技术 20165317 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165317 Exp3 免杀原理与实践 实验内容 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用 ...
- 2018-2019-2 网络对抗技术 20165303 Exp3 免杀原理与实践
实验内容 一. 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分),veil-evasion(0.5分),加壳工具(0.5分),使用shellcode编程(1分) ...
- 2018-2019-2 网络对抗技术 20165326 Exp3 免杀原理与实践
免杀原理与实践 目录 知识点问答 实践内容 遇到的问题 心得体会 知识点 meterpreter免杀 基础问题回答 杀软是如何检测出恶意代码的? 特征码(基于签名):模式匹配,比对特征码库 启发式:通 ...
- 2017-2018 Exp3 MAL_免杀原理与实践 20155214
目录 Exp3 MAL_免杀原理与实践 实验内容 对msf生成后门程序的检测 Veil-Evasion应用 Visual Studio2017 + shellcode生成后门 主要思路 知识点 最后的 ...
- 20155321 《网络攻防》 Exp3 免杀原理与实践
20155321 <网络攻防> Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 根据实验指导书,杀软有两个方法可以检测出恶意代码.第一种是基于特征码,即先对流行代码特 ...
- 20145307陈俊达《网络对抗》Exp3 免杀原理与实践
20145307陈俊达<网络对抗>Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 恶意代码中一般会有一段有较明显特征的代码也就是特征码,如果杀毒软件检测到有程序包含的 ...
- Exp3 免杀原理与实践 20164323段钊阳
网络对抗技术 20164323 Exp3 免杀原理与实践 免杀 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. 要做好免杀,就时清楚杀毒软件(恶意软件检测工具)是如何 ...
随机推荐
- 全网最详细 二进制 k8s v1.25.x文档
二进制安装k8s v1.25.0 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes(k8s)二进制高可用安装部署,支持IPv4+IPv6双栈 ...
- 升级二进制kubernetes集群
升级二进制kubernetes集群 背景介绍 最近由于时间不足,暂时无法对小版本更新第一时间出新的文档.若需要升级集群版本,可以参考此文档进行操作,每个节点一个一个地更新.大版本更新请各位持续关注我的 ...
- 社工工具包setoolkit克隆网站钓鱼网站
实验主机:kali win10 (搭建好的dvwa靶场用于克隆登录页) setoolkit简介:setoolkit 是一个开源的社会工程学工具包.有很多选项可以使用更多操作读者自行探究. 实验开始: ...
- shell读取配置文件-sed命令
在编写启动脚本时,涉及到读取配置文件,特地记录下shell脚本读取启动文件的方式.主要提供两种格式的读取方式,方式一配置文件采用"[]"进行分区,方式二配置文件中需要有唯一的配置项 ...
- CommunityToolkit.Mvvm8.1 viewmodel源生成器写法(3)
本系列文章导航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址 ...
- el-menu使用递归组件实现多级菜单组件
1. 效果: 2. 实现: 创建外层菜单AsideMenu.vue组件和子菜单项AsideSubMenu.vue组件,在AsideSubMenu中进行递归操作. AsideMenu.vue文件内容如下 ...
- 火山引擎 DataTester:让企业“无代码”也能用起来的 A/B 实验平台
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 当数字化变革方兴未艾,无代码正受到前所未有的关注.Salesforce 的数据显示,52%的 IT 部门表示,公司 ...
- 面向接口编程实践之aspnetcoreapi的抽象
最为一名越过菜鸟之后的开发,需要做接口开发.下面做一个纯粹的接口编程的实例demo,仅仅是一个webapi接口的抽象. 下面是代码接口,AbsEFWork是webapi,BaseEntityFrame ...
- Django笔记三十之log日志记录详解
本文首发于公众号:Hunter后端 原文链接:Django笔记三十之log日志的记录详解 这一节介绍在 Django 系统里使用 logging 记录日志 以下是一个简单的 logging 模块示例, ...
- linux syslog.d日记操作记录-小节
以下记录在学习LDD3时调试处理打印的一些操作 syslog 不同的发行版,不同的脚本文件,如fedora18中为rsyslog的名称 1:配置文件 /etc/syslog.conf(fedora r ...