Razer Synapse 3特权提升

产品版本: Razer Synapse 3(3.3.1128.112711)Windows客户端

下载地址:https://www.razer.com/downloads

操作系统测试时间: Windows 10 1803(x64)

漏洞: Razer Synapse Windows服务EoP

简要说明: Razer Synapse软件具有以“NT AUTHORITY \ SYSTEM”运行的服务(Razer Synapse Service),并从“C:\ ProgramData \ Razer \ ”加载多个.NET程序集。文件夹“ C:\ ProgramData \ Razer \ ”和递归目录/文件具有弱权限,授予任何经过身份验证的用户FullControl内容。可以绕过签名检查并使用程序集侧加载提升到SYSTEM。

漏洞说明:

当Razer Synapse服务启动时,它将从“C:\ ProgramData \ Razer \ ” 中的各种目录中加载.NET程序集,例如“C:\ ProgramData \ Razer \ Synapse3 \ Service \ bin”。


Razer Synapse Service从C:\ ProgramData加载程序集

当查看文件夹“C:\ ProgramData \ Razer \ Synapse3 \ Service \ bin”上的DACL时,您会注意到“Everyone”对文件夹(包括文件夹中的任何文件)具有“FullControl”权限:


DACL C:\ ProgramData \ Razer \ Synapse3 \ Service \ Bin

理论上,攻击者可以简单地用恶意的.NET程序集替换现有的.NET程序集,重启系统并让Razer Synapse Service在启动时加载它。这种方法带来了一些复杂性,例如在服务加载之前更换组件的竞争条件。此外,该服务实现了一些必须在加载程序集之前传递的检查。为了有效利用,充分了解成功加载程序集的条件非常重要。

要解决的第一个问题是以一种服务将尝试加载它的方式来种植恶意程序集。由于低权限用户无权停止或启动Razer Synapse服务,因此劫持现有程序集可能具有挑战性。这意味着要触发程序集加载代码路径,需要重新启动该框。这使得赢得竞争条件以交换具有恶意挑战的合法程序集。看看这个服务,这个问题很容易解决,因为它递归地枚举了“C:\ ProgramData \ Razer \ ”中的所有DLL。


Razer Synapse Service搜索所有DLL文件

这意味着我们可以简单地将一个程序集放在其中一个文件夹中(例如C:\ ProgramData \ Razer \ Synapse3 \ Service \ bin),它将被视为与现有的有效程序集相同。

在递归枚举“C:\ ProgramData \ Razer * ”中的所有DLL之后,服务会尝试确保Razer对这些已识别的程序集进行签名。这是通过从“Razer.cer”获取证书信息,在每个程序集上调用X509Certificate.CreateFromSignedFile(),然后将Razer.cer中的证书链与正在加载的程序集进行比较来完成的。


Razer Synapse Service进行证书比较

