本文展示了Windows存在的一个小bug,该问题允许攻击者绕过保护反恶意软件(AV/EDR)免受各种形式攻击的Windows安全机制(Windows Protected Process Light)。
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 令牌(Token)视作一种安全凭证,它规定了用户当前权限及可访问的内容。令牌中一些最重要的数据包括:
令牌(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://blog.csdn.net/weixin_39614546/article/details/111016652
手机扫一扫
移动阅读更方便
你可能感兴趣的文章