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 實現原理
參考資料:
https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/
根據個人理解介紹實現原理
需要理解的幾個知識:
·使用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為
可供選擇的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
註:使用時同級目錄下需要包含支持文件.utilsJoin-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時會報錯,如下圖
出錯在位置在.utilsJoin-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,@} | 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
例如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為
4、選擇一個系統未佔用的埠作為監聽埠
例如,最終參數如下:
JuicyPotato.exe -t t -p c:windowssystem32cmd.exe -l 1111 -c
表示開啟SeImpersonate許可權創建進程,監聽埠1111,使用的CLSID為
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進行比較,分析原理,找到限制條件和防禦思路。
※淡出視線不意味威脅消除:針對主流漏洞利用工具包的分析
※Linux內核exp提權實戰
TAG:嘶吼RoarTalk |