本文展示了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 IonescuNoSuchCon 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即可创建新的低权限沙箱令牌。有时,某些沙箱化进程需要在执行一些初始化后将自己锁定,但是AdjustTokenPrivilegesAdjustTokenGroups API允许这种调整。这些系统API能够使现有进程“丧失”令牌中privilegesGroups的访问权限,这样就无法恢复令牌中的原有权限,除非创建新令牌。

常提到的沙箱是 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_QUERYTOKEN_WRITETOKEN_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令牌权限的更多相关文章

  1. [原创]K8_Delphi源码免杀系列教程

    [原创]K8_Delphi源码免杀系列教程[2014] 虽是2014年的,但免杀思路方法并未过时 比如函数动态调用\代码注释法等至今依然有效 链接:https://pan.baidu.com/s/1H ...

  2. 2018-2019-2 20165312《网络攻防技术》Exp3 免杀原理与实践

    2018-2019-2 20165312<网络攻防技术>Exp3 免杀原理与实践 课上知识点总结 1.恶意软件检测机制 基于特征码的检测(需要定期更新病毒库) 启发式恶意软件检测(实时监控 ...

  3. Powershell免杀从入门到实践

    转载https://www.jianshu.com/p/fb078a99e0d8 前言 文章首发于Freebuf 在之前发布的一篇 渗透技巧之Powershell实战思路 中,学习了powershel ...

  4. 2018-2019-2 网络对抗技术 20165317 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165317 Exp3 免杀原理与实践 实验内容 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用 ...

  5. 2018-2019-2 网络对抗技术 20165303 Exp3 免杀原理与实践

    实验内容 一. 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分),veil-evasion(0.5分),加壳工具(0.5分),使用shellcode编程(1分) ...

  6. 2018-2019-2 网络对抗技术 20165326 Exp3 免杀原理与实践

    免杀原理与实践 目录 知识点问答 实践内容 遇到的问题 心得体会 知识点 meterpreter免杀 基础问题回答 杀软是如何检测出恶意代码的? 特征码(基于签名):模式匹配,比对特征码库 启发式:通 ...

  7. 2017-2018 Exp3 MAL_免杀原理与实践 20155214

    目录 Exp3 MAL_免杀原理与实践 实验内容 对msf生成后门程序的检测 Veil-Evasion应用 Visual Studio2017 + shellcode生成后门 主要思路 知识点 最后的 ...

  8. 20155321 《网络攻防》 Exp3 免杀原理与实践

    20155321 <网络攻防> Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 根据实验指导书,杀软有两个方法可以检测出恶意代码.第一种是基于特征码,即先对流行代码特 ...

  9. 20145307陈俊达《网络对抗》Exp3 免杀原理与实践

    20145307陈俊达<网络对抗>Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 恶意代码中一般会有一段有较明显特征的代码也就是特征码,如果杀毒软件检测到有程序包含的 ...

  10. Exp3 免杀原理与实践 20164323段钊阳

    网络对抗技术 20164323 Exp3 免杀原理与实践 免杀 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. 要做好免杀,就时清楚杀毒软件(恶意软件检测工具)是如何 ...

随机推荐

  1. 提交docker镜像

    docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

  2. ServiceAccounts 及 Secrets 重大变化

    关于 ServiceAccounts 及其 Secrets 的重大变化 kubernetes v1.24.0 更新之后进行创建 ServiceAccount 不会自动生成 Secret 需要对其手动创 ...

  3. pysimplegui之读写配置项操作

    用户设置 API 在 4.30.0 版中,有一组新的 API 调用可用于帮助"用户设置".将用户设置视为自动写入硬盘的字典.基本上就是这样. 在 4.50.0 版中,除了现有的 J ...

  4. Python简易学生管理系统

    目录结构: 1. 学生文件 student.py # 学生类 class Student(object): # 存放学生信息 student_info = {} # 学生初始化方法 def __ini ...

  5. tkinter的标签和按钮以及输入和文本

    一.标签和文本 import tkinter as tk #1.定义tk的实例对象,也就是窗口对象 window = tk.TK() #2.设置窗口大小无法缩小和放大 window.resiable( ...

  6. 四月二十三号java基础知识

    1.异常是指在程序运行中由代码产生的一种错误2.按照错误的性质将错误分为语法错.语义错.和逻辑错三种3.语法错是有由于违反程序设计语言的语言规则而产生的错误,如标识符未标明.表达式中运算符与操作数类型 ...

  7. day25:7个魔术方法&5个关于类的魔术属性

    目录 1.__del__(析构方法) 2.魔术方法:__str__ 3.魔术方法:__repr__ 4.魔术方法:__call__ 5.魔术方法:__bool__ 6.魔术方法:__add__& ...

  8. Flask 上下文是什么 ?

    哈喽大家好,我是咸鱼.今天我们来聊聊什么是 Flask 上下文   咸鱼在刚接触到这个概念的时候脑子里蹦出的第一个词是 CPU 上下文 今天咸鱼希望通过这篇文章,让大家能够对 Flask 上下文设计的 ...

  9. Django笔记二十八之数据库查询优化汇总

    本文首发于公众号:Hunter后端 原文链接:Django笔记二十八之数据库查询优化汇总 这一篇笔记将从以下几个方面来介绍 Django 在查询过程中的一些优化操作,有一些是介绍如何获取 Django ...

  10. AndroidApp加固与脱壳

    0x01 APP加固 01.为什么要加固 APP加固是对APP代码逻辑的一种保护.原理是将应用文件进行某种形式的转换,包括不限于隐藏,混淆,加密等操作,进一步保护软件的利益不受损坏.总结主要有以下三方 ...