如果程序集上的证书链与Razer.cer的证书链不匹配,则服务将不会加载它。虽然在加载.NET程序集之前检查.NET程序集的信任背后的想法很好,但实现并不健壮,因为X509Certificate.CreateFromSignedFile()只提取证书链,并且绝不会证明正在检查的文件签名的有效性(https://twitter.com/tiraniddo/status/1072475737142239233) 。这意味着可以使用诸如SigPirate之类的工具将证书从有效的Razer程序集克隆到恶意程序集上,因为所述程序集的签名从未实际验证过。

程序集通过证书检查后,服务将通过Assembly.LoadFile()将其加载到当前的应用程序域中。但是,在Assembly.LoadFile()调用期间不会执行任何恶意代码。执行此操作后,服务将检查以确保实现了IPackage接口。


Razer Synapse服务检查IPackage接口

此接口特定于SimpleInjector项目,该项目已有详细记录。通过此检查的唯一要求是在我们的恶意程序集中实现IPackage接口。一旦服务验证了程序集的证书链并验证了IPackage的存在,它就会将程序集添加到运行列表中。对“C:\ ProgramData \ Razer \ ” 中的所有程序集完成此操作后,该列表将传递给SimpleInjector的“ RegisterPackages() ” 函数。


Razer Synapse Service将经过验证的装配添加到列表中

RegisterPackages()将获取“已验证”程序集的列表,并在每个程序集的IPackage接口中调用“ RegisterServices() ”函数。


Razer Synapse服务调用RegisterPackages

这是我们作为攻击者可以执行恶意代码的点。所需要做的就是在我们的恶意程序集的IPackage接口中的“RegisterServices()”方法中添加恶意逻辑。

此时,我们已经找到了滥用所有要求以提升代码执行的方法。

  1. 编写一个从SimpleInjector项目实现IPackage接口的自定义程序集
  2. 在IPackage接口内的“RegisterServices()”方法中添加恶意逻辑
  3. 编译程序集并使用SigPirate等工具从有效的Razer程序集克隆证书链
  4. 将最终的恶意程序集放入“C:\ ProgramData \ Razer \ Synapse3 \ Service \ bin”
  5. 重新启动服务或重新启动主机

利用:

在理解了在高架环境中获得任意代码执行的要求之后,我们现在可以利用它。首先,我们需要创建实现所需IPackage接口的恶意程序集。为此,需要从SimpleInjector项目添加对“SimpleInjector”和“SimpleInjector.Packaging”程序集的引用。添加引用后,我们只需要实现接口并添加恶意逻辑。PoC程序集看起来像这样:


具有IPackage接口和恶意RegisterServices()函数的PoC程序集

由于Razer服务是32位,我们将程序集编译为x86。编译完成后,我们需要通过证书链检查。由于该服务使用X509Certificate.CreateFromSignedFile()而没有任何签名验证,我们可以使用SigPirate从签名的Razer程序集中克隆证书:


使用SigPirate克隆Razer证书

在PowerShell中使用“Get-AuthenticodeSignature”,我们可以验证证书是否已应用于从SigPirate创建的“lol.dll”程序集:


验证证书克隆

此时,我们有一个带有“后门”IPackage接口的恶意程序集,该接口具有来自有效Razer程序集的克隆证书链。最后一步是在“C:\ ProgramData \ Razer \ Synapse3 \ Service \ bin”中删除“lol.dll”并重新启动主机。主机重新启动后,您将看到“Razer Synapse Service.exe”(以SYSTEM身份运行)将从“C:\ ProgramData \ Razer \ Synapse3 \ Service \ bin”中加载“lol.dll”,从而导致“RegisterServices” ()“已实现的IPackage接口中的方法,用于执行cmd.exe。


正在加载恶意程序集

当服务加载“lol.dll”时,由于克隆的证书,它将其视为有效,并且由于IPackage实现中的“恶意”逻辑而发生EoP。

Razer通过实现名为“Security.WinTrust”的新命名空间来修复此问题,该命名空间包含完整性检查功能。现在,在从Razer目录中提取所有“ .dll”文件后,该服务将立即调用“WinTrust.VerifyEmbeddedSignature()”。


在Razer Synapse服务中增加了缓解措施

查看“WinTrust.VerifyEmbeddedSignature()”时,该函数使用“WinTrust.WinVerifyTrust()”来验证正在检查的文件是否具有有效签名(通过WinVerifyTrust())。


WinVerifyTrust实现

如果文件具有有效签名并且签名者是Razer,则服务将在加载程序集之前继续检查有效IPackage接口的原始代码路径。通过验证文件的完整性,攻击者无法再从签名的Razer文件克隆证书,因为新克隆文件的签名无效。

有关信任验证的其他阅读,我建议您阅读Matt Graeber撰写的白皮书“ 颠覆Windows中的信任 ” 。

披露时间表:

像SpecterOps一样致力于提高透明度,我们承认攻击者在公开后采用新攻击技术的速度。这就是为什么在宣传新的错误或攻击性技术之前,我们会定期向相应的供应商通知问题,提供足够的时间来缓解问题,并通知选定的可信供应商,以确保可以将检测结果传递给客户尽快。

06/05/2018:向Razer的HackerOne计划

06/08/2018提交漏洞报告:在H1线程上发布的回复确认报告

06/08/2018:H1工作人员询问了Synapse 3安装程序的具体版本号06/08

/ 2018:提供给Razer突触3安装程序的版本号

2018年7月5日:问的更新

2018年8月6日:报告标记为被分流

2018年8月27日:问的更新,没有响应

2018年9月14日:问更新,以及直接电子邮件地址,以加快沟通。没有回应

12/14/2018:被要求通过Twitter 12/14/2018为Razer提供安全联系

:H1项目经理伸出手来调查H1报告

12/15/2018:Razer首席执行官Min-Liang Tan直接要求直接发送电子邮件给安全团队

12/16/2018:信息安全经理和SVP软件通过电子邮件直接联系。我被提供了一个上下文,修复将在几周内推送给公众

12/19/2018:拉下最新的Synapse 3版本并调查易受攻击的代码路径。向Razer的H1计划提交了附加信息,并通知了Razer的信息安全经理

12/25/2018:Razer的某个人联系了我,并提供了内部版本的链接以进行补救验证

12/27/2018:根据他们的要求,通过H1报告提供有关已实施缓解的反馈

01/09/2019:要求提供给公众的固定版本的时间表更新(通过H1)

01/10/2019:通知构建现已向公众开放

01/10/2019:报告已关闭

01/10/2019:要求公开披露的许可

01/10/2019: Razer公布披露许可

01/21/2019:已发布报告

*注意:虽然披露时间表很长,但我必须假设这是由于Razer管理H1程序的人与Razer的人员在修复工作时断开连接。一旦我获得内部联系,时间表和经验就会大大改善。

-Matt N.


最初于2019年1月21日**在enigma0x3.net上发表。

原文地址 : https://posts.specterops.io/razer-synapse-3-elevation-of-privilege-6d2802bd0585

源链接

Hacking more

...