Windows之任意文件删除到提权

news2024/11/21 2:37:40

前言

ZDI 发表过从任意文件夹删除到提权的利用过程,还提供了任意文件删除到提权的利用过程,所以一字之差但是漏洞利用方式也是有细微偏差的。
这里把任意文件删除和任意文件夹删除漏洞提权结合起来分析,是因为其最后的利用过程是一样的,通过不同的CVE漏洞利用过程来加深这种别样提权手法的理解。
关于符号链接测试工具可以利用pj0的即可在文后。

Windows通过任意文件删除到完成提权NT AUTHORITY\SYSTEM

原理思考:
了解任意文件删除如果到提权的利用,我们首先还是要了解一些前置基础。比如在Windows上文件是使用DACL锁定,还有Windows上还存在着文件共享这一特点,这就会导致某些关键的系统文件会在某一特定时刻无法访问,这样情况相信很多时候都会遇见。
而关于DACL(自由访问控制列表) 它则是属于ACL的两种类型之一,ACL是访问控制列表,是ACE(访问控制条目)的列表。
ACL除了DACL还有SACL类型。DACL(自由控制列表)标志允许或者拒绝访问安全对象的受信人,当进程尝试访问安全对象的时候,系统会检查对象DACL中的ACE以此来确定是否向其授予访问权限。
如果对象没用DACL也就是没有限制了,那么系统会向所有人授予完全访问权限,如果对象的DACL中没有ACE那么ADCL将会拒绝不允许任何访问权限。
Windows Installer 服务:此服务负责应用程序的安装,通常是一个.msi后缀的文件。每次对系统进行更改时,Windows Installer会记录更改,而且如果安装包是更新的安装包或电脑上已经存在现有文件,那么再次安装的时候会保留旧版的副本,这个记录就允许Windows Installer服务将系统还原到其原始状态。位置文件是X:\Config.Msi的文件夹

Windows Installer 会将更改记录在X:\Config.msi中的rbs(回滚脚本)文件中,而原始文件的副本存放的文件扩展名是rbf(回滚文件)这样当回滚时候,服务就会读取rbs 和 rbf 文件,使系统恢复安装前的状态。
为了保护机制的安全性(因为在回滚期间是可能会对系统其他文件进行任意的更改的),Windows Installer在X:\Config.Msi和其中的文件都会设置强DACL来对其进行保护。
在这里插入图片描述

那假设此时我们已经有了任意文件的删除漏洞,那么我们就可以在Windows Installer创建X:\Config.Msi文件夹后立即删除它,然后再使用弱DACL权限去创建X:\Config.Msi。这样Windows Installer在X:\Config.Msi 中创建了回滚文件之后,我们就可以将其中的rbs/rbf 进行篡改,这样在回滚的时候Windows Installer 执行的回滚操作都是我们设计好的,这样就能对系统进行任意的修改操作。

在这里插入图片描述

这里我们拿zdi官方提供的代码瞅一瞅:
代码结构中给了三个FolderOrFileDeleteToSystem 和 FolderContentsDeleteToFolderDelete 还有SystemCmdLauncher,
SystemCmdLauncher这个就是最后调用system cmd的先不用管。根据使用步骤zdi说先使用
FolderOrFileDeleteToSystem 再运行FolderContentsDeleteToFolderDelete,那先来看一下其中代码的具体实现。
bitnessCheck 函数是用来检测当前的架构x64 or x32 和我们加载的动态链接库是否匹配

在这里插入图片描述

然后DWORD WINAPI install() 函数就是用来安装MSI软件包操作了,拿到句柄之后找到类型为msi的资源,然后构建一个msi软件包的路径,放到windows 的临时目录tmp下,这时再用OpenFileNative创建msi软件包文件,并获取其句柄。后续再将加载的msi软件包写入到文件中,然后设置INSTALLUILEVEL_NONE 使其关闭用户界面,然后调用安装和卸载MSI软件包。此函数主要是准备工作

在这里插入图片描述

这里它设置了线程的优先级,使其优先级较高,这样有助于提高成功率。然后就是循环尝试打开C:\Config.Msi目录了,等待C:\Config.Msi被创建之后再等待其被删除。这对应的就是上述流程的第二步操作
在这里插入图片描述

检查文件是否存在,能否被删除。删除成功之后才会继续如下步骤,也是校验漏洞是否有效 在这里插入图片描述

然后尝试创建打开或创建C:\Config.Msi文件夹,再对其判断其中是否为空,只有为空我们才能继续下边的操作
在这里插入图片描述

