ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PowerSploit 之 Set-ServiceBinaryPath:通过服务二进制路径修改实现 Windows 权限提升

PowerSploit 之 Set-ServiceBinaryPath:通过服务二进制路径修改实现 Windows 权限提升 渗透测试网络安全【免费下载链接】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),仅供参考
返回列表