渗透测试网络安全【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址https://gitcode.com/gh_mirrors/po/PowerSploit点击查看免费下载导读Set-ServiceBinaryPath是 PowerSploit 项目 Privesc 模块PowerUp中用于**修改 Windows 服务二进制路径binPath**的核心函数属于服务配置滥用类权限提升技术的关键一环。本文以官方文档 docs/Privesc/Set-ServiceBinaryPath.md 为骨架结合 Privesc/PowerUp.ps1 的源码实现与 Tests/Privesc.tests.ps1 的测试用例进行纵深讲解。读完本文你将掌握该命令的完整语法、参数语义、Win32 API 底层调用链GetServiceHandle→ChangeServiceConfig以及它与Test-ServiceDaclPermission、Invoke-ServiceAbuse等工具组合使用的实战方案。功能概述一条命令改写服务启动程序Set-ServiceBinaryPath的作用非常直接将指定 Windows 服务的二进制路径ImagePath / binPath设置为任意字符串值。由于 Windows 服务默认以LocalSystem账户运行若当前用户对某个服务拥有配置修改ChangeConfig权限就可以把该服务的 binPath 改为一条命令随后通过启动该服务以 SYSTEM 权限执行这条命令——这正是经典的可写服务/可修改服务权限提升路径的落地点。官方文档对其行为描述如下SYNOPSIS / DESCRIPTION接收一个服务名称Name或管道上的ServiceProcess.ServiceController对象首先通过GetServiceHandleWin32 API 以ConfigControl 访问权限打开服务句柄随后调用ChangeServiceConfig将lpBinaryPathName即 binPath设置为Path参数指定的字符串操作完成后关闭服务句柄。函数作者为 Will Schroederharmj0y与 Matthew Graebermattifestation许可证为 BSD 3-Clause依赖 PSReflect 提供的 Win32 P/Invoke 层源码位于 Privesc/PowerUp.ps1#L1728-L1845。语法与参数详解官方文档给出的核心语法为Set-ServiceBinaryPath [-Name] String[] [-Path] String两个参数均为必填参数完整语义如下参数类型别名必填位置说明-NameString[]ServiceName是1一个或多个要修改二进制路径的服务名称支持按属性名ByPropertyName和按值ByValue的管道输入-PathStringBinaryPath、binPath是2要为指定服务设置的新二进制路径即lpBinaryPathName不接受管道输入对照源码 Privesc/PowerUp.ps1#L1784-L1796 可以看到[Parameter(Position 0, Mandatory $True, ValueFromPipeline $True, ValueFromPipelineByPropertyName $True)] [Alias(ServiceName)] [String[]] [ValidateNotNullOrEmpty()] $Name, [Parameter(Position1, Mandatory $True)] [Alias(BinaryPath, binPath)] [String] [ValidateNotNullOrEmpty()] $Path值得注意的实现细节-Name是String[]数组类型且带有ValidateNotNullOrEmpty()校验因此一次调用可以批量修改多个服务-Name声明了ValueFromPipeline和ValueFromPipelineByPropertyName这意味着既可以管道传入Get-Service产生的ServiceController对象也可以直接管道传入字符串服务名-Path声明了BinaryPath、binPath两个别名与sc.exe config ... binPath ...中的binPath概念一一对应函数输出类型为System.Boolean配置成功返回$True失败返回$False源码中还通过Write-Error输出 Win32 错误详情。实战示例从按名指定到管道传递官方文档提供了两个可直接复用的示例示例 1按服务名指定Set-ServiceBinaryPath -Name VulnSvc -Path net user john Password123! /add将VulnSvc服务的二进制路径设置为一条net user命令。当服务被启动时该命令将以服务账户通常为 SYSTEM的权限执行从而添加一个本地用户。示例 2管道传递服务对象Get-Service VulnSvc | Set-ServiceBinaryPath -Path net user john Password123! /add通过Get-Service拿到ServiceController对象后直接管道传入效果与示例 1 完全一致。这也是源码中ValueFromPipeline $True设计意图的直观体现——方便与Get-Service、Get-ModifiableService等枚举命令串联使用。需要特别指出修改 binPath 本身不会立即启动服务。若要利用该路径执行命令还需要自行Start-Service或sc.exe start。这正是下面Invoke-ServiceAbuse函数自动化的修改 → 启动 → 停止 → 恢复完整流程所做的事。源码级原理Win32 API 调用链Set-ServiceBinaryPath的实现并不依赖 PowerShell 内置的Set-Service而是直接通过 Win32 API 完成这使其在低权限、受限环境下更具可控性。第一步以 CONFIG_CONTROL 权限打开服务句柄在BEGIN块中函数定义了一个内部过滤器Get-ServiceConfigControlHandlePrivesc/PowerUp.ps1#L1799-L1811$GetServiceHandle [ServiceProcess.ServiceController].GetMethod(GetServiceHandle, [Reflection.BindingFlags] Instance, NonPublic) $ConfigControl 0x00000002 $RawHandle $GetServiceHandle.Invoke($TargetService, ($ConfigControl))这里通过反射调用 .NETServiceController类的非公开方法GetServiceHandle并传入0x00000002即SERVICE_CHANGE_CONFIG访问权限。换言之能否成功执行取决于当前进程令牌对该服务是否具备ChangeConfig权限——如果句柄打开失败函数会输出 Verbose 错误信息并将句柄置为$Null后跳过该服务。第二步调用 ChangeServiceConfig 改写 binPath在PROCESS块Privesc/PowerUp.ps1#L1814-L1843中核心调用为$SERVICE_NO_CHANGE [UInt32]::MaxValue $Result $Advapi32::ChangeServiceConfig($ServiceHandle, $SERVICE_NO_CHANGE, $SERVICE_NO_CHANGE, $SERVICE_NO_CHANGE, $Path, [IntPtr]::Zero, [IntPtr]::Zero, [IntPtr]::Zero, [IntPtr]::Zero, [IntPtr]::Zero, [IntPtr]::Zero) $LastError [Runtime.InteropServices.Marshal]::GetLastWin32Error()ChangeServiceConfig的 P/Invoke 声明位于 Privesc/PowerUp.ps1#L4852(func advapi32 ChangeServiceConfig ([Bool]) ([IntPtr], [UInt32], [UInt32], [UInt32], [String], [IntPtr], [IntPtr], [IntPtr], [IntPtr], [IntPtr], [IntPtr]) -SetLastError -Charset Unicode),调用语义分析第 1 个参数是服务句柄SC_HANDLE第 24 个参数服务类型、启动类型、错误控制全部传入[UInt32]::MaxValue即 Win32 常量SERVICE_NO_CHANGE (0xFFFFFFFF)表示这些字段保持不变第 5 个参数lpBinaryPathName直接传入$Path字符串化后的-Path值其余参数lpLoadOrderGroup、lpdwTagId、lpDependencies、lpServiceStartName、lpPassword、lpDisplayName全部传入[IntPtr]::Zero表示不修改。可见该函数的设计是只动 binPath其他配置一律不动最大程度降低对目标服务配置的干扰。第三步结果判定与句柄回收ChangeServiceConfig返回非零表示成功此时输出 Verbose 信息并返回$True返回 0 表示失败通过[ComponentModel.Win32Exception] $LastError抛出带 Win32 错误码的异常并输出$Null无论成功与否最终都会调用$Advapi32::CloseServiceHandle($ServiceHandle)关闭句柄避免句柄泄漏。关于文档中 Dacl 段落的说明官方文档 DESCRIPTION 的第二段提到为服务对象添加 Dacl 字段、使用ReadControl权限与QueryServiceObjectSecurity——这段文字实际描述的是同模块中Add-ServiceDacl函数的行为源码见 Privesc/PowerUp.ps1#L1612-L1725是注释块沿袭造成的文档冗余。阅读时可将其理解为Add-ServiceDacl负责读取服务安全描述符供权限判断使用而Set-ServiceBinaryPath负责写入binPath 配置二者配合构成先判断权限、再执行修改的完整链路。权限前置条件确认你能否修改服务Set-ServiceBinaryPath要生效当前用户必须对目标服务拥有ChangeConfigSERVICE_CHANGE_CONFIG权限。PowerUp 提供了一系列配套命令用于侦查这一前置条件Test-ServiceDaclPermission批量测试当前用户对服务拥有哪些权限。例如Get-Service | Test-ServiceDaclPermission返回所有当前用户可以修改配置ChangeConfig的服务对象文档见 docs/Privesc/Test-ServiceDaclPermission.md。Get-ModifiableService直接返回当前用户可以修改的服务列表是实战中最常用的前置枚举命令文档见 docs/Privesc/Get-ModifiableService.md。Get-ServiceDetail通过 WMIwin32_service类查询服务的binPath等详细信息用于在修改前记录原始路径、在利用后恢复现场文档见 docs/Privesc/Get-ServiceDetail.md。推荐的完整利用流程是# 1. 找出当前用户可修改的服务 Get-Service | Test-ServiceDaclPermission | Select-Object Name # 2. 记录原始 binPath便于事后恢复 Get-ServiceDetail -Name VulnSvc # 3. 改写二进制路径为攻击命令 Set-ServiceBinaryPath -Name VulnSvc -Path net user john Password123! /add # 4. 启动服务触发执行 Start-Service VulnSvc # 5. 恢复原始配置 Set-ServiceBinaryPath -Name VulnSvc -Path C:\original\path.exe与 Invoke-ServiceAbuse 的联动全自动化的 SYSTEM 命令执行Set-ServiceBinaryPath在 PowerUp 中不仅是独立工具更是Invoke-ServiceAbuse的底层依赖其注释明确声明 Required Dependencies: Get-ServiceDetail, Set-ServiceBinaryPath见 Privesc/PowerUp.ps1#L2287。Invoke-ServiceAbuse的自动化流程Privesc/PowerUp.ps1#L2289-L2298为若服务被禁用则先启用并保存原始 binPath 与配置状态停止服务调用Set-ServiceBinaryPath将 binPath 设置为攻击命令源码见 Privesc/PowerUp.ps1#L2461启动服务执行命令再停止服务继续配置下一条命令全部完成后再次调用Set-ServiceBinaryPath恢复原始 binPath源码见 Privesc/PowerUp.ps1#L2480并返回记录了被滥用服务与执行命令的自定义对象PowerUp.AbusedService。典型用法文档见 docs/Privesc/Invoke-ServiceAbuse.md# 添加本地管理员用户 john / Password123! Invoke-ServiceAbuse -Name VulnSVC # 或执行自定义命令 Invoke-ServiceAbuse -Name VulnSVC -Command net user testing Password123! /add可以看到Set-ServiceBinaryPath正是这套自动化中写入恶意配置与恢复现场两个关键动作的执行者。测试用例参数校验与管道行为的验证仓库的 Pester 测试 Tests/Privesc.tests.ps1#L343-L408 覆盖了Set-ServiceBinaryPath的核心行为可作为理解其契约的权威参考管理员前置条件整个Describe Set-ServiceBinaryPath块在非管理员环境下直接跳过Pester test needs local administrator privileges.参数校验向不存在的服务名调用应抛错-Path 空字符串应触发ValidateNotNullOrEmpty()校验并抛错三种调用形态分别测试并断言返回$TrueSet-ServiceBinaryPath -Name $ServiceName -Path $ServicePath按名指定$ServiceName | Set-ServiceBinaryPath -Path $ServicePath管道传字符串服务名Get-Service $ServiceName | Set-ServiceBinaryPath -Path $ServicePath管道传ServiceController对象。这些用例从侧面印证该函数设计上同时兼容显式参数与两种管道输入且失败场景会明确抛错而非静默失败。安装与使用前提Set-ServiceBinaryPath属于 Privesc 模块清单见 Privesc/Privesc.psd1其中FunctionsToExport明确导出了该函数。按 Privesc/README.md 的说明安装方式为将整个Privesc文件夹放入任一模块目录默认模块路径见$Env:PSModulePath如$Env:HomeDrive$Env:HOMEPATH\Documents\WindowsPowerShell\Modules导入模块Import-Module Privesc查看已导入命令Get-Command -Module Privesc单条命令帮助可用Get-Help Set-ServiceBinaryPath。使用前提与限制需明确目标环境为 Windows依赖ServiceProcess.ServiceController与 advapi32 的ChangeServiceConfig运行 PowerShell 版本需满足模块声明的PowerShellVersion 2.0见 Privesc/Privesc.psd1当前进程必须拥有对目标服务的SERVICE_CHANGE_CONFIG权限否则句柄打开失败、函数无法生效修改服务配置属于高敏感操作务必在测试环境或获得授权的场景中使用并牢记修改前记录原始 binPath、修改后恢复原状的操作纪律。总结Set-ServiceBinaryPath是 PowerSploit 服务滥用体系中的执行点上游由Test-ServiceDaclPermission、Get-ModifiableService负责发现可修改的服务中间由Get-ServiceDetail记录原始配置本函数负责把 binPath 改写为攻击命令下游则由Invoke-ServiceAbuse完成启动、触发与恢复的闭环。理解它的语法、权限模型与ChangeServiceConfig底层语义你就掌握了 Windows 服务配置型权限提升中最后一公里的关键技术。赞分享渗透测试网络安全【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址https://gitcode.com/gh_mirrors/po/PowerSploit点击查看免费下载相关推荐PowerSploit 之 PowerUp Install-ServiceBinary替换服务二进制实现 SYSTEM 权限提升实战指南PowerSploit 之 PowerUp Install ServiceBinary替换服务二进制实现 SYSTEM 权限提升实战指南 导读 Install渗透测试网络安全PowerSploit 权限提升实战使用 Test-ServiceDaclPermission 审计 Windows 服务 DACL 权限PowerSploit 权限提升实战使用 Test ServiceDaclPermission 审计 Windows 服务 DACL 权限 导读 Test S渗透测试网络安全PowerSploit 权限提升辅助深入解析 Get-ModifiablePath 可修改路径检测函数PowerSploit 权限提升辅助深入解析 Get ModifiablePath 可修改路径检测函数 导读 Get ModifiablePath 是 Pow渗透测试网络安全创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
YOLOv5+DeepSort实现驾驶员分心行为实时检测 简介:本资源是一套基于YOLOv5与DeepSort融合实现的驾驶员分心驾驶行为智能监测系统,面向人工智能与计算机视觉方向的本科生、研究生及毕设开发者,聚焦疲劳驾驶(如闭眼、打哈欠)与危险行为(如玩手机、抽烟、… · 2026/9/24 5:51:08
AI搜索重构:从信息检索到价值交付的四层实战路径 1. 这不是预测,是正在发生的现场直播“2026年AI搜索趋势判断:从‘寻找答案’到‘创造价值’”——这个标题听起来像一份行业白皮书的副标题,但我要说,它根本不是未来学推演,而是我过去18个月在真实业务场景里亲手拆解、… · 2026/9/23 3:26:11
卫夫子面试必问:3个高频考点拆解,避坑指南与代码实战 卫夫子面试必问:3个高频考点拆解,避坑指南与代码实战 报错一堆看不懂 StackTrace?别慌,这不仅是代码问题,更是逻辑缺失。在卫夫子相关的技术面试中,这种“黑盒”调试能力是核心考核点。面试官最爱问的就是:当系统抛出异常时,你如何快速定… · 2026/9/23 3:26:11
STM32开源项目:代码+原理图+仿真三位一体,含DHT11与ADC采集 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 5:51:09
告别手动汇总!批量合并Word文档太省事了 经常需要整理大量Word资料的打工人,一定要收下这款小工具! 日常汇总报告、收集作业、整理台账,手动合并又累又容易出错,格式还总乱。这款Word合并神器完美解决痛点,支持多文档一键合并,还能自由调整文件前… · 2026/9/24 5:51:03
2026私有化代码托管平台选型:GitLab、Gitee、Gerrit与Gitea深度对比 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 5:50:33
Linux 常用开发工具:linux-command 私有化部署 引言
背景:开发运维需要大量常用命令和工具,频繁切换在线工具不便核心价值:一站式 Linux 命令查询平台,支持私有化部署适用场景:内部知识库、开发团队工具集、运维文档中心
前置条件
系统要求 Docker 引擎 19.03网络… · 2026/9/24 5:50:02
参数化设计平台技术拆解:从零件级模板库到 BOM 自动生成的完整链路 一、背景:非标设计的数据问题本质
非标装备制造的设计流程有个鲜明特点:约 80% 的结构是重复的,但每个订单都被当成新项目从头走一遍。
由此带来的典型工程问题:现象数据层面的根因设计复用率低、重复建模结构知识没有可复用载体通… · 2026/9/24 5:49:56
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44