ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

PowerSploit 特权枚举实战:Get-ProcessTokenPrivilege 深入解析与源码级原理

PowerSploit 特权枚举实战:Get-ProcessTokenPrivilege 深入解析与源码级原理 PowerSploit 特权枚举实战Get-ProcessTokenPrivilege 深入解析与源码级原理【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址: https://gitcode.com/gh_mirrors/po/PowerSploitPowerSploit 的 Privesc 模块提供了一套用于 Windows 本地权限提升侦察privilege escalation enumeration的 PowerShell 工具集而Get-ProcessTokenPrivilege正是其中用于枚举进程访问令牌access token特权信息的核心函数。本文将围绕其官方文档docs/Privesc/Get-ProcessTokenPrivilege.md展开结合 Privesc/PowerUp.ps1 的源码实现与 Tests/Privesc.tests.ps1 的测试用例讲解如何枚举当前进程或指定进程的全部特权、如何快速筛选具有管理员价值的“特殊特权”以及如何与Enable-Privilege联动完成特权激活帮助读者在权限提升侦察与红队评估中快速定位可利用的特权。函数定位与前置依赖Get-ProcessTokenPrivilege由 Will Schroederharmj0y编写以 BSD 3-Clause 许可发布位于 Privesc/PowerUp.ps1属于 PowerSploit 的 Privesc权限提升模块。其官方文档声明了两项前置依赖PSReflect用于在纯 PowerShell 中动态定义 Win32 结构体与 P/Invoke 函数避免依赖编译后的二进制。Get-TokenInformation同一文件内的辅助函数Privesc/PowerUp.ps1封装了GetTokenInformation()Win32 API 调用。从源码结构看Get-TokenInformation同时被Get-ProcessTokenGroup、Get-ProcessTokenPrivilege和Get-ProcessTokenType三个函数复用分别查询令牌的 SID 组、特权与类型/模拟级别构成一套完整的令牌侦察体系。该函数属于 PowerUp 工具集Privesc/PowerUp.ps1可以通过 Privesc/Privesc.psm1 或 Privesc/Privesc.psd1 模块清单加载。语法与参数详解完整语法Get-ProcessTokenPrivilege [[-Id] UInt32] [-Special]-Id指定要枚举令牌特权的进程 ID省略时默认为当前进程。Type: UInt32 Parameter Sets: (All) Aliases: ProcessID Required: False Position: 1 Default value: 0 Accept pipeline input: True (ByPropertyName, ByValue) Accept wildcard characters: False位置参数可写作Get-ProcessTokenPrivilege -Id 2600或Get-ProcessTokenPrivilege 2600。管道输入既支持按属性名ByPropertyName接收ProcessID属性也支持按值ByValue接收因此可直接将Get-Process的输出对象通过管道传入。别名-ProcessID与-Id等价。从源码看Privesc/PowerUp.ps1该参数声明为[UInt32]并带[ValidateNotNullOrEmpty()]校验配合$PSBoundParameters[Id]判断用户是否显式传参——这是区分“查询指定进程”与“查询当前进程”的关键。-Special开关参数Switch仅返回“特殊特权”即管理员级别的特权。Type: SwitchParameter Parameter Sets: (All) Aliases: Privileged Required: False Position: Named Default value: False Accept pipeline input: False Accept wildcard characters: False文档明确列出的特殊特权集合为SeSecurityPrivilege、SeTakeOwnershipPrivilege、SeLoadDriverPrivilege、SeBackupPrivilege、SeRestorePrivilege、SeDebugPrivilege、SeSystemEnvironmentPrivilege、SeImpersonatePrivilege、SeTcbPrivilege。在源码中该集合被硬编码于BEGIN块内Privesc/PowerUp.ps1$SpecialPrivileges (SeSecurityPrivilege, SeTakeOwnershipPrivilege, SeLoadDriverPrivilege, SeBackupPrivilege, SeRestorePrivilege, SeDebugPrivilege, SeSystemEnvironmentPrivilege, SeImpersonatePrivilege, SeTcbPrivilege)当启用-Special时只有命中的特权才会被输出同时为每个输出对象附加ProcessId属性。这一设计在权限提升场景中非常实用直接跳过SeShutdownPrivilege这类对提权价值有限的常规特权聚焦于SeDebugPrivilege、SeImpersonatePrivilege等可直接转化为代码执行或令牌窃取能力的“高价值”特权。工作流程从进程句柄到特权列表根据文档描述并结合源码实现Get-ProcessTokenPrivilege的调用链如下打开进程若传入了-Id则调用$Kernel32::OpenProcess(0x400, $False, $Id)0x400即PROCESS_QUERY_INFORMATION打开目标进程否则调用$Kernel32::GetCurrentProcess()获取当前进程的伪句柄pseudohandle此时进程 ID 取$PIDPrivesc/PowerUp.ps1。打开令牌以TOKEN_QUERY 0x0008访问权限调用$Advapi32::OpenProcessToken()获得令牌句柄$hProcTokenPrivesc/PowerUp.ps1。查询特权将令牌句柄传给Get-TokenInformation -InformationClass PrivilegesPrivesc/PowerUp.ps1。过滤与标注若启用-Special则按特殊特权集合过滤并为每个结果附加ProcessId属性后输出。资源回收仅当使用OpenProcess()显式打开进程时才调用CloseHandle()关闭句柄当前进程伪句柄无需也不应手动关闭Privesc/PowerUp.ps1。底层Get-TokenInformation 的两次缓冲调用Get-TokenInformationPrivesc/PowerUp.ps1对GetTokenInformation()采用了经典的“两次调用”模式第一次以空缓冲区调用获取所需的缓冲区大小$TokenPrivilegesPtrSize分配非托管内存Marshal::AllocHGlobal第二次调用填充TOKEN_PRIVILEGES结构遍历PrivilegeCount个LUID_AND_ATTRIBUTES条目将特权 LUID 的低位部分转为字符串将Attributes字段强制转换为LuidAttributes枚举并打上PowerUp.TokenPrivilege类型标记PSObject.TypeNames.Insert(0, ...)最后释放非托管内存。这些 Win32 结构与枚举由 PSReflect 在脚本底部动态定义Privesc/PowerUp.ps1$TOKEN_PRIVILEGES struct $Module PowerUp.TokenPrivileges { PrivilegeCount field 0 UInt32 Privileges field 1 $LUID_AND_ATTRIBUTES.MakeArrayType() -MarshalAs (ByValArray, 50) }Attributes 字段的位标志语义输出中的Attributes列是LuidAttributes位域枚举的组合Privesc/PowerUp.ps1标志值含义DISABLED0x00000000特权存在但处于禁用状态SE_PRIVILEGE_ENABLED_BY_DEFAULT0x00000001特权默认启用SE_PRIVILEGE_ENABLED0x00000002特权当前已启用SE_PRIVILEGE_REMOVED0x00000004特权已从令牌移除SE_PRIVILEGE_USED_FOR_ACCESS0x80000000特权曾被用于访问检查因此一个显示为SE_PRIVILEGE_ENABLED_BY_DEFAULT, SE_PRIVILEGE_ENABLED的特权如常见的SeChangeNotifyPrivilege、SeImpersonatePrivilege意味着其默认启用且当前处于激活状态而仅显示DISABLED的特权则需要先被启用才能发挥作用。实际使用示例示例 1枚举当前进程的全部特权Get-ProcessTokenPrivilege输出示例ProcessId 为当前 PowerShell 进程 IDPrivilege Attributes ProcessId --------- ---------- --------- SeShutdownPrivilege DISABLED 2600 SeChangeNotifyPrivilege ...AULT, SE_PRIVILEGE_ENABLED 2600 SeUndockPrivilege DISABLED 2600 SeIncreaseWorkingSetPrivilege DISABLED 2600 SeTimeZonePrivilege DISABLED 2600这是最基础的侦察命令也是后续一切特权分析的第一步。示例 2只查看“特殊特权”Get-ProcessTokenPrivilege -Special输出示例Privilege Attributes ProcessId --------- ---------- --------- SeSecurityPrivilege DISABLED 2444 SeTakeOwnershipPrivilege DISABLED 2444 SeBackupPrivilege DISABLED 2444 SeRestorePrivilege DISABLED 2444 SeSystemEnvironmentPrivilege DISABLED 2444 SeImpersonatePrivilege ...T, SE_PRIVILEGE_ENABLED 2444在权限提升侦察中这一命令是“高价值目标快速筛查”的标准姿势SeImpersonatePrivilege已启用意味着存在 Potato 类提权利用的可能SeDebugPrivilege已启用则意味着可以对其他进程进行调试注入。若要进一步查看完整输出包含TokenHandle可追加| Format-List或使用源码注释中的| ft -a。示例 3通过管道传入进程对象Get-Process notepad | Get-ProcessTokenPrivilege | fl输出示例Privilege : SeShutdownPrivilege Attributes : DISABLED ProcessId : 2640 Privilege : SeChangeNotifyPrivilege Attributes : SE_PRIVILEGE_ENABLED_BY_DEFAULT, SE_PRIVILEGE_ENABLED ProcessId : 2640 Privilege : SeUndockPrivilege Attributes : DISABLED ProcessId : 2640 Privilege : SeIncreaseWorkingSetPrivilege Attributes : DISABLED ProcessId : 2640 Privilege : SeTimeZonePrivilege Attributes : DISABLED ProcessId : 2640该示例展示了对非当前进程的枚举将notepad的进程对象按值ByValue经管道传入后函数内部通过OpenProcess()打开该进程并查询其令牌。结合参数定义可知Get-Process输出的ProcessId属性名与-Id的别名ProcessID相互匹配ByPropertyName 绑定因此Get-Process notepad | Get-ProcessTokenPrivilege同样有效。输出对象PowerUp.TokenPrivilegeGet-ProcessTokenPrivilege的每个输出对象都是类型标记为PowerUp.TokenPrivilege的自定义对象包含以下属性属性说明Privilege特权名称字符串如SeDebugPrivilegeAttributesLuidAttributes位域枚举如DISABLED、SE_PRIVILEGE_ENABLEDTokenHandle被查询令牌的句柄源码中始终附加文档表格中被省略ProcessId所属进程 ID由Get-ProcessTokenPrivilege附加从源码可见Get-TokenInformation输出的原始对象仅含Privilege、Attributes、TokenHandle三个属性Privesc/PowerUp.ps1而ProcessId是Get-ProcessTokenPrivilege在返回前通过Add-Member动态附加的Privesc/PowerUp.ps1。这一点在编写下游逻辑时值得注意。进阶联动与 Enable-Privilege 配合完成特权激活Get-ProcessTokenPrivilege的典型用法不止于“查看”更常作为 Enable-Privilege 的上游输入。Enable-PrivilegePrivesc/PowerUp.ps1通过RtlAdjustPrivilege为当前进程启用指定特权其参数说明中明确写道特权可以字符串形式传入也可以直接接收Get-ProcessTokenPrivilege的管道输出。典型的两段式用法# 1. 确认 SeShutdownPrivilege 当前处于 DISABLED Get-ProcessTokenPrivilege # 2. 启用该特权 Enable-Privilege SeShutdownPrivilege # 3. 再次枚举确认 Attributes 已变为 SE_PRIVILEGE_ENABLED Get-ProcessTokenPrivilege启用后输出对比Privilege Attributes ProcessId --------- ---------- --------- SeShutdownPrivilege SE_PRIVILEGE_ENABLED 3620也可以一步到位通过管道完成“枚举 → 启用”Get-ProcessTokenPrivilege | Enable-Privilege注意Enable-Privilege只作用于当前进程的令牌且能否成功取决于当前令牌中是否包含该特权DISABLED状态可被激活但不存在或已REMOVED的特权无法凭空启用。启用高价值特权通常需要本地管理员权限这正是权限提升侦察场景的常见前提。测试验证Privesc.tests.ps1 中的回归保障仓库内置的 Pester 测试 Tests/Privesc.tests.ps1 为Get-ProcessTokenPrivilege提供了系统化的行为契约可作为理解其设计意图的补充证据管理员前置条件测试要求当前会话具备本地管理员权限否则直接抛出错误。基本调用不抛异常Get-ProcessTokenPrivilege裸调用应正常返回。字段完整性输出对象必须同时包含Privilege、Attributes、ProcessID三个字段。-Special 过滤Get-Process -Id $PID | Get-ProcessTokenPrivilege -Special应有非空输出。管道兼容性单个及多个进程对象经管道传入均应正常工作多对象场景断言SeShutdownPrivilege至少出现两次。结果正确性当前进程的特权集合中应包含SeShutdownPrivilege。此外同一测试文件中 Tests/Privesc.tests.ps1 的Enable-Privilege测试用例明确展示了二者的联动验证先断言SeShutdownPrivilege处于禁用状态启用后再次枚举断言其Attributes已变为非零已启用并验证Get-ProcessTokenPrivilege | Enable-Privilege管道链路可用。这些用例同时印证了输出对象的属性契约与管道设计。注意事项与适用前提适用环境Windows 平台需 PowerShell 环境可加载 Privesc 模块可通过 Privesc/Privesc.psm1 或Import-Module .\Privesc.psd1方式加载 PowerUp.ps1。权限边界查询其他进程的令牌需要相应权限对高权限进程执行OpenProcess(PROCESS_QUERY_INFORMATION)失败时会以Write-Warning输出Win32Exception信息Privesc/PowerUp.ps1。只读操作本函数仅查询TOKEN_QUERY不会修改目标令牌需要激活特权时请配合Enable-Privilege。特殊特权集合固定-Special的过滤列表在源码中硬编码不随系统版本动态变化使用时需结合目标系统实际特权做交叉判断。手柄管理显式打开进程后函数会自动关闭句柄无需调用方处理对当前进程的伪句柄则不做关闭。总结Get-ProcessTokenPrivilege以极简的参数设计-Id与-Special覆盖了进程令牌特权枚举的核心场景默认查询当前进程支持按 ID 或管道指定任意进程并可一键过滤出对权限提升最有价值的九种特殊特权。其底层通过 PSReflect 封装OpenProcess→OpenProcessToken→GetTokenInformation(TokenPrivileges)的完整 Win32 调用链最终以带类型标记的PowerUp.TokenPrivilege对象输出天然兼容管道与Enable-Privilege联动。对于红队评估与本地提权侦察而言这条“枚举特权 → 筛选特殊特权 → 激活可用特权”的链路是分析当前身份可利用攻击面的高效起点。【免费下载链接】PowerSploitPowerSploit - A PowerShell Post-Exploitation Framework项目地址: https://gitcode.com/gh_mirrors/po/PowerSploit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表