分析Avira VPN的两处提权漏洞

  • A+
所属分类:漏洞解析

  • 译文声明:
  • 本文是翻译文章,文章原作者enigma0x3.net,文章来源:enigma0x3.net
  • 原文地址:https://enigma0x3.net/2019/03/20/avira-vpn-2-15-2-28160-elevation-of-privilege-through-insecure-update-location/
  • 译文仅供参考,具体内容表达以及含义原文为准

提权漏洞一

测试环境

漏洞描述

当用户在VPN设置菜单中修改配置信息时,Avira Phantom VPN服务会修改C:\ProgramData\Avira\VPN\VpnSharedSettings.backup以及C:\ProgramData\Avira\VPN\VpnSharedSettings.config的DACL。如果攻击者在C:\ProgramData\Avira\VPN\VpnSharedSettings.backup设置硬链接(hardlink),就有可能覆盖任意文件上的DACL,最终将低权限用户提升至SYSTEM权限。

漏洞分析

当用户通过VPN GUI修改配置时,VPN服务(即Avira.VPNService.exe)就会调用Avira.VPN.Core.dll中的AdjustSecurity()函数来修改DACL,使通过身份认证的用户能将数据写入C:\ProgramData\Avira\VPN\VpnSharedSettings.backup或者C:\ProgramData\Avira\VPN\VpnSharedSettings.config中。当修改配置后(低权限用户可以执行该操作),该服务就会调用EnsureFileExists(),确保系统中存在“共享的”VPN配置文件(C:\ProgramData\Avira\VPN\VpnSharedSettings.backup以及C:\ProgramData\Avira\VPN\VpnSharedSettings.config)。

分析Avira VPN的两处提权漏洞

如果配置文件不存在,目标服务就会创建该文件;如果配置文件存在,目标服务会继续调用StorageSecurity.AdjustSecurity()函数。对于共享及私有配置文件,传入的StorageType分别为AllUserAccess或者Secure。“私有”VPN配置文件对应的是Secure存储类型,而共享型配置文件对应的是AllUserAccess类型。

分析Avira VPN的两处提权漏洞

当目标服务调用AdjustSecurity()函数时(传入配置文件的存储类型),就会适当调整文件对应的DACL,这就是存在问题的地方。对于“共享型”配置文件(StorageTypeAlluserAccess),VPN服务会调用AdjustSecurity(),授予每个人对该文件的完全控制权限:

分析Avira VPN的两处提权漏洞

这种操作非常危险,因为SetAccessControll()会修改文件的DACL,而低权限用户可以控制该文件。那么,我们如何利用这一点呢?

首先,攻击者需要在C:\ProgramData\Avira\VPN\VpnSharedSettings.backup上创建硬链接,将其指向某个文件,这里我们将其指向C:\Program Files (x86)\Avira\VPN\OpenVPN\phantomvpn.exe,这样我们就能覆盖C:\Program Files (x86)\Avira\VPN\OpenVPN\phantomvpn.exe的DACL。

分析Avira VPN的两处提权漏洞

执行该操作后,我们可以打开VPN应用,点击“Settings”标签页:

分析Avira VPN的两处提权漏洞

随后,取消设置“Send Diagnostic Data”,这样就会触发配置文件修改操作,进入目标代码路径。

分析Avira VPN的两处提权漏洞

此时,C:\Program Files (x86)\Avira\VPN\OpenVPN\phantomvpn.exe的DACL已经被覆盖,任何用户都可以写入该文件。攻击者现在只需要复制一个恶意程序,替换该文件即可。

分析Avira VPN的两处提权漏洞

完成该操作后,攻击者需要尝试连接VPN就能执行该恶意程序,只需点击VPN GUI中的“Secure my Connection”按钮即可。

分析Avira VPN的两处提权漏洞

点击“Secure my Connection”按钮后,我们应该能看到以SYSTEM权限运行的一些cmd.exe进程。

分析Avira VPN的两处提权漏洞

披露时间

  • 2018年9月28日:向Avira反馈漏洞
  • 2018年10月1日:Avira确认漏洞报告
  • 2018年12月4日:Avira复现该漏洞
  • 2018年12月13日:修复该问题

 

