Una variante completamente armada de red-team (seguridad ofensiva) de wp2shell, construida para pruebas de penetración autorizadas y fines educativos.
Una prueba de concepto autónoma para la inyección SQL ciega no autenticada alcanzable a través del endpoint batch REST de WordPress (/wp-json/batch/v1). Es una implementación independiente construida a partir de la mecánica de vulnerabilidad publicada.
Aviso Oficial: Comunicado de Seguridad de WordPress | CVE-2026-63030
Autor: J4ck3LSyN
Autoridades: CFSD, NFK & C4b1NKr3W
Nota: No incluí el implante de persistencia armado
r00t.pyasociado por obvias razones legales. Para obtenerlo, puedes enviarme un mensaje directo en x
[!ADVERTENCIA]
Este código se proporciona TAL CUAL solo con fines educativos y de investigación. No utilice este PoC en sistemas de producción, entornos compartidos o cualquier objetivo no autorizado.
- Ejecutar o alojar este código puede activar detecciones de antivirus, alertas de monitoreo de seguridad o consecuencias legales si se usa indebidamente.
- Los autores y mantenedores del repositorio no asumen ninguna responsabilidad por cualquier daño, uso indebido o actividad ilegal resultante de este código.
- Úselo exclusivamente en entornos de laboratorio aislados con la autorización adecuada. Destinado únicamente para investigación defensiva, análisis de vulnerabilidades y pruebas de equipos azules.
poc.py - CLI principal de la Prueba de Concepto (modos check, read, shell)val.py - Validador de vulnerabilidad pasivo ligero (val.py <objetivo>)MITIGATIONS.md - Guía completa de mitigación y endurecimientoLETHALITY.html - Matriz de Letalidad de Capacidades Visual (mapa de calor + cadena de eliminación)LICENSE - Licencia MITr00t.py:redactado - Orquestador principal del implante (une todo)modules/ - Módulos de implante post-explotaciónexploit.py - Lógica de explotación principal (SQLi + primitiva RCE)privesc.py:redactado - Comprobaciones de escalada de privilegios local (DirtyCOW, sudo, capacidades, etc.)lpe_byond.py:redactado - LPE avanzado usando técnicas BYOVD + eBPF (controlado por operador)recon.py:redactado - Perfilado y enumeración del hostpersistence.py:redactado - Mecanismos de persistencia (systemd, cron, claves SSH)c2.py:redactado - Baliza C2 cifrada (HTTPS + DoH)exfil.py:redactado - Recopilación de credenciales y exfiltración de datosstealth.py:redactado - Anti-análisis, detección de sandbox y ofuscación| Rama | Versiones Afectadas | Corregido En |
|---|---|---|
| 6.9.x | 6.9.0 - 6.9.4 | 6.9.5 |
| 7.0.x | 7.0.0 - 7.0.1 | 7.0.2 |
Consulte los comunicados de seguridad oficiales de WordPress para más detalles.
El endpoint batch envía varias sub-solicitudes en una sola llamada, validando y comprobando permisos de cada una de forma independiente. Cuando la ruta de una sub-solicitud falla en wp_parse_url(), se añade al array de validación pero no al array de manejadores coincidentes. Los dos arrays se desincronizan, y una sub-solicitud posterior se envía bajo el manejador de una sub-solicitud diferente. Eso es la confusión de rutas.
Este PoC anida la primitiva dos veces:
POST /wp/v2/posts que lleva un cuerpo requests se envía bajo el propio manejador batch. Al haber sido validada como una solicitud de posts, su lista interna requests nunca se vuelve a comprobar contra el esquema batch, por lo que las sub-solicitudes internas pueden usar GET (evasión de la lista blanca de métodos).GET /wp/v2/users que lleva author_exclude=... se envía bajo posts get_items(). El esquema de la colección de usuarios no tiene un parámetro author_exclude, por lo que el valor pasa la validación sin cambios. posts get_items() asigna author_exclude a la variable de consulta author__not_in de WP_Query, que las compilaciones vulnerables interpolan en SQL como una cadena sin procesar.El sumidero final es una inyección SQL ciega booleana/basada en tiempo sin autenticación:
... post_author NOT IN (<valor>) ...
Un valor de 0) <sql>-- - cierra la lista IN() y añade SQL arbitrario.
El PoC es de fallo seguro (fail-closed). Tres compuertas en tiempo de ejecución evitan la ejecución accidental o fuera del alcance. Todas se aplican en modules/exploit.py; la CLI en poc.py solo las pasa a través.
| Indicador | Ámbito | Efecto cuando está ausente |
|---|---|---|
--authorized | Todo I/O de red | AuthorizationError antes de cualquier envío |
--noop | Todos los subcomandos | Construye/imprime payloads; sin contacto de red |
--max-requests | BatchClient | Presupuesto duro de solicitudes |
--r00t | Subcomando shell | Capacidades RCE post-autenticación retenidas |
AuthorizationError se genera en BatchClient._ensure_authorized(), AdminSession._ensure_authorized() y AdminSession._ensure_r00t().BatchClient._count() aplica --max-requests antes de abrir el socket.--r00t es el separador de capacidades: una compilación distribuida sin él no puede desplegar ni ejecutar una webshell.Manejo de credenciales para shell: el nombre de usuario y la contraseña de administrador se resuelven desde --user / --password, o variables de entorno / un archivo seguro.
git clone https://github.com/J4ck3LSyN-Gen2/CVE-2026-63030-wp2r00t.git
cd CVE-2026-63030-wp2r00t
python3 -m py_compile modules/exploit.py poc.py # comprobación de cordura básica
Requisitos: Python 3.11+, solo biblioteca estándar (sin dependencias pip).
python3 poc.py <comando> <url> [indicadores]
Indicadores comunes (todos los subcomandos):
--authorized Afirma que usted posee / está autorizado para probar <url>. Obligatorio para enviar.
--noop Construye/valida payloads sin enviar (sin contacto de red).
--max-requests N Límite máximo de solicitudes al objetivo.
--rest-route Usar /?rest_route=/batch/v1 en lugar de /wp-json/batch/v1.
--timeout FLOAT Tiempo de espera de solicitud (por defecto 30).
--proxy URL Proxy HTTP(S).
--insecure Deshabilitar verificación de certificado TLS.
check - Confirmar vulnerabilidad (no destructivo)read - Extracción SQL ciegashell - Ayudante de webshell post-autenticación (requiere --r00t)validate - Identificador pasivoReferencia Rápida