Check Point ZoneAlarm反病毒软件本地提权漏洞分析

栏目: ASP.NET · 发布时间: 5年前

内容简介:Illumant最近在Check Point ZoneAlarm反病毒软件中发现了一个严重漏洞,攻击者可以利用该漏洞,在反病毒软件启用的情况下,将低权限用户提升至本文从技术角度介绍了该漏洞的发现过程,也介绍了如何在本地环境中利用漏洞以

Check Point ZoneAlarm反病毒软件本地提权漏洞分析

一、概要

Illumant最近在Check Point ZoneAlarm反病毒软件中发现了一个严重漏洞,攻击者可以利用该漏洞,在反病毒软件启用的情况下,将低权限用户提升至 SYSTEM 权限。该漏洞之所以存在,是因为ZoneAlarm在进程间通信上采用了并不安全的具体实现,使得低权限用户可以使用存在漏洞的.NET服务,劫持不安全的通信,从而注入并执行代码。受影响的.NET服务以 SYSTEM 权限运行,因此被注入的代码会以 SYSTEM 权限运行,绕过权限限制,使攻击者可以获取系统的完全访问权限。

本文从技术角度介绍了该漏洞的发现过程,也介绍了如何在本地环境中利用漏洞以 SYSTEM 权限执行未经授权的代码。

漏洞利用过程可参考 此处 视频。

大家可以访问我们的 GitHub页面 获取漏洞利用代码。

二、背景介绍

Fabius Watson( @FabiusArtrel )最近在Ekoparty 2018上发表过一次开创性 演讲 ,主要介绍了如何滥用WCF端点。同样在2018年,Watson也提交并公布了一些CVE。这些权限提升和远程代码执行漏洞都与基于.NET WCF服务的商业产品有关,部分漏洞列表如下:

Watson对基于.NET的WCF漏洞的研究也给我们提供了研究思路。

此外,我们在漏洞开发过程中也使用了关于代码签名漏洞方面的技术(特别是关于 代码签名证书克隆及防御 方面的技术),这些技术由来自SpecterOps的Matt Graeber ( @mattifestation )公布。

三、枚举.NET服务

Fabius Watson提供的一个 python 脚本可以帮助我们识别可能存在漏洞的目标服务。该 工具 可以枚举满足如下条件的所有服务:

  • SYSTEMNT AUTHORITY\SYSTEM )权限运行
  • 服务对应的程序为.NET应用

该脚本中使用了WMIC查询语句来识别以 SYSTEM 运行的所有服务,然后使用 pefile 模块来检查服务程序的导入表中是否存在 mscoree.dll (所有.NET应用都会用到这个库)。该工具的运行结果如下所示:

Check Point ZoneAlarm反病毒软件本地提权漏洞分析

枚举完成后,接下来就是使用.NET反编译工具来检查这些服务。这里我们使用的是 dnSpy 。虽然系统上运行着许多.NET服务,但不一定都用到了WCF。所有的WCF服务都依赖于 System.ServiceModel ,因此我们可以在dnSpy中检测是否存在相关引用。我们发现ZoneAlarm服务中只有一个引用了这个库: SBACipollaSrvHost.exe

Check Point ZoneAlarm反病毒软件本地提权漏洞分析

四、寻找漏洞点

找到了以 SYSTEM 权限运行的WCF服务后,我们需要检查该服务是否对外暴露了我们可以利用的方法。有时候某些方法会以待运行的命令作为输入,这些方法利用起来非常方便。在其他情况下,利用方式可能没那么直接。当然,目标服务也可能不会公开任何方法,无法用于代码执行。

在源代码审核过程中,我研究了 OnCommandReceived 方法。跟踪该方法触发的一系列调用后,我发现整条调用链中存在一个名为 ExecuteInstaller 的方法,可以用来执行安装程序:

Check Point ZoneAlarm反病毒软件本地提权漏洞分析

根据这个方法的名称以及实际用途,我们判断该方法很可能是我们寻找的目标,因此继续下一步研究。

五、与目标服务交互

阅读 SBACipolla 类代码后,我们可以看到代码创建了两个命名管道服务端点: Cipolla 以及 CipollaRoot 。WCF服务可以使用各种传输协议,如果使用的是HTTP或者TCP协议,则我们有可能远程利用该服务。在本文中,该服务使用的是命名管道,因此我们的目标是实现本地权限提升:

Check Point ZoneAlarm反病毒软件本地提权漏洞分析

还有名为 AddSecureWcfBehavior 的一个自定义方法会调用这些服务端点,这表明开发者可能会尝试锁定这些服务。实际上,当某个客户端尝试连接到命名管道服务器时,代码首先会检查该连接是否来自于Check Point签名的进程,如下图所示:

Check Point ZoneAlarm反病毒软件本地提权漏洞分析

首先服务器会确定客户端的PID,然后使用该信息获取程序的完整路径,最后,服务端会检查:A)应用是否使用有效证书进行签名,以及B)证书的CN字段是否以“Check Point Software Technologies.”开头。如果不满足这些条件,服务端就会断开该连接。

