
Escáner de detección no intrusivo para la cadena de RCE pre-autenticación de WordPress wp2shell (CVE-2026-63030 + CVE-2026-60137). Solo detección, sin explotación.
Escáner de detección no intrusivo para vulnerabilidades recientes de WordPress core — incluida la cadena RCE de pre-autenticación wp2shell.
wp2shell_scanner.py toma la huella de la versión del core de un sitio WordPress y lee su superficie de API REST publicitada públicamente, y después clasifica cada CVE de core rastreada de forma independiente frente a la versión detectada. Los veredictos son conscientes de la rama — p. ej., un sitio 6.8.x se informa correctamente como expuesto a la CVE de inyección SQL pero no a la cadena RCE completa. Solo detecta: nunca se envía ninguna carga útil de explotación. Un único archivo, una dependencia (requests), códigos de salida aptos para CI e informes HTML / JSON / correo electrónico listos para el cliente.
⚠️ Solo uso autorizado. Escanea sistemas que poseas o para los que estés explícitamente autorizado (por escrito) a probar. El escáner envía un
User-Agentidentificativo para que los blue teams puedan atribuir el tráfico — no se oculta.
La cadena RCE wp2shell = CVE-2026-63030 + CVE-2026-60137 juntas → ejecución remota de código pre-autenticación en una instalación por defecto. El escáner informa de la cadena como expuesta solo cuando ambas CVE se clasifican como vulnerables para la versión detectada.
Matices de rama que el escáner acierta:
6.8.x contiene la inyección SQL (CVE-2026-60137) solo — no la cadena RCE.6.9, CVE-2026-3906 (Notes) se corrige en 6.9.2, pero la cadena wp2shell no se cierra hasta 6.9.5. Así, 6.9.2/6.9.4 aparecen como parcheados para el fallo de Notes, pero siguen siendo vulnerables a la cadena RCE — el escáner solo recomienda, por tanto, 6.9.5 o posterior en esa rama, nunca 6.9.4.Importante a nivel operativo: los análisis técnicos y un PoC funcional para wp2shell ya son públicos. La detección de versión es ahora el mínimo absoluto — la prioridad es parchear. Actualizar cierra la vía vulnerable, pero no elimina una puerta trasera plantada antes del parche — de ahí el paso de evaluación de compromiso en el informe.
Este es un escáner de versión del core. Las CVE de plugins y temas — la gran mayoría del catálogo de WPScan / Patchstack — requieren un feed vivo y curado y una enumeración de versiones por plugin, y están intencionadamente fuera de alcance aquí. Dentro de su ámbito (CVE recientes del core de WordPress), pretende ser preciso y exacto por rama en lugar de duplicar una base de datos comercial de vulnerabilidades.
<meta name="generator"> en la página de inicio/readme.html<generator> del feed RSS / Atom/wp-links-opml.php (OPML)/wp-json/ para ver si WordPress publicita el espacio de nombres batch/v1 en su índice REST. Esto confirma que el espacio de nombres está registrado, no que el endpoint sea alcanzable a través de un WAF. No se envía ninguna solicitud batch ni carga útil.No explota nada. Sin carga útil de inyección SQL, sin solicitud de confusión de rutas batch, sin intento de ejecutar código ni de leer datos. La detección se basa en la versión más una lectura pasiva de la superficie de API publicitada públicamente.
pip install requests
# single target
python3 wp2shell_scanner.py -t https://site.example --authorized
# list of targets (one per line, # comments allowed)
python3 wp2shell_scanner.py -T scope.txt --authorized -o ./reports
# preview the output formats with synthetic data — no network, no auth needed
python3 wp2shell_scanner.py --demo -o ./reports
El indicador --authorized es una puerta de autorización explícita — los escaneos en vivo se niegan a ejecutarse sin él.
| Código | Significado |
|---|---|
2 | Al menos un objetivo vulnerable |
1 | Al menos un objetivo no concluyente / error |
0 | Limpio (parcheado / no afectado / no es WordPress) |
El destinatario del correo electrónico de notificación es la constante CSSLTD_CONTACT cerca del inicio del script (por defecto [email protected]). Edítala con tu propia dirección de recepción.
El directorio examples/ contiene salida sintética (--demo) para un host vulnerable ficticio (example.com, WordPress 6.9.1 — expuesto a las tres CVE rastreadas):
wp2shell_report_example.com.html — el informe HTML listo para el clientewp2shell_example.com.json — el registro JSONwp2shell_email_example.com.txt — el borrador del correo electrónico de notificaciónSe generan a partir de datos inventados para ilustrar el formato del informe. No son el resultado de escanear ningún sitio real.
6.9.5+ está limpia; 6.9.4 aún tiene la cadena wp2shell).uploads/, wp-config.php, wp-cron y cuentas de administración; ejecuta comprobaciones de integridad de archivos contra un core conocido como bueno./wp-json/batch/v1).Esta herramienta es solo para pruebas de seguridad autorizadas. Eres responsable de asegurarte de que tienes permiso para escanear cualquier objetivo. El escaneo no autorizado puede ser ilegal. Los autores no aceptan ninguna responsabilidad por el mal uso.
| CVE | Debilidad | Acceso | Core afectado | Corregido en |
|---|
| CVE-2026-63030 — wp2shell | CWE-436 — Confusión de rutas batch en REST → RCE (Crítica; CVSS 9.8 WPScan CNA / 7.5 CISA-ADP; GHSA-ff9f-jf42-662q) | Sin autenticación | 6.9.0–6.9.4, 7.0.0–7.0.1 | 6.9.5, 7.0.2 |
| CVE-2026-60137 | CWE-89 — Inyección SQL en WP_Query author__not_in (Moderada por sí sola, CVSS 5.9; Crítica en cadena; GHSA-fpp7-x2x2-2mjf) | Sin autenticación | 6.8.0–6.8.5, 6.9.0–6.9.4, 7.0.0–7.0.1 | 6.8.6, 6.9.5, 7.0.2 |
| CVE-2026-3906 | CWE-862 — Falta de autorización en la API REST de Notes (Moderada, CVSS 4.3, GHSA-6x83-fcf5-r65g) | Suscriptor+ | 6.9.0–6.9.1 | 6.9.2 |
| Opción | Significado |
|---|
-t, --target | URL u host de un único objetivo |
-T, --targets-file | Archivo con un objetivo por línea |
--demo | Genera un informe/correo de MUESTRA a partir de datos sintéticos (sin red) |
-o, --output-dir | Directorio de salida (por defecto ./wp2shell_reports) |
--formats | Lista separada por comas: json,html,email (por defecto: todos) |
--authorized | Puerta de autorización — obligatorio para escaneos en vivo |
--timeout | Tiempo de espera HTTP en segundos (por defecto 12) |
--delay | Segundos entre objetivos (sé educado; por defecto 1.0) |
--insecure | No verificar certificados TLS |
--quiet | Suprime el resumen de consola |
| Veredicto | Significado |
|---|
VULNERABLE | La versión detectada está dentro de un rango afectado — parchea de inmediato |
PATCHED | En una versión corregida; no expuesto a las CVE rastreadas |
NOT_AFFECTED | La versión es anterior al fallo rastreado más antiguo (< 6.8.0 — CVE-2026-60137) |
UNKNOWN | No se pudo confirmar la versión, los vectores no coincidieron o se vio una compilación pre-release — verifica manualmente |
NOT_WORDPRESS | No se encontró ninguna huella de WordPress |