然后调用了SetPriorityClass,SetThreadPriorityBoost,SetThreadPriority 去设置我们当前进程和线程的优先级,再对目录上加oplock锁,并且等待锁的释放

SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
SetThreadPriorityBoost(GetCurrentThread(), TRUE);      // This lets us maintain express control of our priority
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
op.CreateAndWaitLock(hc, callback);

然后在创建循环,不断去尝试打开C:\Config.Msi文件夹,检测到被打开之后才会退出。然后监听其中是否产生了.rbs文件,其次就是上述步骤中SetSecurityInfo 把DACL 安全级降为弱,这样后续对Config.Msi的操作就没事了,然后分别将 dllBuff 和 dllBuff2 写入 rbs 和 rbf 文件,等着后边回滚操作。然后等待线程完成(切记关闭句柄操作)

在这里插入图片描述

这是FolderOrFileDeleteToSystem的主要操作。再来看一下运行此之后FolderContentsDeleteToFolderDelete的操作,这一部分主要是为了任意文件删除漏洞所做的操作,通过创建符号链接将 \RPC Control\expfile 指向目标文件也就是C:\Config.Msi::$INDEX_ALLOCATION
在这里插入图片描述

后续操作是设置目标目录 然后创建目录结构,再通过RemoveDirectory 删除目录中的内容,然后使用CreateLock 创建锁,并且给锁上回调函数,然后等待锁的释放这样就确保删除的操作完成。

在这里插入图片描述

其实关键的步骤还是在于FolderOrFileDeleteToSystem,因为在其中准备好了msi的安装过程和回滚操作,而FolderContentsDeleteToFolderDelete也是为了将文件(夹)删除彻底。
这里要提一嘴就是 我们的漏洞原语是任意文件夹删除漏洞,如果是任意文件删除漏洞是,我们要先从C:\MyFolder:: I N D E X A L L O C A T I O N 找到索引数据,然后删除文件夹的 : : INDEX_ALLOCATION找到索引数据,然后删除文件夹的 :: INDEXALLOCATION找到索引数据,然后删除文件夹的::INDEX_ALLOCATION 流会有效地从文件系统中删除该文件夹。然后通过API–DeleteFileW 删除。这在上述zdi的代码中已经有了体现。
通过ZDI 提供的CVE-2022-21838 漏洞利用步骤,我们再来复盘一下上述的操作
此漏洞是关于SilentCleanup服务的,它是在windows上用system运行的,通过此服务的任意文件删除漏洞
首先创建子文件夹temp\folder1
然后创建文件temp\folder1\file1.txt
然后在文件上 加oplock temp\folder1\file1.txt
然后等待进程去枚举temp\folder1 文件夹的内容,并且尝试删除其中的文件file1.txt。此时会触发oplock锁。
然后将file1.txt移动位置,这样temp\folder1 文件夹 会为空。可以删除。这时要注意 移动file1.txt的目的不仅是为了删除它
因为删除此文件需要我们释放最开始创建的oplock锁,但这样我们可以继续维持oplock的状态。
然后创建temp\folder1 作为\RPC Controlfolder 对象的命名空间
然后在\RPC Control\file1.txt上创建符号链接 指向C:\Config.Msi::$INDEX_ALLOCATION(因为这是任意文件删除漏洞,所以需要INDEX_ALLOCATION的流)
然后回调完成,oplock锁释放掉,file1.txt被删除其实已经链接到C:\Config.Msi了,就导致C:\Config.Msi删除。

Windows Backup Service-CVE-2023-21752 到本地提权

了解zdi 关于任意文件删除到提权的阐述,来从Windows Backup Service-CVE-2023-21752来再巩固一下
此漏洞作者也是提供了利用的脚本,值得的一提的漏洞作者其实在之前也针对此类型的漏洞做过挖掘。
MSIExecEoP :其实漏洞的手法也是一样的,因为此漏洞也是任意文件删除漏洞,其关键点在于 C:\users%username%\appdata\roaming\microsoft\installer此目录DACL设置的问题,允许每个读取访问权限也就是DACL设置较弱,从而就用户对父目录具有删除权限了。

在这里插入图片描述

其脚本关键的点还是在于符号链接的设置和使用op = FileOpLock::CreateLock(hFile, cb0); 对文件上锁的操作。 在这里插入图片描述

回过头说CVE-2023-21752漏洞,漏洞点出现在sdengin2.dll中,通过diff的结果,发现变化的函数其实没有多少,主要是IsWritable函数和 CSdCommonImpl::_IsValidStagingArea函数。

在这里插入图片描述

