这篇文章是翻译文章,原文来自这里,这个提权方法比较小众,但是就当一种知识学习吧。漏洞软件是 Windows SonicWall全球VPN客户端。
背景
可执行搜索命令劫持
Windows系统使用一种通用的方法来查找需要加载的可执行文件或动态加载库(dll)。
当一个可执行文件被一个正在运行的进程搜索,而该文件没有指定一个特定的路径时,Windows将通过已知顺序的目录来搜索该可执行文件。如果操作系统还是无法找到可执行文件,那么最后Windows将搜索环境变量。系统会首先搜索系统级的环境变量(其只能被系统管理员修改),然后再搜索用户态的环境变量(其可以被普通用户所修改)。
在本文中,我们将不关注特权进程依赖于用户拥有的PATH环境变量的情况,因为这是一种不受欢迎的、不可利用的想法。
我们将讨论更常用的系统级环境变量,它由一系列特权目录组成,这些目录包含系统常用的可执行文件:
漏洞分析
SonicWall Global VPN客户端使用 Windows 安装程序来进行安装或卸载。而为了安装(或卸载)“SonicWall IPSec驱动程序”,安装程序会提取 dneinst.exe,这是一个Citrix应用程序,功能是测量和控制操作系统和网络协议设备堆栈。该组件也可以在系统中执行。
在执行过程中,dneinst.exe创建PowerShell进程来执行PowerShell命令,而没有指定完整的PowerShell.exe路径,该操作是在最高权限下执行的。而该行为就会留下安全漏洞
通常,要进行安全的CreateProcess调用,最佳方法是对目标程序使用完整路径调用。在本例中,powershell.exe仅由其文件名调用。这种情况下触发Windows搜索powershell.exe的顺序如下:
- 当前程序所在目录
- 当前父进程所在目录
- 32位系统目录,使用 GetSystemDirectory 函数获取
- 16位系统目录,没有函数能获取该路径,但是其被默认为搜索 System路径
- Windows目录,使用 GetWindowsDirectory 函数获取
- 当前环境变量(PATH)列表中的目录,注意该功能不会搜索由 App Paths注册表项指定的每个应用程序路径,要在搜索路径中包含每个应用程序的路径,需要使用 ShellExecute功能
Powershell.exe通常可以在以下路径找到:
- C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
- C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
因此,执行将在最后一步,也就是它通常存在的路径中成功加载它。但是,如果系统安装了Python,那么Python路径就会在powershell.exe目录位置之前添加到path环境变量中。
当Python创建这些目录(如C:\Python27)时,它们会被授予许可权限,允许任何经过身份验证的用户(包括未授权用户)写入这些位置:
开发人员确保了环境变量(PATH)不能被普通用户修改,但是其却没有确保普通应用程序对环境变量的修改。
漏洞利用
为了利用这个漏洞,普通用户可以创建一个“恶意”文件,将其命名为powershell。在系统路径环境变量C:\Windows\SysWOW64\WindowsPowerShell\v1.0之前,将它复制到他能够访问的目录中。例如,C: \ Python27。然后,用户所要做的就是等待PowerShell脚本运行
缓解措施
这个漏洞可以通过简单地在指定powershell.exe的完整路径来减轻。
受影响的产品和版本
SonicWall Global VPN client 4.10.4.0314及更早版本。
参考
- 本文作者: A1ex
- 本文链接: http://yoursite.com/2021/03/11/CVE-2020-5144权限提升漏洞分析/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!