CVE-2020-0668:任意文件移动导致的本地提权

iso60001  250天前

22.jpg

在这篇文章中,我将介绍在Windows Service Tracing中发现的一个任意文件移动漏洞。从我的测试来看,它影响了从Vista到10的所有操作系统版本,而且XP也有这个功能(可能存在潜在的威胁)。

介绍

Service Tracing是一个古老的功能,最早可以追溯到Windows XP,而在更古老的操作系统中可能也存在类似功能。它旨在提供有关运行服务和模块的一些基本调试信息,它可由任何本地用户配置,只需在HKLM\SOFTWARE\Microsoft\Tracing下编辑一些注册表键和值。

一个服务或模块往往与其中一个注册表键相关联。每个键包含6个值(相关设置)。我们将关注其中的三个值:EnableFileTracing(启用/禁用“跟踪”)、FileDirectory(设置输出日志文件的位置)和MaxFileSize(设置日志文件的最大文件值)。

在启用了EnableFileTracing后,目标服务将开始写入你选择的目录中的日志文件。一旦输出文件的大小超过MaxFileSize,它就会被移动(.log扩展名改为.old),并创建一个新的日志文件。

多亏了James Forshaw的符号链接测试工具,使得利用这个漏洞变得非常简单。你所需要做的就是将日志目录设置为\RPC Control对象目录的挂载点,然后创建两个符号链接:

  • 一个从MODULE.LOG链接到你控制的文件(其大小必须大于MaxFileSize)。

  • 另外一个从MODULE.OLD链接到文件系统中的任意文件(例如C:\Windows\System32\WindowsCoreDeviceInfo.dll)。

最后,文件的一系列改动被触发(以NT AUTHORITY\SYSTEM权限),通过Update Session Orchestrator服务来执行任意命令。

The Tracing Feature for Services

如前所述,任何本地用户都可以配置Service Tracing功能,只需在HKLM\SOFTWARE\Microsoft\Tracing下编辑一些注册表键和值即可。

使用来自Windows Sysinternals工具套件的AccessChk,我们可以看到普通用户几乎对所有的子键都具有读/写权限。

33.png

接下来,我将以RASTAPI模块作为示例,因为它是我攻击脚本的一部分。这个模块主要被IKEEXT服务(和IPsec有关)使用。因此,可以通过初始化虚拟VPN连接轻松触发日志事件。下面的截图显示了注册表项的默认内容,和其他服务和模块配置了完全相同的值。

44.png

从攻击者的角度来看,以下是最有趣的值:

55.png

通过设置这些值,我们可以:

  • EnableFileTracing设置为0或1,强制特定的服务或模块启动或停止输出日志文件(调试信息写入日志文件)。

  • 设置FileDirectory来指定日志文件的位置。

  • 设置MaxFileSize指定输出文件的最大大小。

唯一需要注意的是,我们不能选择输出文件的名称,因为它是基于被调试的服务或模块的名称自动生成。不过,使用符号链接可以很容易地解决这个问题。

任意文件移动

考虑到前面所有的内容,漏洞说明如下。

Case #1: MaxFileSize - Default value

在第一个测试中,我将C:\LOGS设置为输出目录,并启用File Tracing

66.png

如果我们希望目标服务开始写入日志文件,就必须产生一些事件。一种非常简单的方法是使用rasdial命令和PBK文件初始化一个虚拟VPN连接。

77.png

很好!日志文件产生,是以NT AUTHORITY\SYSTEM权限编写的,现在大小约为24KB。

88.png

Case #2: MaxFileSize - Custom value

在前面的测试中,输出的日志文件最终大小约为24KB。因此,这一次,我们将把MaxFileSize设置为0x4000(16384字节)并再次测试。

99.png

Process Monitor捕获的事件有:

1.日志文件的基本信息。我们可以看到,EndOfFile的偏移量为23906,这是此时文件的大小。但问题是,我们指定了最大文件大小为16384字节,因此系统将认为没有更多的空闲空间。

2.SetRenameInformationFile操作被调用,文件名成为C:\LOGS\RASTAPI.OLD。换句话说,因为现在机器认为文件被写满,所以它从C:\LOGS\RASTAPI.LOG移到了C:\LOGS\RASTAPI.OLD

3.该服务创建一个新的C:\LOGS\RASTAPI.LOG文件,并开始向它写入数据。

这种文件“移动”操作是以NT AUTHORITY\SYSTEM权限执行的。因此,它可将所有文件移动到系统的任何位置,比如C:\Windows\System32\

100.png

利用

整体攻击流程可概括为:

1.创建(或复制)一个大于0x8000(32768)字节的恶意DLL(FakeDll.dll)。

2.创建一个新目录(例如C:\EXPLOIT\mountpoint\),并将其设置为\RPC Control的挂载点。

3.创建以下符号链接:

\RPC Control\RASTAPI.LOG -> \??\C:\EXPLOIT\FakeDll.dll (owner = current user)
\RPC Control\RASTAPI.OLD -> \??\C:\Windows\System32\WindowsCoreDeviceInfo.dll

4.在注册表中配置以下值:

FileDirectory = C:\EXPLOIT\mountpoint
MaxFileSize = 0x8000 (32,768‬ bytes)
EnableFileTracing = 1

5.使用Windows API中的RasDial功能触发RASTAPI的相关事件。

6.触发Update Session Orchestrator服务,以NT AUTHORITY\SYSTEM权限加载恶意DLL。

Demo

图片.png

参考

MSRC - CVE-2020-0668

https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-0668

Windows Exploitation Tricks: Exploiting Arbitrary File Writes for Local Elevation of Privilege

https://googleprojectzero.blogspot.com/2018/04/windows-exploitation-tricks-exploiting.html

Symbolic Link Testing Tools

https://github.com/googleprojectzero/symboliclink-testing-tools

UsoDllLoader

https://github.com/itm4n/UsoDllLoader

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://itm4n.github.io/cve-2020-0668-windows-service-tracing-eop/?utm_source=share&utm_medium=ios_app&utm_name=iossmf

最新评论

昵称
邮箱
提交评论