内核模式 WinDbg 扩展及用于测试令牌权限如何工作的 PoC 示例。
有一些著名的关于令牌权限滥用的仓库和文章,例如 Grzegorz Tworek 的 Priv2Admin。 本仓库中的代码旨在帮助研究令牌权限的工作机制。
该项目涵盖了如何从高完整性级别 shell 获取系统权限。 详见 README.md。
此项目的目的是研究攻击者如何滥用任意内核写入漏洞。 所有 PoC 均针对 HackSys 极端易受攻击驱动程序 编写。 大多数 PoC 通过滥用任意内核写入漏洞和令牌权限来获取 SYSTEM 完整性级别。 已在 Windows 10 版本 1809/1903 上测试,但理论上应适用于大多数 Windows 10 版本:
| PoC 名称 | 描述 |
|---|---|
| CreateAssignTokenVariant | 该 PoC 利用 SeCreateTokenPrivilege 和 SeAssignPrimaryTokenPrivilege 实现权限提升 (EoP)。 |
| CreateImpersonateTokenVariant | 该 PoC 利用 SeCreateTokenPrivilege 和 SeImpersonatePrivilege 实现权限提升 (EoP)。 |
| CreateTokenVariant | 该 PoC 仅利用 SeCreateTokenPrivilege 实现权限提升 (EoP)。 |
| DebugInjectionVariant | 该 PoC 利用 SeDebugPrivilege 实现权限提升 (EoP)。最后阶段使用代码注入到 winlogon.exe。 |
| DebugUpdateProcVariant | 该 PoC 利用 SeDebugPrivilege 实现权限提升 (EoP)。最后阶段通过 UpdateProcThreadAttribute API 从 winlogon.exe 创建 SYSTEM 进程。 |
| RestoreServiceModificationVariant | 该 PoC 利用 SeRestorePrivilege 实现权限提升 (EoP)。需与 HijackShellLib 一起使用。 |
| SecondaryLogonVariant | 该 PoC 利用 SeCreateTokenPrivilege 和 SeImpersonatePrivilege 实现权限提升 (EoP)。最后阶段使用辅助登录服务。 |
| TakeOwnershipServiceModificationVariant | 该 PoC 利用 SeTakeOwnershipPrivilege 实现权限提升 (EoP)。需与 HijackShellLib 一起使用。 |
| TcbS4uAssignTokenVariant | 该 PoC 利用 SeTcbPrivilege 实现权限提升 (EoP)。从中等完整性级别获取系统强制级别 shell。 |
| TcbS4uImpersonationVariant | 该 PoC 利用 SeTcbPrivilege 实现权限提升 (EoP)。通过 S4U 登录执行线程模拟。不会获取高或系统完整性级别。 |
警告
在某些环境中,Debug 构建可能无法正常工作。 建议使用 Release 构建。
PrivEditor 是一个内核模式 WinDbg 扩展,用于操作特定进程的令牌权限。 该扩展允许您轻松配置想要调查的令牌权限:``` 0: kd> .load C:\dev\PrivEditor\x64\Release\PrivEditor.dll
PrivEditor - Kernel Mode WinDbg extension for token privilege edit.
Commands : + !getps : List processes in target system. + !getpriv : List privileges of a process. + !addpriv : Add privilege(s) to a process. + !rmpriv : Remove privilege(s) from a process. + !enablepriv : Enable privilege(s) of a process. + !disablepriv : Disable privilege(s) of a process. + !enableall : Enable all privileges available to a process. + !disableall : Disable all privileges available to a process.
[*] To see command help, execute "! help" or "! /?".
### getps 命令
该命令用于列出目标系统中的进程:```
0: kd> !getps /?
!getps - List processes in target system.
Usage : !getps [Process Name]
Process Name : (OPTIONAL) Specifies filter string for process name.
如果你在没有任何参数的情况下执行此命令,该命令将列出目标系统中的所有进程,如下所示:``` 0: kd> !getps
PID nt!_EPROCESS nt!_SEP_TOKEN_PRIVILEGES Process Name
======== =================== ======================== ============
0 0xfffff80581233630 0x0000000000000000 Idle
4 0xffffd60fec068380 0xffffaf00cec07a40 System
68 0xffffd60ff1780480 0xffffaf00d3b290a0 svchost.exe
88 0xffffd60fec0db080 0xffffaf00cec0d080 Registry
324 0xffffd60fef342040 0xffffaf00d0416080 smss.exe
348 0xffffd60ff052f100 0xffffaf00d25d30a0 dwm.exe
408 0xffffd60feca8e140 0xffffaf00d21bd930 csrss.exe
480 0xffffd60ff05a8340 0xffffaf00d2568670 svchost.exe
484 0xffffd60fefcd60c0 0xffffaf00d06430e0 wininit.exe
500 0xffffd60fefd130c0 0xffffaf00d23100a0 csrss.exe
580 0xffffd60fefdc0080 0xffffaf00d2266630 winlogon.exe
--snip--
如果你想知道特定进程,请按如下方式设置字符串过滤器。
该过滤器支持正向匹配且不区分大小写:```
0: kd> !getps micro
PID nt!_EPROCESS nt!_SEP_TOKEN_PRIVILEGES Process Name
======== =================== ======================== ============
4568 0xffffd60f`f14ed080 0xffffaf00`d3db60a0 MicrosoftEdge.exe
4884 0xffffd60f`f1647080 0xffffaf00`d3fc17b0 MicrosoftEdgeCP.exe
4892 0xffffd60f`f1685080 0xffffaf00`d3fc07b0 MicrosoftEdgeSH.exe
此命令用于列出特定进程的令牌权限:``` 0: kd> !getpriv /?
!getpriv - List privileges of a process.
Usage : !getpriv
PID : Specifies target process ID.
要使用此命令,您需要按如下格式设置目标进程ID(十进制):```
0: kd> !getpriv 5704
Privilege Name State
========================================== ========
SeShutdownPrivilege Disabled
SeChangeNotifyPrivilege Enabled
SeUndockPrivilege Disabled
SeIncreaseWorkingSetPrivilege Disabled
SeTimeZonePrivilege Disabled
[*] PID : 5704
[*] Process Name : cmd.exe
[*] nt!_EPROCESS : 0xffffd60f`f141e4c0
[*] nt!_SEP_TOKEN_PRIVILEGES : 0xffffaf00`d4a0c0a0
该命令用于向特定进程添加令牌权限:``` 0: kd> !addpriv /?
!addpriv - Add privilege(s) to a process.
Usage : !addpriv
PID : Specifies target process ID.
Privilege : Specifies privilege to enable (case insensitive). Available privileges are following.