滲透技巧——Windows Token九種許可權的利用
0x00 前言
在之前的文章 ofollow,noindex">《滲透技巧——從Admin許可權切換到System許可權》 和 《滲透技巧——Token竊取與利用》 分別介紹了從admin許可權切換到system許可權和TrustedInstaller許可權的方法,其中的主要方法是利用token切換許可權。
那麼,普通使用者(或者LocalService使用者)的特殊Token有哪些可利用方法呢?能否提權?如何判斷?
本文將要結合自己的經驗,參考多個開源工具和資料,嘗試對這個技巧做總結,分享學習心得。
參考的開源工具和資料:
·Hot Potato: https://github.com/foxglovesec/Potato
· powershell版本Hot Potato: https://github.com/Kevin-Robertson/Tater
· Rotten Potato: https://github.com/breenmachine/RottenPotatoNG
· lonelypotato: https://github.com/decoder-it/lonelypotato
· Juicy Potato: https://github.com/ohpe/juicy-potato
· https://github.com/hatRiot/token-priv
· https://foxglovesecurity.com/2016/01/16/hot-potato/
0x01 簡介
本文將要介紹以下內容:
·簡要利用思路
· SeImpersonatePrivilege許可權對應的利用思路和開原始碼
· SeAssignPrimaryPrivilege許可權對應的利用思路和開原始碼
· SeTcbPrivilege許可權對應的利用思路和開原始碼
· SeBackupPrivilege許可權對應的利用思路和開原始碼
· SeRestorePrivilege許可權對應的利用思路和開原始碼
· SeCreateTokenPrivilege許可權對應的利用思路和開原始碼
· SeLoadDriverPrivilege許可權對應的利用思路和開原始碼
· SeTakeOwnershipPrivilege許可權對應的利用思路和開原始碼
· SeDebugPrivilege許可權對應的利用思路和開原始碼
0x02 簡要利用思路
1、取得了目標的訪問許可權後,檢視可用許可權
whoami /priv
例如,普通使用者具有的許可權如下圖。
管理員使用者具有的許可權如下圖。
iis使用者具有的許可權如下圖。
Privilege Name項表示具有的許可權,State表示許可權的狀態,我們可以通過WinAPI AdjustTokenPrivileges將許可權設定為Disabled或者Enabled
可供參考的實現程式碼:
Information.cpp" target="_blank" rel="nofollow,noindex">https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnablePrivilegeandGetTokenInformation.cpp
程式碼實現了開啟指定許可權(SeDebugPrivilege),並且檢視當前使用者名稱稱和具有的許可權
2、如果包含以下九個許可權,我們就可以對其進一步利用
· SeImpersonatePrivilege
· SeAssignPrimaryPrivilege
· SeTcbPrivilege
· SeBackupPrivilege
· SeRestorePrivilege
· SeCreateTokenPrivilege
· SeLoadDriverPrivilege
· SeTakeOwnershipPrivilege
· SeDebugPrivilege
注:
· iis或者sqlserver的使用者通常具有SeImpersonatePrivilege和SeAssignPrimaryPrivilege許可權
· Backup service使用者通常具有SeBackupPrivilege和SeRestorePrivilege許可權
0x03 SeImpersonatePrivilege許可權的利用思路
參考資料:
https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L327
SeImpersonatePrivilege
身份驗證後模擬客戶端(Impersonatea client after authentication)
擁有該許可權的程序能夠模擬已有的token,但不能建立新的token
以下使用者具有該許可權:
· 本地管理員組成員和本地服務帳戶
· 由服務控制管理器啟動的服務
· 由元件物件模型 (COM) 基礎結構啟動的並配置為在特定帳戶下執行的COM伺服器
通常,iis或者sqlserver使用者具有該許可權
利用思路
· 利用NTLM Relay to Local Negotiation獲得System使用者的Token 可使用開源工具Rotten Potato、lonelypotato或者Juicy Potato
· 通過WinAPI CreateProcessWithToken建立新程序,傳入System使用者的Token 具有SeImpersonatePrivilege許可權才能建立成功
· 該Token具有System許可權
可供參考的測試程式碼:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeImpersonatePrivilege.cpp
程式碼實現了開啟當前程序的SeImpersonatePrivilege許可權,呼叫CreateProcessWithToken,傳入當前程序的Token,建立一個程序,配合RottenPotato,可用來從LocalService提權至System許可權。
0x04 SeAssignPrimaryPrivilege許可權的利用思路
參考資料:
https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L359
SeAssignPrimaryPrivilege
向程序(新建立或者掛起的程序)分配token
通常,iis或者sqlserver使用者具有該許可權
利用思路1
· 利用NTLM Relay to Local Negotiation獲得System使用者的Token
· 通過WinAPI CreateProcessAsUser建立新程序,傳入System使用者的Token
· 該Token具有System許可權
可供參考的測試程式碼:
程式碼實現了開啟當前程序的SeAssignPrimaryTokenPrivilege許可權,呼叫CreateProcessAsUser,傳入當前程序的Token,建立一個程序,配合RottenPotato,可用來從LocalService提權至System許可權。
利用思路2
· 利用NTLM Relay to Local Negotiation獲得System使用者的Token
· 通過WinAPI CreateProcess建立一個掛起的新程序,引數設定為CREATE_SUSPENDED
· 通過WinAPI NtSetInformationProcess將新程序的Token替換為System使用者的Token
· 該Token具有System許可權
0x05 SeTcbPrivilege許可權的利用思路
參考資料:
https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L418
SeTcbPrivilege
等同於獲得了系統的最高許可權
利用思路
· 呼叫LsaLogonUser獲得Token
· 將該Token新增至Local System account組
· 該Token具有System許可權
可供參考的測試程式碼:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeTcbPrivilege.cpp
程式碼實現了開啟當前程序的SeTcbPrivilege許可權,登入使用者test1,將其新增至Local System account組,獲得System許可權,建立登錄檔項HKEY_LOCAL_MACHINE\SOFTWARE\testtcb
0x06 SeBackupPrivilege許可權的利用思路
參考資料:
https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L495
SeBackupPrivilege
用來實現備份操作,對當前系統任意檔案具有讀許可權
利用思路
· 讀取登錄檔HKEY_LOCAL_MACHINE\SAM、HKEY_LOCAL_MACHINE\SECURITY和HKEY_LOCAL_MACHINE\SYSTEM
· 匯出當前系統的所有使用者hash mimikatz的命令如下:
lsadump::sam /sam:SamBkup.hiv /system:SystemBkup.hiv
可供參考的測試程式碼:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeBackupPrivilege.cpp
程式碼實現了開啟當前程序的SeBackupPrivilege許可權,讀取登錄檔,將其儲存成檔案C:\\test\\SAM、C:\\test\\SECURITY和C:\\test\\SYSTEM
0x07 SeRestorePrivilege許可權的利用思路
參考資料:
https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L528
SeRestorePrivilege
用來實現恢復操作,對當前系統任意檔案具有寫許可權
利用思路1
· 獲得SeRestorePrivilege許可權,修改登錄檔HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
· 劫持exe檔案的啟動
· 實現提權或是作為後門
利用思路2
· 獲得SeRestorePrivilege許可權,向任意路徑寫入dll檔案
· 實現dll劫持
· 實現提權或是作為後門
可供參考的測試程式碼:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeRestorePrivilege.cpp
程式碼實現了開啟當前程序的SeRestorePrivilege許可權,建立登錄檔項HKEY_LOCAL_MACHINE\SOFTWARE\testrestore
0x08 SeCreateTokenPrivilege許可權的利用思路
參考資料:
https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L577
SeCreateTokenPrivilege
用來建立Primary Token
利用思路
· 通過WinAPI ZwCreateToken建立Primary Token
· 將Token新增至local administrator組
· 該Token具有System許可權
可供參考的測試程式碼:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeCreateTokenPrivilege.cpp
程式碼實現了開啟當前程序的SeCreateTokenPrivilege許可權,建立Primary Token,將其新增至local administrator組,開啟SeDebugPrivilege和SeTcbPrivilege許可權
0x09 SeLoadDriverPrivilege許可權的利用思路
參考資料:
https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L626
SeLoadDriverPrivilege
用來載入驅動檔案
利用思路
· 建立驅動檔案的登錄檔
reg add hkcu\System\CurrentControlSet\CAPCOM /v ImagePath /t REG_SZ /d "\??\C:\test\Capcom.sys" reg add hkcu\System\CurrentControlSet\CAPCOM /v Type /t REG_DWORD /d 1
· 載入驅動檔案Capcom.sys
· Capcom.sys存在漏洞,系統載入後,可從普通使用者許可權提升至System許可權,利用程式碼可參考: https://github.com/tandasat/ExploitCapcom
· 獲得System許可權
可供參考的測試程式碼: https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeLoadDriverPrivilege.cpp
程式碼實現了開啟當前程序的SeLoadDriverPrivilege許可權,讀取登錄檔項hkcu\System\CurrentControlSet\CAPCOM,載入驅動檔案Capcom.sys
0x0A SeTakeOwnershipPrivilege許可權的利用思路
參考資料:
https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L688
SeTakeOwnershipPrivilege
同SeRestorePrivilege類似,對當前系統任意檔案具有寫許可權
利用思路1
· 獲得SeTakeOwnershipPrivilege許可權,修改登錄檔HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
· 劫持exe檔案的啟動
· 實現提權或是作為後門
利用思路2
· 獲得SeTakeOwnershipPrivilege許可權,向任意路徑寫入dll檔案
· 實現dll劫持
· 實現提權或是作為後門
可供參考的測試程式碼:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeTakeOwnershipPrivilege.cpp
程式碼實現了開啟當前程序的SeTakeOwnershipPrivilege許可權,修改登錄檔項hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options的許可權,普通使用者許可權對其具有完整操作許可權
後續的寫操作:
reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" /v takeownership /t REG_SZ /d "C:\\Windows\\System32\\calc.exe"
0x0B SeDebugPrivilege許可權的利用思路
參考資料:
https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L736
SeDebugPrivilege
用來除錯指定程序,包括讀寫記憶體,常用作實現dll注入
利用思路
· 找到System許可權的程序
· dll注入
· 獲得System許可權
可供參考的測試程式碼:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeDebugPrivilege.cpp
程式碼實現了開啟當前程序的SeDebugPrivilege許可權,向指定程序注入dll
0x0C 小結
本文總結了普通使用者(或者LocalService使用者)Token中九種許可權的利用方法,分析利用思路,完善實現程式碼。