0x00 绪论
随着新冠病毒大肆流行,我们观察到企业大量部署配置允许员工在家中工作。快速识别这些部署的基础设施组件中的漏洞已成为许多企业的首要任务。因此,好心的Red Timmy认为:“在经历这段艰难时期的同时,最好能消灭一些0day”。
我们仔细评估了手头上的选择,决定对Pulse Secure VPN客户端进行深入检查。为什么呢?除了因为该VPN在财富500强市场中有庞大的装机量,还因为许多中型公司都采用Pulse Secure的产品。试想一下,一家企业向其员工分发笔记本电脑,他们可以用笔记本电脑通过VPN远程连接到公司的基础设施,并在家中舒适地工作。当然,对这些笔记本电脑上运行的操作系统进行了加固,禁止随意安装软件或者禁用防病毒软件或其他监视/安全程序,往大了说,是避免员工执行通常需要管理员权限的任何操作。
现在,假设一名员工(可能是恶意的内部人员)在与公司VPN网络建立连接之前或之后,在某台笔记本电脑提权为“NT_AUTHORITYSYSTEM
”,并且安全措施、配置和软件被禁用或篡改,可能无限制地在系统中安装任何程序或隐藏黑客工具,以降低安全部门的威胁检测和识别能力。后果有多糟?这就是我们今天将要讨论的Pulse Secure客户端上的漏洞(在厂商修复之前)所能导致的后果。我们已经为此漏洞注册了编号CVE-2020-13162。
0x01 漏洞概述及影响
Windows上的Pulse Secure客户端在“PulseSecureService.exe
”服务中存在本地权限提升漏洞。利用此漏洞,攻击者可以诱使“PulseSecureService.exe
”以SYSTEM
权限运行任意微软Installer可执行文件(“.msi”),这给了攻击者以管理员权限。
该漏洞位于“dsInstallerService”组件中,该组件使非管理员用户可以使用Pulse Secure提供的安装程序来安装或更新组件。尽管“dsInstallerService”对安装程序的内容执行了签名验证,但我们发现可以绕过该检查,先向该服务提供正常的Pulse Secure安装程序,在验证完毕后用恶意程序替换之(见下面的“分析”段)。
该漏洞是TOCTOU(检查时间到使用时间的竞争条件),可以使用独占的机会锁可靠地加以利用。
可以在默认配置下利用此漏洞,而且我们暂未了解到有任何配置可以阻止此漏洞的利用。我们测试过的所有< 9.1R6版本(包括5.x分支,比如2017年1月发行的5.3 R70版本)在我们的测试过程中均可成功利用。在全新安装的Windows 10 1909和Windows 8.1上都进行了测试。
该bug是由GiuseppeCalì(@gsepcali)发现的。Marco Ortisi编写了完整的漏洞利用程序,该程序将在不久的将来发布(更多信息请参见下面的注释)。
0x02 分析
Pulse Secure解决方案的服务器组件Pulse Secure Connect提供了安装程序以在客户端计算机上进行部署。其中的某些程序,例如“Pulse Secure Installer Service (.exe)
”和“Host Checker (.exe)
”,可以在没有管理员权限的情况下安装(见图1)。
图1:PSC管理员界面中提供的一种安装程序的说明。
尽管图上声称“如果系统上运行着先前版本的Installer服务,则可以在有限的用户权限下部署这些软件包”,但我们发现Pulse Secure客户端的默认安装就允许我们运行安装程序。可从“https://<pcs-host>/dana-admin/sysinfo/installers.cgi”获得安装程序。
由于这些安装程序需要执行管理员权限的任务(例如在“Program Files (x86)
”目录中创建文件),因此我们决定研究非特权进程是如何能够执行特权任务的。
安装程序是自解压的可执行文件(见图2)。
图2:“Pulse Secure Installer Service (.exe)”程序包提取的内容。
“Pulse Secure Installer Service (.exe)”的工作方式如下:
- 自解压到
%TEMP%
。 - 指示以
SYSTEM
身份运行的“PulseSecureService.exe
”启动安装过程。这是通过服务公开的OLE接口完成的。 - “
PulseSecureService.exe
”使用WinAPI函数“CryptQueryObject()
”验证“VerifyAndInstall.exe
”的签名。 - 如果签名有效,则“
PulseSecureService.exe
”会将“VerifyAndInstall.exe
”复制到“C:WindowsTempPulseXXXXXXXX
”,其中“XXXXXXXX
”是十六进制编码的时间戳。 - “
PulseSecureService.exe
”运行“VerifyAndInstall.exe
”。 - “
VerifyAndInstall.exe
”对“%TEMP%PulseSecureInstallerService.msi
”执行验证例程。 - 如果验证成功,则将“
PulseSecureInstallerService.msi
”复制到“C:ProgramDataPulse SecureInstallersverified_PulseSecureInstallerService.msi
”。 - “
PulseSecureInstallerService.msi
”以SYSTEM
运行“C:Windowssystem32msiexec.exe
”,并以“C:ProgramDataPulse SecureInstallersverified_PulseSecureInstallerService.msi
”作为参数,然后开始安装。
使用上面的文件名作为Procmon的过滤器可以观察到安装过程。
“C:ProgramData
”可由非特权用户写入,他们可以创建或修改他们拥有的文件,但不能动其他用户创建的文件。
要重现问题并以SYSTEM
身份运行代码,只需执行以下操作:
- 创建一个空的“
C:ProgramDataPulse SecureInstallersverified_PulseSecureInstallerService.msi
” - 在“
C:WindowsSystem32msiexec.exe
”上设置独占的机会锁(比如使用此工具:https://github.com/googleprojectzero/symboliclink-testing-tools/tree/master/SetOpLock ,命令为“SetOpLock.exe C:WindowsSystem32msiexec.exe x
”)。 - 启动从“Pulse Secure Connect”下载的合法安装程序。
- 触发机会锁后,将“
C:ProgramDataPulse SecureInstallersverified_PulseSecureInstallerService.msi
”替换为恶意的“.msi
”文件。 - 释放机会锁。
结果,恶意的“.msi”文件将以SYSTEM权限执行。
0x03 检测
要检测此问题,只需监控非SYSTEM进程创建或写入“C:ProgramDataPulse SecureInstallers
”的行为。因为原始文件都是由PulseSecure服务创建和写入的,所以非特权进程在这个位置写入是异常行为,可能是试图利用漏洞。
不同的安装程序安装到不同的位置。还有一个需要注意非特权写入的路径是“C: Users<user>AppDataRoamingPulse Secure
”。
0x04 利用
我们为该漏洞开发了两种不同的利用程序,下面是其中之一的演示(视频见原文)。
但是,我们不打算立马公开代码,不过我们很快就会发布到Github上。为什么现在不公开呢?因为我们意识到Pulse Secure的客户很难知道VPN客户端的新版本是修复了安全漏洞还是只是功能上的更新。事实上,截至本文写作时,VPN客户端9.1R6版(唯一不受影响的版本)的发行说明和官网上的安全公告都没提到之前版本的VPN受到CVE-2020-13162的影响。
这就自然导致大家很可能没有更新到最新版,因为没人知道这个版本是安全更新而非功能更新。
0x05 披露时间线
发现漏洞:2020年4月13日
联系厂商:2020年4月15日
厂商回复:2020年4月17日
补丁发布:2020年5月22日
Red Timmy披露漏洞:2020年6月16日
利用程序发布:待定
发表评论
您还未登录,请先登录。
登录