CVE-2020-0668-Windows服务跟踪中的普通特权升级错误

在这里中,我将讨论在Windows Service跟踪中发现的任意文件移动漏洞。从我的测试来看,它影响了从Vista到10的所有Windows版本,但它可能更旧,因为XP中已经存在此功能。

服务跟踪是一项旧功能,我可以转换到Windows XP,但它可能已存在于以前的OS版本中。它逐步提供有关正在运行的服务和模块的一些基本调试信息。任何本地用户都可以配置它,只是在下编辑一些导航项和值即可HKLM\SOFTWARE\Microsoft\Tracing

服务或模块与注册表项关联。每个键包含6个值(即设置)。我们将关注的3个值是:(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服务获取任意代码执行。

服务的跟踪功能

如前所述,任何本地用户都可以配置Service Tracing功能,只需在中编辑一些插入项和值即可HKLM\SOFTWARE\Microsoft\Tracing

通过使用AccessChkWindows Sysinternals工具套件,我们可以看到常规对几乎所有子键都Users具有Read/ Write权限。

在此处的其余部分中,我将以该RASTAPI模块为例,因为它是我利用漏洞利用的模块。因此,可以通过启动虚拟VPN连接轻松触发日志事件。以下快照显示了注册表项的全部内容。为其他服务和模块配置了完全相同的值。

从本地攻击者的角度来看,这是最有趣的值:

名称 可能的值 描述
EnableFileTracing 0-1 开始/停止写入日志文件。
文件目录 一个弦 目录的绝对路径。
最大文件大小 0x00000000-0xffffffff 输出日志文件的最大大小。

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

  • 通过设置为或,强制特定的服务或模块开始或停止将调试信息写入日志文件。EnableFileTracing``0``1
  • 通过设置指定日志文件的位置FileDirectory
  • 通过设置指定输出文件的最大大小MaxFileSize

唯一需要注意的是,我们无法选择输出文件的名称,因为它基于调试的服务或模块的名称。使用符号链接可以轻松解决此问题。

任意文件移动防御

考虑到某些的所有先前元素,可以轻松地解释此突破。

情况1:MaxFileSize-最小值

对于第一个测试用例,我只是将其设置C:\LOGS为输出目录并启用了File Tracing

现在,如果我们希望目标服务开始写入此文件,则必须生成一些事件。一种非常简单的方法是使用rasdial命令和PBK文件启动虚拟VPN连接。

有效!日志文件由NT AUTHORITY\SYSTEM编写。它的大小现在大约24KB。

情况2:MaxFileSize-自定义值

在先前的测试中,我们看到输出日志文件的最终大小约为24KB。因此,这次,我们将设置MaxFileSize0x4000(16,384字节)并重新开始测试。

“过程监视器”捕获的事件可以总结如下:

  1. 该服务将获取有关日志文件的基本信息。我们可以看到EndOfFile转换23906,这是在这一刻文件的大小。问题是我们指定的最大文件大小为16,384字节,因此,系统将认为没有更多的可用空间。
  2. SetRenameInformationFile被称为FileName=C:\LOGS\RASTAPI.OLD。换句话说,由于现有文件被视为已满,因此将其从C:\LOGS\RASTAPI.LOG移到C:\LOGS\RASTAPI.OLD
  3. 该服务将创建一个新C:\LOGS\RASTAPI.LOG文件并开始进行进行写入。

“移动”操作按进行NT AUTHORITY\SYSTEM。因此,可以利用所有者拥有的文件移动到文件系统上的任何位置,例如C:\Windows\System32\

进攻利用

该突破利用很简单,可以总结如下:

  1. 创建(或复制)一个大小大于0x8000(32,768)字节的文件。

  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. 使用RasDialWindows API中的函数触发与RASTAPI相关的事件。

  6. 触发更新会话Orchestrator服务以在其自身的中加载DLL NT AUTHORITY\SYSTEM

演示版

CVE-2020-0668-Windows服务跟踪中的普通特权升级错误的更多相关文章

  1. 记一次windows服务开发中遇到的问题

    最近在研究windows service和quartz.net,所以迅速在园子大神那里扒了一个demo,运行,安装一切顺利. 但在在App.config配置中增加了数据库连接字符串配置后,服务安装后无 ...

  2. Windows2012中安装Nginx并创建为Windows服务

    安装Nginx 下载windows版nginx (http://nginx.org/download/nginx-1.10.0.zip),之后解压到需要放置的位置(D:\xampp\nginx) 将N ...

  3. 编写寄宿于windows服务的WCF服务

    由于业务中有些任务需要在后台静默长期运行,或者有些服务队响应的要求比较苛刻,这样的WCF服务就不适合寄宿于IIS中.IIS每隔一段时间w3wp进程会闲置超时,造成服务的运行停止,因此这种耗时或者定时任 ...

  4. C# Windows服务的创建、安装、调试

    一.查看已有的Windows服务 选择菜单"开始"-〉"控制面板"-〉"管理工具"-〉"服务"来查看现有系统中的服务 二 ...

  5. 创建、设置和安装Windows服务

    文章大部分内容转自:http://www.cnblogs.com/greatandforever/archive/2008/10/14/1310504.html:和:http://www.cnblog ...

  6. C#代码安装Windows服务(控制台应用集成Windows服务)

    最近在为一款C/S架构的科研软件开发云计算版,需要用到WCF,考虑到不需要什么界面以及稳定性,无人值守性,准备用Windows Service作为宿主,无奈Windows Service的安装太为繁复 ...

  7. windows服务加定时器实现

    首先在项目中添加windows服务 然后双击“MainService.cs”,在上面点右键“打开代码” 以下是我的实例代码 partial class MainService : ServiceBas ...

  8. web站点和windows服务项目发布时如何排除指定文件

    在发布asp.net站点和windows服务项目时,有的时候这样的需求:msbuild编译之后发布到服务器指定目录时要排除指定文件,比如通过jenkins构建时,不希望覆盖原来的Web.config和 ...

  9. C#创建、设置和安装Windows服务

    文章大部分内容转自:http://www.cnblogs.com/greatandforever/archive/2008/10/14/1310504.html:和:http://www.cnblog ...

随机推荐

  1. 理解setTimeout()

    之前在网上看了很多关于setTimeout的文章,但我感觉都只是点到为止,并没有较深入的去剖析,也可能是我脑袋瓜笨,不容易被点解.后面看了<你不知道的javascript-上卷>一书,决定 ...

  2. java Random类(API)

    一.过程 1.导包 2.实例化 3.使用(类的成员方法) 二.作用 生成随机数,与python中random 相似 三.常用方法 1.nextInt(),随机生成int数据类型范围的数 2.nextI ...

  3. unbuntu18.04安装启用splash

    官网:https://splash.readthedocs.io/en/stable/ 1.安装Docker https://www.cnblogs.com/wt7018/p/11880666.htm ...

  4. springboot 报错nested exception is java.lang.IllegalStateException: Failed to check the status of the service xxxService No provider available for the service

    spring: dubbo:#关闭所有服务的启动时检查:(没有提供者时报错) consumer: check: false timeout: 3000

  5. MySql主要性能指标说明

    在项目当中数据库一般都会成为主要的性能与负载瓶颈,那么针对数据库各项性能指标的监控与对应的优化是开发与运维人员需要面对的主要工作,而且这部分的工作会贯穿项目从开发到运行的整个周期里. 这篇文章中我们对 ...

  6. FreeImage 结合 VB6 使用技巧

    1.图片(Bitmap)改变为32位使用FreeImage_ConvertColorDepth函数.图片半透明绘制需要图片(Bitmap)是32位的. 2.图片(Bitmap)的半透明绘制使用函数:F ...

  7. 使用Jenkins持续集成

    本篇文章主要说明的是如何使用Jenkins持续集成自己的代码. 1.Jenkins的安装与配置 使用Jenkins之前需要安装和配置Jenkins,具体安装和配置方法参照这个博客:http://www ...

  8. 使用 CompletableFuture 异步组装数据

    使用 CompletableFuture 异步组装数据 一种快捷.优雅的异步组装数据方式 实际项目中经常遇到这种情况: 从多个表中查找到数据然后拼装成一个VO返回给前端. 这个过程有可能会非常耗时.因 ...

  9. 小白学Java:RandomAccessFile

    目录 小白学Java:RandomAccessFile 概述 继承与实现 构造器 模式设置 文件指针 操作数据 读取数据 read(byte b[])与read() 追加数据 插入数据 小白学Java ...

  10. IDEA启动报错Plugin Error Problems found loading plugins的解决办法

    错误描述 今天启动项目时发现IDEA控制台出错,tomcat的标志变成问号,启动不了服务器 Problems found loading plugins: Plugin "Persisten ...