通过对比很快就可以发现前边并没有改变直到if判断将GetTempFileNameW 函数检查 修改成了CheckDevicePathIsWritable 函数检查了。GetTempFileNameW是用来创建临时文件的。 如果生成唯一的文件名,则会创建一个空文件并释放其句柄;否则仅生成文件名。而CheckDevicePathIsWritable将会在释放句柄时将文件直接删除,这样就省略了后续文件删除操作。
在这里插入图片描述
这里就是还将后续删除文件的操作也去掉了

在这里插入图片描述

但SxDeleteFile 函数并没有去掉,只是在漏洞点处将其判断删除掉了。但这样后续SxDeleteFile 调用DeleteFileW删除文件的操作也无了。这样后续也可以看看是否有其他处利用此函数删除文件的操作,看校验是否严谨。

在这里插入图片描述

也可以通过运行exp的时候使用Process Monitor监控此exp对文件的操作流程,和关键删除文件的点来确认漏洞的位置因为相比较利用是由文件操作类型的漏洞通过Process Monitor监控对于diff来说确实可以更快的就定位到漏洞点。监控脚本对文件的操作可以发现,一直在不断的尝试获取句柄然后加oplock

在这里插入图片描述

最后脚本利用的效果如下。

在这里插入图片描述

因为此漏洞是条件竞争类型漏洞。所以脚本的利用成功率并不是百分百的。作者也提供了调用cmd.rbs。完整调用cmd的exp。也就是利用msi回滚 cmd.rbs 完成操作。但毕竟是条件竞争型漏洞,所以得要多运行几次才行。
在这里插入图片描述

为整个过程中有一个上锁的操作,这样就导致在exp中创建了临时文件时并且将符号链接到了C:/Config.msi::$INDEX_ALLOCATION 此时msi又被锁住就导致句柄被占用了。而msi线程又同时在监测C:/Config.msi文件的创建和删除,导致循环过程中错过第二次创建的流程,导致线程创建失败。解决方案在参考链接中zoemurmure师傅提出的,就是不进行二次监控,直接释放锁,因为文件创建非常快。这样就可以继续,也可以理解为大力出奇迹,当第一次流程完成之后,直接不断的循环访问终至成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1383985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示)

目录 一、MongoDB 索引 1.1、说明 1.2、原理 1.3、操作 1.3.1、创建索引 1.3.2、查看集合索引列表 1.3.3、查看集合索引大小 1.3.4、删除集合所有索引 1.3.5、删除集合指定索引 1.3.6、创建复合索引 1.4、聚合 a) 统计每个作者写的文章数 b&#xff09…

【NI国产替代】PXIe‑6375,208路AI(16位,3.8 MS/s),2路AO,24路DIO,PXI多功能I/O模块

PXIe,208路AI(16位,3.8 MS/s),2路AO,24路DIO,PXI多功能I/O模块 PXIe‑6375提供了模拟I/O、数字I/O和四个32位计数器/定时器,用于PWM、编码器、频率、事件计数等应用。 该设备利用高吞…

通过本质看现象:关于Integer受内部初始化赋值范围限制而出现的有趣现象

文/朱季谦 这是我很多年前的第一篇技术博客,当时作为一名技术小菜鸟,总体而言显得很拙见,但也算是成长路上的一个小脚印,希望能在以后的日子里,可以对JAVA技术有一个更加深入的思考与认识。 前几天我在逛论坛的时候&a…

webpack执行流程知识点总结

webpack的运行流程 Webpack 的运行流程是一个串行的过程,从启动到结束会依次执行以下流程: 在以上过程中,Webpack 会在特定的时间点广播出特定的事件,插件在监听到感兴趣的事件后会执行特定的逻辑,并且插件可以调用 We…

网工内推 | 信息安全主管,CISP/CISSP认证优先,最高25K

01 武汉华康世纪医疗股份有限公司 招聘岗位:网络安全主管 职责描述: 1、推进公司信息/网络安全管理体系规划、建设、持续改进,促进信息安全管理的推行落地,保障网络、系统与数据安全; 2、维护管理信息/网络管理软件,设…

Centos7,Python3.7.6安装模块Crypto,pycryptodome,ibm_db,requests,requests_pkcs12

Centos7,Python3.7.6安装模块Crypto,pycryptodome,ibm_db,requests,requests_pkcs12 Python版本:python3.7.6 对应的各种模块 前言:把python项目放到linux上运行时,提示缺少各种模块,安装命令…

openFeign 多模块调用失败问题