提权漏洞二

测试环境

漏洞描述

Avira Phantom VPN服务在检查更新时,会执行一些检查操作(服务启动时就会执行检查更新操作,因此系统启动时或者用户手动启动该服务都会执行这些操作)。开始更新时,VPN服务会将更新文件下载到C:\Windows\Temp\AviraVPNInstaller.exe,而任何用户都可以写入该文件。随后,目标服务会检查文件是否经过签名,并且版本号是否高于已安装产品的版本。如果满足这些条件,那么目标服务就会以SYSTEM权限运行下载的更新程序。攻击者可以使用经过签名的、有效的Avira可执行文件来替换AviraVPNInstaller.exe,而这个Avira可执行文件会查找当前目录中的各种DLL。根据DLL的搜索顺序,攻击者有可能将DLL植入C:\Windows\Temp目录中,最终提升至NT AUTHORITY\SYSTEM权限。

漏洞分析

当Avira VPN服务(Avira.VPNService.exe,版本号2.15.2.28160)启动时,会检查是否存在更新版本:

分析Avira VPN的两处提权漏洞

一番分析后,我们发现该VPN服务会使用C:\Windows\Temp目录来更新程序:

分析Avira VPN的两处提权漏洞

大家可能都知道,经过身份认证的任何用户都可以向C:\Windows\Temp目录中写入文件(但不能读取)。一旦更新文件已存在该目录中(C:\Windows\Temp\AviraVPNInstaller.exe),目标VPN服务就会检查可执行文件的FileVersion属性,判断该“更新”是否已安装到目标系统中:

分析Avira VPN的两处提权漏洞

如果该文件版本尚未安装到系统中,则目标服务会检查文件,确保该文件为有效文件,并且经过Avira签名:

分析Avira VPN的两处提权漏洞

如果该文件的确是Avira签名的有效文件,那么VPN服务就会运行这个“更新”包。由于低权限用户可以写入这个过程中涉及的文件,因此有可能劫持更新包,发起DLL侧加载(sideload)攻击。

为了劫持AviraVPNInstaller.exe,攻击者需要满足如下3个条件:

1、AviraVPNInstaller.exe必须带有Avira签名;

2、AviraVPNInstaller.exe上的签名必须有效(对该文件的任何修改都会破坏签名有效性);

3、AviraVPNInstaller.exe对应的版本号必须尚未安装到目标系统中。

这意味着我们需要滥用某个Avira签名文件,并且该文件版本号还要大于已部署的版本。

经过一番搜索后,我们发现ToastNotifier.exe满足这些条件:

分析Avira VPN的两处提权漏洞

ToastNotifier.exe来自于Avira Antivirus产品套装中,根据Antivirus平台上之前的一份漏洞报告,我们可以使用类似的方式来滥用这个文件。

为了利用该文件,我们只需要将ToastNotifier.exe复制到C:\Windows\Temp\AviraVPNInstaller.exe。由于所有条件都已满足,VPN服务就会在启动时以SYSTEM权限运行该文件。攻击者可以通过重启操作、或者以管理员身份运行powershell,依次执行Get-Service AviraPhantomVPN | Stop-Service以及Get-Service AviraPhantomVPN | Start-Service来启动服务。一旦成功执行,ToastNotifier.exe(现在是C:\Windows\Temp\AviraVPNInstaller.exe)就会尝试从C:\Windows\temp目录中加载一系列DLL:

分析Avira VPN的两处提权漏洞

为了将权限提升至SYSTEM,我们只需要植入其中一个DLL即可,这里我们选择劫持cryptnet.dll。这样VPN服务就会以SYSTEM权限执行我们的AviraVPNInstaller.exe程序,后者会以SYSTEM权限加载cryptnet.dll,这正是我们的恶意代码。最终,我们的低权限用户可以成功提升至SYSTEM权限:

披露时间

  • 2018年9月28日:将漏洞提交至Avira
  • 2018年10月1日:Avira复现该漏洞
  • 2018年12月13日:Avira修复该漏洞

 

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: