Avira Optimizer本地权限提升漏洞分析

本文详细分析了Avira Optimizer本地权限提升漏洞的发现和利用过程,涉及命名管道安全、证书验证绕过和代码注入等技术,展示了从漏洞识别到完整利用链的构建方法。

Avira Optimizer本地权限提升

版本: Avira Optimizer < 1.2.0.367 测试操作系统: Windows 10 1803 (x64) 漏洞: 通过不安全的命名管道实现Avira Optimizer本地权限提升

漏洞概述

当用户安装最新版Avira antivirus时,它会附带几个不同的组件,其中之一就是Avira Optimizer。简而言之,“Avira.OptimizerHost.exe"以"NT AUTHORITY\SYSTEM"权限运行,并通过"AviraOptimizerHost"命名管道(\.\pipe\AviraOptimizerHost)接收命令。该服务对调用客户端的验证不当,同时对启动的可执行文件检查无效,这使得恶意代码能够向"Avira.OptimizerHost.exe"发出进程创建调用,导致本地权限提升。

识别与利用

在评估软件中的权限提升漏洞时,找到起点通常很困难,因为存在许多不同的原语和漏洞类别。我的方法通常包括从基础开始,然后逐步增加复杂性。这个过程通常涉及运行PowerUp等工具,该工具将识别各种简单(但常见)的错误配置。

如果没有返回有趣的结果,下一步通常是寻找逻辑漏洞。这些漏洞更难自动识别,需要更多手动探测。我的工作流程通常包括分析全局可写目录、可写注册表位置、通过NTObjectManager暴露的命名管道和RPC接口。在分析现有命名管道时,发现某些Avira进程创建了一个具有NULL DACL的命名管道。这实际上意味着向任何请求的用户授予完全访问权限:

虽然有趣,但如果管道没有被特权Avira进程以某种方式使用,它就不是非常有用。检查管道的使用进程ID显示,一个SYSTEM级别的Avira进程正在使用它:

下一步是弄清楚"Avira.OptimizerHost.exe"实际上在用命名管道做什么。这是一个值得探索的兔子洞,因为特权进程正在与低权限用户控制的资源进行交互。由于"Avira.OptimizerHost.exe"具有管道的句柄,该进程很可能正在接收通过管道传递的某种数据。为了验证这一点,下一步是在IDA中打开"Avira.OptimizerHost.exe”。经过一些探测,发现该服务正在接受连接到"AviraOptimizerHost"命名管道的任何客户端,并验证它是否是有效的Avira文件。

为了滥用此命名管道,我们需要绕过此检查才能成功通过命名管道向服务发送数据。该服务通过GetNamedPipeClientProcessID()获取连接客户端,然后通过QueryFullProcessImageNameW()提取完整映像路径来进行检查。

获取路径后,服务会提取调用客户端的证书,并确保它由Avira签名且未被篡改。这里的想法是确保只有有效的Avira进程才能向服务发出命令。为了绕过这一点,我们可以简单地将代码注入到正在运行的Avira进程中(或者可能只是克隆现有证书)。

下一步是弄清楚我们可以通过命名管道向服务发出什么指令。在这种情况下,我通常喜欢调查任何潜在的合法客户端,并查看它们在正常操作期间的行为。由于此管道是Avira优化器的一部分,我开始查看已安装的Avira组件。经过一些死胡同后,Avira的System Speedup应用程序浮出水面,因为优化和加速是同义词。在查看Avira的"System Speedup"文件夹后,我偶然发现了Avira System Speedup库。然后,我将System Speedup文件夹中的所有文件加载到DnSpy中,并开始搜索命名管道引用。这使我找到了"Avira.SystemSpeedup.Core.Client.Services.dll",特别是"StartServiceHost()“方法。

正如所怀疑的,这是连接到"AviraOptimizerHost"命名管道的代码。在此之下,该函数继续调用Avira.Optimizer.Common.Tools.OptimizerHostClient类中的"OptimizerHostCommandsClient.Connect()",这听起来非常有趣。查看此函数时,它只是调用WaitNamedPipe()等待管道准备就绪。一旦准备就绪,就使用CreateFile获取命名管道的句柄。