第一次做一个完整的SpringCloud微服务项目,踩了好多好多坑,都记录下来! openFeign 多模块调用失败 排错第一阶段 创建一个openfeign服务,并把它注册到nacos上去 然后A模块通过Feign调用B模块 但是我在A模块实现AdminArticleServiceFeignClient这个接口,报错: 后面我查找这个问…

OSPF : 区域 / 为什么非骨干互访需要经过骨干

概述 OSPF系列第二篇 , 今天来围绕着区域这个概念展开写一篇博客 分区背景 先来讨论一下技术背景 , 也就是为什么要分区 ? 所有设备都在一个区域不行吗 会有什么问题呢 . 首先明确一个知识点 : 正常状态下一个区域内的所有设备的LSDB都是一样的.区域内的路由器必须为所属的…

小程序基础学习(请求封装)(重点,核心)

目录 首先: 封装一个request请求的js文件,用的是Promise 然后: 请求编写 原理:首先在页面加载完成以后发送一次请求数据,由于请求的数据会反复使用,直接把他抽离到外面,以后直接调用。在使用a…

如何用MetaGPT帮你写一个贪吃蛇的小游戏项目

如何用MetaGPT帮你写一个贪吃蛇的小游戏项目 MetaGPT是基于大型语言模型(LLMs)的多智能体写作框架,目前在Github开源,其Start数量也是比较高的,是一款非常不错的开源框架。 下面将带你进入MetaGPT的大门,开启MetaGPT的体验之旅。…

使用android studio编译app到自己的手机上运行,却读取不了手机里面的图片

问题描述: 使用android studio编译app到自己的手机上运行,却读取不了手机里面的图片 问题分析: 这个是由于这个app没有申请手机端的 媒体文件访问权限,所以读取不了 解决:(我的是Android 10,新版…

数据结构学习之对单向链表进行快速高效的排序(排序链表)

实例要求:1、给定一个链表的头结点 head ,请将其按升序排列并返回排序后的链表 ;2、链表中节点的数目的范围为 [0, 5 * 104] ;实例分析:1、引入qsort函数和自定义cmp函数解决问题;2、借助自定义指针作为中间…

Android Studio下载gradle反复失败

我的版本:gradle-5.1.1 首先检查设置路径是否正确,参考我的修改! 解决方案 1.手动下载Gradle.bin Gradle Distributions 下载地址 注意根据编译器提示下载,我这要求下载的是bin 而不是all 2.把下载好的整个压缩包放在C:\Users\…

jenkins-cl参数化构建

pipeline片段(对应jenkins-cli -p参数的BRANCHdevelop) parameters {string(name: BRANCH, defaultValue: master, description: Enter the branch name)}stages {stage(Get Code) {steps {script {def branch params.BRANCHcheckout scmGit(branches: …

【Python】使用pyinstaller打包为Windows平台的xxx.exe方法步骤

pyinstaller 是一个用于将 Python 代码打包成独立可执行文件的工具,它可以将 Python 代码打包成 Windows、Linux、Mac 等平台的可执行文件,方便用户在不同环境中运行。 pyinstaller用法: 1.安装pyinstaller库,这里以PyCharm环境为…

Git与VScode联合使用详解

目录 Git与VScode联合使用 方式一 1. 用vscode打开文件夹,如图点击初始化仓库,把此仓库初始为git仓库。 2. 提交文件到本地仓库 3. vscode与github账号绑定 4. 在github中建立远程仓库 5. 本地仓库与远程仓库绑定 方式二 1. 在github上建立远程仓…

Nginx的安装配置和使用

最近有好几个地方用到了nginx,但是一直还没时间记录下nginx的安装、配置和使用,这篇文章可以将这块内容整理出来,方便大家一起学习~ 安装 安装是相对简单一些的,直接使用yum即可。 yum install -y nginx 默认安装位置在/usr/sb…

flutter 打包IOS及常用配置

修改APP名称 项目名字配置是在 ios/Runner/Info.plist 文件中的 dict 下的 CFBundleName testapp 。如下图所示: String里面就可以修改名称 修改项目 (testapp)的 Logo 图标 iOS 项目 Logo的配置是在 ios/Runner/Assets.xcassets/AppIcon.appiconset 文…

单表的查询练习

一、单表查询 素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等 显示所有职工的基本信息。 mysql8.0 [chap03]>select * from worker; 查询所有职工所属部门的部门号,不显示重复的部门号。 mysq…

mysql进阶-索引基础

目录 1. 概念-索引是什么? 2. 索引的数据结构(索引模型) 2.1 二分查找: 2.2 二叉查找树(BST Binary Search Tree): 2.3 平衡二叉树(AVL Tree Balanced binary search trees) 2.4 多路平衡查找树(B Tree Balanced…