滲透技巧——Windows Token九種許可權的利用
0x00 前言
在之前的文章《滲透技巧——從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/2017/08/25/abusing-token-privileges-for-windows-local-privilege-escalation/
·https://foxglovesecurity.com/2016/01/16/hot-potato/
·https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/
·https://foxglovesecurity.com/2017/08/25/abusing-token-privileges-for-windows-local-privilege-escalation/
0x01 簡介
本文將要介紹以下內容:
·簡要利用思路
·SeImpersonatePrivilege許可權對應的利用思路和開源代碼
·SeAssignPrimaryPrivilege許可權對應的利用思路和開源代碼
·SeTcbPrivilege許可權對應的利用思路和開源代碼
·SeBackupPrivilege許可權對應的利用思路和開源代碼
·SeRestorePrivilege許可權對應的利用思路和開源代碼
·SeCreateTokenPrivilege許可權對應的利用思路和開源代碼
·SeLoadDriverPrivilege許可權對應的利用思路和開源代碼
·SeTakeOwnershipPrivilege許可權對應的利用思路和開源代碼
·SeDebugPrivilege許可權對應的利用思路和開源代碼
0x02 簡要利用思路
1、取得了目標的訪問許可權後,查看可用許可權
whoami /priv
例如,普通用戶具有的許可權如下圖。
管理員用戶具有的許可權如下圖。
iis用戶具有的許可權如下圖。
Privilege Name項表示具有的許可權,State表示許可權的狀態,我們可以通過WinAPI AdjustTokenPrivileges將許可權設置為Disabled或者Enabled
可供參考的實現代碼:
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許可權
可供參考的測試代碼:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeAssignPrimaryTokenPrivilege.cpp
代碼實現了開啟當前進程的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_MACHINESOFTWARE esttcb
0x06 SeBackupPrivilege許可權的利用思路
參考資料:
https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L495
SeBackupPrivilege
用來實現備份操作,對當前系統任意文件具有讀許可權
利用思路
·讀取註冊表HKEY_LOCAL_MACHINESAM、HKEY_LOCAL_MACHINESECURITY和HKEY_LOCAL_MACHINESYSTEM
·導出當前系統的所有用戶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許可權,修改註冊表HKLMSOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options
·劫持exe文件的啟動
·實現提權或是作為後門
利用思路2
·獲得SeRestorePrivilege許可權,向任意路徑寫入dll文件
·實現dll劫持
·實現提權或是作為後門
可供參考的測試代碼:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeRestorePrivilege.cpp
代碼實現了開啟當前進程的SeRestorePrivilege許可權,創建註冊表項HKEY_LOCAL_MACHINESOFTWARE estrestore
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 hkcuSystemCurrentControlSetCAPCOM /v ImagePath /t REG_SZ /d "??C: estCapcom.sys"
reg add hkcuSystemCurrentControlSetCAPCOM /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許可權,讀取註冊表項hkcuSystemCurrentControlSetCAPCOM,載入驅動文件Capcom.sys
0x0A SeTakeOwnershipPrivilege許可權的利用思路
參考資料:
https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L688
SeTakeOwnershipPrivilege
同SeRestorePrivilege類似,對當前系統任意文件具有寫許可權
利用思路1
·獲得SeTakeOwnershipPrivilege許可權,修改註冊表HKLMSOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options
·劫持exe文件的啟動
·實現提權或是作為後門
利用思路2
·獲得SeTakeOwnershipPrivilege許可權,向任意路徑寫入dll文件
·實現dll劫持
·實現提權或是作為後門
可供參考的測試代碼:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeTakeOwnershipPrivilege.cpp
代碼實現了開啟當前進程的SeTakeOwnershipPrivilege許可權,修改註冊表項hklmSOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options的許可權,普通用戶許可權對其具有完整操作許可權
後續的寫操作:
reg add "hklmSOFTWAREMicrosoftWindows NTCurrentVersionImage 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中九種許可權的利用方法,分析利用思路,完善實現代碼。
※不斷演變的廣告軟體——PBot
※惡意宏劫持桌面快捷方式傳播後門
TAG:嘶吼RoarTalk |