六、绕过代码签名

我们最初的目标就是将DLL注入到经过Check Point签名的合法进程来满足这些检查条件,以便与目标服务通信。这种方法只有当特定的反病毒功能被禁用后才行之有效。在默认状态下,我们很难将DLL注入大部分进程中,因此这不是一个首选方案。

来自SpecterOps的Matt Graeber发表过一篇 文章 ,其中介绍了一个PowerShell cmdlet,能帮助低权限用户使用自签名证书来签名代码,也能让操作系统信任该证书。这样一来,我们就有可能签名利用代码,使其能与WCF服务通信,无需注入其他进程。我们可以通过如下步骤,使用伪造的证书来签名利用代码,绕过检查机制:

$cert = New-SelfSignedCertificate -certstorelocation cert:\CurrentUser\my -dnsname checkpoint.com -Subject “CN=Check Point Software Technologies Ltd.” -Type CodeSigningCert

Export-Certificate -Type CERT -FilePath c:\tmp\MSKernel32Root_Cloned.cer -Cert $cert

Import-Certificate -FilePath c:\tmp\MSKernel32Root_Cloned.cer -CertStoreLocation Cert:\CurrentUser\Root\

Set-AuthenticodeSignature -Certificate $cert -FilePath c:\tmp\exploit.exe

七、开发利用代码

SBAStub.dll (具体路径为 C:\Program Files (x86)\CheckPoint\Endpoint Security\TPCommon\Cipolla )中定义了一个 SBAStub 对象,该对象负责处理连接到WCF服务所需的所有管道,还包含名为 SendCommand 的一个方法,我们很自然就能猜测到该方法与目标服务中的 OnCommandReceived 方法有关。 OnCommandReceived 方法接受名为 CommandXML 的一个字符串作为参数,该字符串会原封不动传递给 ExecuteInstaller 。接下来我们看一下 ExecuteInstaller 中的代码,分析该方法对参数的处理过程:

Check Point ZoneAlarm反病毒软件本地提权漏洞分析

代码204-211行会反序列化处理 CommandXML ,将其转换成一个 RunInstallerPackageCommand 对象,这是服务程序中自定义的一个类,该类包含3个字段:string类型的 InstallerPackagePath 、string类型的 InstallerPackageArguments 以及另一个自定义类( SBAMessageInfoMessageInfo 。该类中最有趣的字段为 InstallerPackagePath ,因为该字段可以用来在目标服务的上下文中启动进程。

在224行,我们可以看到代码会验证 InstallerPackagePath 所指向的程序是否由Check Point签名。

代码213-232行会将参数载入一个 Process 对象中,然后在235行启动该对象。

因此我们有可能以 SYSTEM 权限启动由Check Point签名的任何应用。

利用代码如下所示:

Check Point ZoneAlarm反病毒软件本地提权漏洞分析

首先我们初始化 SBAMessageInfoRunInstallerPackageCommand 对象,最重要的是要在 InstallerPackagePath 字段中设置需要目标服务运行的程序。接下来,我们使用 XmlSerializer 来序列化 RunInstallerPackageCommand 。最后,我们创建一个 SBAStub ,使用 SendCommand 方法将新序列化的对象发送给目标服务。只要 InstallerPackagePath 所指定的文件经过签名,并且包含的CN为 Check Point Software Technologies, ,目标服务就会帮我们启动该程序。

为了演示利用过程,我们创建了一个简单的示例程序,可以在系统中添加一个新的本地管理员账户,我们使用内置的Windows PowerShell cmdlets对该程序进行签名。随后,目标服务会按照我们的要求运行该程序,实现权限提升。

八、厂商回应

在开发出利用代码后,我们第一时间将漏洞反馈至Check Point。与其他厂商相比,他们的披露机制要方便得多。Check Point在官网上专门为反馈安全问题开放了一个表单,在提交漏洞后厂商很快就与我们取得联系,并且也在问题处理更新过程中与我们协同合作。

厂商修复问题代码后,邀请我们验证修复补丁是否有效。他们的修复方法非常简单,直接让攻击者无法通过WCF来利用 ExecuteInstaller 方法,然后也提高了未授权客户端与目标服务交互的难度,这样处理比简单地避免WCF对外暴露敏感功能来说要更为安全。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++数值算法(第二版)

C++数值算法(第二版)

William T.Vetterling、Brian P.Flannery、Saul A.Teukolsky / 胡健伟、赵志勇、薛运华 / 电子工业出版社 / 2005年01月 / 68.00

本书选材内容丰富,除了通常数值方法课程的内容外,还包含当代科学计算大量用到的专题,如求特殊函数值、随机数、排序、最优化、快速傅里叶变换、谱分析、小波变换、统计描述和数据建模、常微分方程和偏微分方程数值解、若干编码算法和任意精度的计算等。 本书科学性和实用性统一。每个专题中,不仅对每种算法给出了数学分析和比较,而且根据作者的经验对算法做出了评论和建议,并在此基础上给出了用C++语言编写的实用程......一起来看看 《C++数值算法(第二版)》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具