免杀系列之去除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 免杀原理与实践 免杀 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. 要做好免杀,就时清楚杀毒软件(恶意软件检测工具)是如何 ...
随机推荐
- 数据挖掘系统聚类—R实现
系统聚类法 聚类就是按照某个特定标准把一个数据集分割成不同的类或簇,最后的结果是希望同类之间的差异性尽可能小,不同类之间的差异性尽可能大.不同的类具有能够表达异于其他类的指标,这样针对不同的类,后续就 ...
- matplotlab可视化学习
1 使用pip安装 使用 Python 包管理器 pip 来安装 Matplotlib 是一种最轻量级的方式.打开 CMD 命令提示符窗口,并输入以下命令: pip install matplotli ...
- [ElasticSearch]#解决问题#修改Search Guard密码时 报错:ERR: Seems there is no Elasticsearch running on localhost:9300 - Will exit
问题复现 [root@es2 tools]# ps -ef | grep elasticsearch 9200 22693 1 1 09:31 ? 00:04:54 /usr/bin/java -Xm ...
- Web界面元素的测试
文本框 测试点 输入正常的字母或数字 输入超长字符.例如在"名称"框中输入超过允许边界个数的字符,假设最多255个字符,尝试输入256个字符,检查程序能否正确处理 输入默认值,空白 ...
- 【vue3-element-admin】ESLint+Prettier+Stylelint+EditorConfig 约束和统一前端代码规范
前言 本文介绍 vue3-element-admin 如何通过ESLint 检测 JS/TS 代码.Prettier 格式化代码.Stylelint 检测 CSS/SCSS 代码和配置 EditorC ...
- Docker Compose 部署GitLab
先决条件 Docker Engine和Docker Compose是必需的.请参阅在CentOS上安装Docker Engine. 建议使用4核的服务器,同时至少分配4G的内存,理论上4核4G可最多支 ...
- python 编程规范有哪些?
Python 编程规范主要包括代码布局.命名规范.注释规范.函数编写规范等多个方面,下面给出一些常见的编程规范及其示例代码. 1. 代码布局规范 代码布局规范主要是指代码的缩进.行宽.空行.换行等方面 ...
- 点&边双连通分量
双连通分量 参考博客:https://www.cnblogs.com/jiamian/p/11202189.html#_2 概念 双连通分量有点双连通分量和边双连通分量两种.若一个无向图中的去掉任意一 ...
- pytest的几种执行方式
1 pytest xxxx 2 python -m pytest xxxx python -m pytest --html=./report/rep2.html test_env_pytest_ini ...
- 2022-06-13:golang中,[]byte和结构体如何相互转换?
2022-06-13:golang中,[]byte和结构体如何相互转换? 答案2022-06-13: []byte和结构体的转换的应用场景是数据解析. 代码里有两种方法,一种是内存不共用,另一种是内存 ...