CVE-2020-0668-Windows服务跟踪中的普通特权升级错误
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
。
通过使用AccessChk
Windows 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。因此,这次,我们将设置MaxFileSize
为0x4000
(16,384字节)并重新开始测试。
“过程监视器”捕获的事件可以总结如下:
- 该服务将获取有关日志文件的基本信息。我们可以看到,
EndOfFile
在转换23906,这是在这一刻文件的大小。问题是我们指定的最大文件大小为16,384字节,因此,系统将认为没有更多的可用空间。 SetRenameInformationFile
被称为FileName=C:\LOGS\RASTAPI.OLD
。换句话说,由于现有文件被视为已满,因此将其从C:\LOGS\RASTAPI.LOG
移到C:\LOGS\RASTAPI.OLD
。- 该服务将创建一个新
C:\LOGS\RASTAPI.LOG
文件并开始进行进行写入。
“移动”操作按进行NT AUTHORITY\SYSTEM
。因此,可以利用所有者拥有的文件移动到文件系统上的任何位置,例如C:\Windows\System32\
。
进攻利用
该突破利用很简单,可以总结如下:
创建(或复制)一个大小大于
0x8000
(32,768)字节的文件。创建一个新目录(
C:\EXPLOIT\mountpoint\
例如)放入其设置为的挂载点\RPC Control
。创建以下符号链接:
\RPC Control\RASTAPI.LOG -> \??\C:\EXPLOIT\FakeDll.dll (owner = current user)
\RPC Control\RASTAPI.OLD -> \??\C:\Windows\System32\WindowsCoreDeviceInfo.dll
在注册表中配置以下值:
FileDirectory = C:\EXPLOIT\mountpoint
MaxFileSize = 0x8000 (32,768 bytes)
EnableFileTracing = 1
使用
RasDial
Windows API中的函数触发与RASTAPI相关的事件。触发更新会话Orchestrator服务以在其自身的中加载DLL
NT AUTHORITY\SYSTEM
。
演示版
CVE-2020-0668-Windows服务跟踪中的普通特权升级错误的更多相关文章
- 记一次windows服务开发中遇到的问题
最近在研究windows service和quartz.net,所以迅速在园子大神那里扒了一个demo,运行,安装一切顺利. 但在在App.config配置中增加了数据库连接字符串配置后,服务安装后无 ...
- Windows2012中安装Nginx并创建为Windows服务
安装Nginx 下载windows版nginx (http://nginx.org/download/nginx-1.10.0.zip),之后解压到需要放置的位置(D:\xampp\nginx) 将N ...
- 编写寄宿于windows服务的WCF服务
由于业务中有些任务需要在后台静默长期运行,或者有些服务队响应的要求比较苛刻,这样的WCF服务就不适合寄宿于IIS中.IIS每隔一段时间w3wp进程会闲置超时,造成服务的运行停止,因此这种耗时或者定时任 ...
- C# Windows服务的创建、安装、调试
一.查看已有的Windows服务 选择菜单"开始"-〉"控制面板"-〉"管理工具"-〉"服务"来查看现有系统中的服务 二 ...
- 创建、设置和安装Windows服务
文章大部分内容转自:http://www.cnblogs.com/greatandforever/archive/2008/10/14/1310504.html:和:http://www.cnblog ...
- C#代码安装Windows服务(控制台应用集成Windows服务)
最近在为一款C/S架构的科研软件开发云计算版,需要用到WCF,考虑到不需要什么界面以及稳定性,无人值守性,准备用Windows Service作为宿主,无奈Windows Service的安装太为繁复 ...
- windows服务加定时器实现
首先在项目中添加windows服务 然后双击“MainService.cs”,在上面点右键“打开代码” 以下是我的实例代码 partial class MainService : ServiceBas ...
- web站点和windows服务项目发布时如何排除指定文件
在发布asp.net站点和windows服务项目时,有的时候这样的需求:msbuild编译之后发布到服务器指定目录时要排除指定文件,比如通过jenkins构建时,不希望覆盖原来的Web.config和 ...
- C#创建、设置和安装Windows服务
文章大部分内容转自:http://www.cnblogs.com/greatandforever/archive/2008/10/14/1310504.html:和:http://www.cnblog ...
随机推荐
- 用户输入- Unity3D游戏开发培训
用户输入- Unity3D游戏开发培训 作者:Jesai 时间:2018-02-12 14:28:45 用户输入Input 鼠标按键: -方法:GetMouseButton(); -方法:GetM ...
- Java入门 - 语言基础 - 11.switch_case
原文地址:http://www.work100.net/training/java-switch-case.html 更多教程:光束云 - 免费课程 switch_case 序号 文内章节 视频 1 ...
- (分块)GukiZ and GukiZiana CodeForces - 551E
题意: 给你一段序列,并且有两种操作 操作①:将序列中从l-r每个元素加上x 操作②:在序列中找到ai=aj=y,j-i的最大值,如果找不到则输出-1 思路: 直接分块暴力即可 对于区间加,普通标记加 ...
- Spring加载早期获取BasePackage
public class GetBasePackage { private Class<? extends Annotation> annotation; public GetBasePa ...
- 【javaWeb】HttpServletRequest常用获取URL的方法
1.request.getRequestURL() 返回的是完整的url,包括Http协议,端口号,servlet名字和映射路径,但它不包含请求参数. 2.request.getRequestURI( ...
- 废旧手机利用之装一个Linux系统
开篇: 在废旧手机变废为宝的路上一直没有停下,做过电脑遥控器,家居监控器,给电脑扩展屏幕以及跟着大佬学过智能机器人,但是都是一时兴趣,除了家具监控器目前正在使用之外其他也没有使用了. 最近在学习Lin ...
- python接口自动化测试 - configparser配置文件解析器详细使用
configparser简介 ConfigParser模块已在Python 3中重命名为configparser 该模块定义了ConfigParser类. ConfigParser类实现一种基本的配置 ...
- 第二次团队作业-需求分析(By七个小矮人)
第二次团队作业-需求分析 一.格式描述 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/ 这个作 ...
- BERT模型总结
BERT模型总结 前言 BERT是在Google论文<BERT: Pre-training of Deep Bidirectional Transformers for Language U ...
- Macbook 安装 opencv(cv2) 及在pycharm 下的使用
python和opencv的安装都很顺利,就是在PyCharm下的配置浪费了一点时间. 一.原料 1.max系统 2.python(本文用的版本是3.6.5) 3.opencv(本文中使用的版本是3. ...