未加引号的服务路径为什么危险
服务的可执行路径若包含空格又没有用双引号包裹(典型如 C:\Program Files\App\svc.exe),Windows 会按顺序尝试多个候选路径。攻击者只需在中间某个可写目录放一个同名程序,服务启动时就会先执行它,从而实现本地提权。这是本地提权检查里的经典项。
基本信息
| 适用平台 | Windows Server / Windows 10+(需管理员权限) |
|---|---|
| 审计对象 | Win32_Service 的 PathName 字段与驱动类服务 |
| 判据 | 含空格且未用双引号包裹的服务路径 |
| 可利用前提 | 路径中间存在普通用户可写目录 |
典型使用场景
- 本地提权面清理:作为终端加固与内网渗透自查的常规项
- 第三方软件审计:安装程序常把服务路径写成不带引号的形式
- 变更前评估:升级软件前确认其服务路径写法是否需要修正
- 合规检查:检查清单里通常有明确的对应条目
审计
审计
# 找出含空格且未以引号开头的服务路径
Get-CimInstance Win32_Service | Where-Object { $_.PathName -match '\s' -and $_.PathName -notmatch '^\s*"' } | Select-Object Name, PathName, StartMode
# 补充:用 autoruns 一类工具能看到更全的服务与驱动清单修复示例(先导出原值再改)
修复示例(先导出原值再改)
# 1) 先记录原始 binPath
sc.exe qc "MyService"
# 2) 改为带引号形式(注意 sc 的等号后必须有空格)
# sc.exe config "MyService" binPath= "\"C:\Program Files\App\svc.exe\" -arg"
# 3) 确认服务仍可启动
sc.exe query "MyService"审计结果读法
| 字段 | 含义 | 判读要点 |
|---|---|---|
| Name | 服务名称 | 驱动类服务也要纳入范围 |
| PathName | 可执行文件路径 | 含空格且无引号才是候选 |
| StartMode | 启动方式 | 自动启动的服务被利用的机会更多 |
| 中间目录权限 | 决定是否可利用 | 目录不可写则无法完成劫持 |
并非所有候选路径都可利用:只有中间存在可写目录才构成劫持链。评估与修复都要逐服务验证,避免批量改动引发服务无法启动。
修复前导出配置并安排维护窗口:binPath 写错会让服务彻底起不来,比原本的风险更直接,改动后应立即用 sc query 确认服务状态正常。