回顾"StartServiceHost"方法,它实例化Avira.Optimizer.Common.Tools.OptimizerHostClient类的一个实例,连接到"AviraOptimizerHost"命名管道,然后继续调用一个有趣的方法"StartParentProcess()"。

查看该实例化类时,有许多有趣的方法。这些项目包括:StartProcess、StartParentProcess、StopProcess、AddTask和RemoveTask。这些方法接受各种参数,然后在将任务转换为JSON后继续调用"SendMessage”:

“SendMessage()“方法获取命令的JSON并将其发送到"AviraOptimizerHost"命名管道,SYSTEM进程"Avira.OptimizerHost.exe"在那里接收它:

查看"Avira.OptimizerHost.exe”,我们可以看到服务读取JSON并解析参数的位置:

在这种情况下,如果我们向命名管道发送"StartProcess()“方法,服务将从通过命名管道发送的JSON blob中提取"procid”、“exec”(可执行路径)、“args”(参数)等。从那里开始,它遵循与验证客户端中命名管道相同的逻辑,其中它从"exec"参数获取可执行路径并检查文件的证书以确保它属于Avira。该服务依赖于主题和证书序列号(两者都由攻击者控制),因此可以使用SigPirate等工具从有效的Avira可执行文件克隆证书并将其应用于自定义有效负载。

为了利用此漏洞,我们需要完成以下几件事:

  1. 准备我们的有效负载。在这种情况下,它是一个名为Avira.SystemSpeedup.RealTime.Client.exe的.NET可执行文件,用于启动cmd.exe
  2. 从有效的Avira文件克隆证书并将其应用于我们的有效负载
  3. 编写代码注入到有效的Avira进程中,加载Avira.Optimizer.Common.Tools.dll并实例化OptimizerHostClient类
  4. 使用公开的方法连接到"AviraOptimizerHost"命名管道并向服务发出命令

对于有效负载创建和证书克隆,我将留给读者作为练习。为了连接到命名管道并发送命令,我们可以通过添加对Avira.Optimizer.Common.Tools.dll的引用并导入Avira.Optimizer.Common.Tools.OptimizerHostClient命名空间来重用现有的Avira库。完成后,我们可以创建OptimizerHostCommandsClient类的实例并调用任何有趣的方法,例如"StartProcess”。

为了实现LPE,我们需要做的就是将此程序集注入到Avira进程中并调用我们的入口点。同样,这是留给读者的练习……但有各种项目使这个过程变得容易(https://github.com/ChadSki/SharpNeedle)。

在注入到Avira进程并执行上述C#代码后,当程序集连接到"AviraOptimizerHost"命名管道并使用设置为具有克隆Avira证书的有效负载(在这种情况下,名为Avira.SystemSpeedup.RealTime.Client.exe的有效负载)的"exec"参数发送"StartProcess()“方法时,cmd.exe将作为SYSTEM启动。

此漏洞已在Avira Optimizer版本1.2.0.367中修复。在浏览修复程序后,Avira现在使用WinVerifyTrust()和明显的路径白名单来确保启动的进程不受影响。

披露时间线

我想花点时间称赞Avira及其开发团队。该团队保持持续联系,并以快速的速度修复问题。在本报告的情况下,在初始报告后约30天内开发并分发了修复程序。与认真对待漏洞报告并遵循社区设定的90天修复期望的供应商合作令人耳目一新。

正如SpecterOps致力于透明度一样,我们承认攻击者一旦公开就会采用新攻击技术的速度。这就是为什么在发布新错误或攻击技术之前,我们定期通知相应的供应商问题,提供充足的时间来缓解问题,并通知选定的、受信任的供应商,以便尽快向客户提供检测。

  • 2019年7月23日:漏洞发送给Avira安全团队
  • 2019年7月24日:Avira确认报告,指出PoC存在一些编译问题
  • 2019年7月26日:Avira使用提供的PoC重现了漏洞
  • 2019年8月6日:Avira指出开发人员修复了问题,询问我是否要测试修复程序
  • 2019年8月6日:回复Avira关于补丁的绕过,提供了更新的PoC和详细信息
  • 2019年8月16日:Avira回复指出开发人员实施了新的修复程序,并询问我是否要测试它
  • 2019年8月16日:测试了新的修复程序。让Avira知道它似乎足够好
  • 2019年8月27日:修复程序实时推送
  • 2019年8月29日:详细信息发布
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计