Windows本地提權工具Juicy Potato測試分析
0x00 前言
Juicy Potato是一款Windows系統的本地提權工具,是在工具RottenPotatoNG的基礎上做了擴充套件,適用條件更廣。
利用的前提是獲得了SeImpersonate或者SeAssignPrimaryToken許可權,通常在webshell下使用。
那麼,Juicy Potato的使用方法有哪些,有哪些限制條件呢?本文將對其進行測試,根據原理分析限制條件。
Juicy Potato的下載地址:
https://github.com/ohpe/juicy-potato
0x01 簡介
本將要介紹以下內容:
·實現原理
· 對RottenPotatoNG的擴充套件
· 列舉可用COM物件的方法
· 使用方法
· 限制條件
· 防禦思路
0x02 實現原理
參考資料:
根據個人理解介紹實現原理
需要理解的幾個知識:
·使用DCOM時,如果以服務的方式遠端連線,那麼許可權為System,例如BITS服務
· 使用DCOM可以通過TCP連線到本機的一個埠,發起NTLM認證,該認證可以被重放
· LocalService使用者預設具有SeImpersonate和SeAssignPrimaryToken許可權
· 開啟SeImpersonate許可權後,能夠在呼叫CreateProcessWithToken時,傳入新的Token建立新的程序
· 開啟SeAssignPrimaryToken許可權後,能夠在呼叫CreateProcessAsUser時,傳入新的Token建立新的程序
Juicy Potato的實現流程如下:
1、載入COM,發出請求,許可權為System
在指定ip和埠的位置嘗試載入一個COM物件。
RottenPotatoNG使用的COM物件為BITS,CLSID為{4991d34b-80a1-4291-83b6-3328366b9097}
可供選擇的COM物件不唯一,Juicy Potato提供了多個,詳細列表可參考如下地址:
https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md
2、迴應步驟1的請求,發起NTLM認證
正常情況下,由於許可權不足,當前許可權不是System,無法認證成功。
3、針對本地埠,同樣發起NTLM認證,許可權為當前使用者
由於許可權為當前使用者,所以NTLM認證能夠成功完成。
RottenPotatoNG使用的135埠。
Juicy Potato支援指定任意本地埠,但是RPC一般預設為135埠,很少被修改。
4、分別攔截兩個NTLM認證的資料包,替換資料,通過NTLM重放使得步驟1(許可權為System)的NTLM認證通過,獲得System許可權的Token
重放時需要注意NTLM認證的NTLM Server Challenge不同,需要修正。
5、利用System許可權的Token建立新程序
如果開啟SeImpersonate許可權,呼叫CreateProcessWithToken,傳入System許可權的Token,建立的程序為System許可權。或者,如果開啟SeAssignPrimaryToken許可權,呼叫CreateProcessAsUser,傳入System許可權的Token,建立的程序為System許可權
注:詳細說明可參考之前的文章 《滲透技巧——Windows Token九種許可權的利用》
利用的關鍵:
當前使用者支援SeImpersonate或者SeAssignPrimaryToken許可權
以下使用者具有該許可權:
· 本地管理員組成員和本地服務帳戶
· 由服務控制管理器啟動的服務
· 由元件物件模型 (COM) 基礎結構啟動的並配置為在特定帳戶下執行的COM伺服器
針對提權的話,主要是第三類使用者,常見的為LocalService使用者,例如IIS和者sqlserver的使用者
0x03 列舉可用COM物件的方法
Juicy Potato提供了列舉可用COM物件的方法,步驟如下:
1、獲得可用CLSID的列表
使用GetCLSID.ps1,地址如下:
https://github.com/ohpe/juicy-potato/blob/master/CLSID/GetCLSID.ps1
注:使用時同級目錄下需要包含支援檔案.\utils\Join-Object.ps1
執行成功後生成檔案CLSID.list和CLSID.csv
2、使用批處理呼叫juicypotato.exe逐個測試CLSID
批處理地址如下:
https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat
juicypotato.exe的引數如下:
juicypotato.exe -z -l !port! -c %%i >> result.log
· -z表示測試模式,只驗證Token,不使用Token建立程序
· -l為埠,起始為1000,每次迴圈加1
· -c為從檔案CLSID.list獲得的CLSID
Juicy Potato已經測試瞭如下Windows系統:
· Windows 7 Enterprise
· Windows 8.1 Enterprise
· Windows 10 Enterprise
· Windows 10 Professional
· Windows Server 2008 R2 Enterprise
· Windows Server 2012 Datacenter
· Windows Server 2016 Standard
我在測試的過程中,在Server2012下執行GetCLSID.ps1時會報錯,如下圖
出錯在位置在.\utils\Join-Object.ps1
這裡給出一種修改方法:
1、列舉所有滿足條件的CLSID
powershell程式碼如下:
New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT | Out-Null $CLSID = Get-ItemProperty HKCR:\clsid\* | select-object AppID,@{N='CLSID'; E={$_.pschildname}} | where-object {$_.appid -ne $null} foreach($a in $CLSID) { Write-Host $a.CLSID }
可以選擇將結果儲存為CLSID.list
2、使用批處理呼叫juicypotato.exe逐個驗證
地址如下:
https://github.com/ohpe/juicy-potato/blob/master/Test/test_clsid.bat
bat指令碼不需要做修改
0x04 使用方法
1、檢視當前使用者許可權,是否符合要求
whoami /priv
如果開啟SeImpersonate許可權,juicypotato的引數可以使用-t t
如果開啟SeAssignPrimaryToken許可權,juicypotato的引數可以使用-t u
如果均開啟,可以選擇-t *
如果均未開啟,那麼無法提權。
2、檢視RPC預設埠是否為135
如果被修改(例如為111),juicypotato的引數可以使用-n 111
如果系統禁用了RPC,並不是一定無法提權,需要滿足如下條件:
找到另一系統,能夠以當前使用者的許可權進行遠端RPC登入,此時juicypotato的引數可以使用-k <ip>
例如Win7、WIn8系統,預設配置下,允許135埠的入站規則即可進行遠端RPC登入。
新增防火牆規則允許135埠入站的命令如下:
netsh advfirewall firewall add rule name="135" protocol=TCP dir=in localport=135 action=allow
也可以選擇將防火牆關閉,可參考繞過UAC關閉防火牆的程式碼:
https://github.com/3gstudent/Use-COM-objects-to-bypass-UAC/blob/master/DisableFirewall.cpp
3、根據作業系統選擇可用的CLSID
參考列表
https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md
例如測試系統Server2012,選擇CLSID為{8BC3F05E-D86B-11D0-A075-00C04FB68820}
4、選擇一個系統未佔用的埠作為監聽埠
例如,最終引數如下:
JuicyPotato.exe -t t -p c:\windows\system32\cmd.exe -l 1111 -c {8BC3F05E-D86B-11D0-A075-00C04FB68820}
表示開啟SeImpersonate許可權建立程序,監聽埠1111,使用的CLSID為{8BC3F05E-D86B-11D0-A075-00C04FB68820}
0x05 限制條件
經過以上的分析,Juicy Potato的限制條件如下:
· 需要支援SeImpersonate或者SeAssignPrimaryToken許可權
· 開啟DCOM
· 本地支援RPC或者遠端伺服器支援PRC並能成功登入
· 能夠找到可用的COM物件
0x06 防禦思路
站在防禦的角度,伺服器禁用DCOM,禁用RPC,或者為每一個COM物件配置屬性均不現實。
針對Juicy Potato的關鍵在於許可權的控制,阻止攻擊者獲得SeImpersonate或者SeAssignPrimaryToken許可權。
0x07 補充
更多學習資料:
https://bugs.chromium.org/p/project-zero/issues/detail?id=325&redir=1
0x08 小結
本文對Juicy Potato進行測試,總結使用方法,同RottenPotatoNG進行比較,分析原理,找到限制條件和防禦思路。