Операция GhostMail: российская APT-группировка использует уязвимость Zimbra Webmail для атаки на государственное агентство Украины.
Содержание:
- Введение
- цель
- Фишинговая электронная почта
- Анализ инфекции
- Этап 1: Загрузчик JavaScript
- Этап 2: Похититель браузера
- Инфраструктура и атрибуция
- Оценка CVE
- Заключение
- Seqrite Покрытие
- МНК
- MITRE ATT & CK
Введение
Seqrite В ходе лабораторных исследований была выявлена целенаправленная фишинговая кампания, использующая уязвимость межсайтового скриптинга (XSS). Сотрудничество с Zimbra (ZCS) пытается скомпрометировать украинский государственный орган. Фишинговое письмо не содержит вредоносных вложений, подозрительных ссылок и макросов. Вся цепочка атаки находится внутри HTML-тела одного письма, вредоносных вложений нет.
Метод социальной инженерии, используемый для обмана при поиске стажировки, позволяет доставить зашифрованный JavaScript-код, встроенный непосредственно в тело электронного письма. Когда жертва открывает письмо в уязвимой веб-версии почтового клиента Zimbra, она использует уязвимость. CVE-2025-66376 Это уязвимость типа XSS, вызванная недостаточной проверкой директив CSS @import в HTML-контенте. Скрипт незаметно выполняется в браузере и начинает собирать учетные данные, токены сессий, резервные коды двухфакторной аутентификации, сохраненные в браузере пароли и содержимое почтового ящика жертвы за последние 90 дней, при этом все данные передаются по DNS и HTTPS.
Исходя из технических совпадений с операциями в Зимбре и геополитической направленности, мы с умеренной степенью уверенности оцениваем, что эта кампания соответствует методам ведения боевых действий, ранее задокументированным в рамках... Российское государственное финансирование В украинские государственные структуры были внедрены вредоносные программы. Об этом сообщено в CERT-UA.
цель
- Страна: Украина
- Сектор: Правительство
Получатель электронного письма — представитель Государственного агентства гидрологии Украины, работающего в секторе, классифицируемом как критически важная национальная инфраструктура и отвечающего за навигационное, морское и гидрографическое обеспечение судоходства. Оно находится в подчинении Министерства инфраструктуры (в частности, Государственной службы морского и речного транспорта Украины). Данная атака соответствует более масштабным кибер-операциям, проводимым против украинских государственных учреждений на фоне продолжающегося регионального конфликта.
Фишинговая электронная почта
Фишинговое письмо было получено 22 числа.nd В январе 2026 года студент Национальной академии внутренних дел (НАВД) обратился в украинское государственное агентство гидрологии (судя по IP-адресу отправителя в заголовке, почтовый ящик студента, вероятно, взломан). Электронное письмо, написанное на украинском языке, представляет собой обычный запрос о стажировке, где студент представляется студентом 4-го курса и спрашивает, знает ли получатель о каких-либо возможностях стажировки или контактных лицах, к которым можно обратиться. Кроме того, отправитель извиняется за то, что письмо может попасть не в тот почтовый ящик, что является классической тактикой для укрепления доверия.

Ключевые наблюдения:
- Отправлено с инфраструктуры, связанной с NAVS.
- На первый взгляд выглядит правдоподобно.
- Нет вредоносных вложений, нет подозрительных внешних ссылок.
- Вредоносный код, встроенный непосредственно в тело HTML-кода.
- На VirusTotal не обнаружено ни одного случая заражения, хотя вирус был впервые выявлен и загружен 26 февраля из Украины.

Злоумышленник составил это электронное письмо вручную через веб-интерфейс Zimbra в Chrome 132 (стабильная версия от 14 января 2026 г.), а не с помощью автоматизированного инструмента.
- 8.15_GA_4717 – Версия сервера Zimbra от SENDER
- 10.1.7_GA_4200002 – Номер сборки пользовательского интерфейса ZimbraWebClient

В электронном письме содержится скрытый вредоносный JavaScript, встроенный в текст. Это большой скрипт, закодированный в base64, внутри тела HTML-кода. Обход тега `@import` предназначен для того, чтобы выглядеть как некорректный HTML-код при проверке с помощью регулярных выражений, оставаясь при этом корректным для анализа браузером.

Эксплойт в этом примере соответствует уязвимости CVE-2025-66376, представляющей собой хранимую XSS-уязвимость в Zimbra Collaboration Suite, исправленную в ZCS 10.0.18 / 10.1.13 (ноябрь 2025 г.). В описании CVE указано: «недостаточная очистка HTML-контента, в частности, затрагивающая специально созданные структуры тегов и значения атрибутов, содержащие директиву @import и другие векторы внедрения скриптов. Уязвимость срабатывает, когда пользователь просматривает специально созданное электронное письмо в классическом пользовательском интерфейсе».
Обходной механизм основан на удалении токена @import из имен тегов и строковых представлений типа ключ/значение атрибутов. В электронном письме также содержатся вторичные поддельные письма, использующие тот же принцип, но с ошибками. and tags with @import noise injected into the tag name itself, and an HTML comment inserted mid-tag-name. This tag-name bypass causes AntiSamy to reconstruct from fragmented tokens, and executes the outer Base64 decoded code and the self-executing function runs.
Анализ инфекции
Жертва получает фишинговое письмо в веб-почте Zimbra. Для выполнения вредоносного кода жертве необходимо открыть письмо в браузерном интерфейсе Zimbra с активной аутентифицированной сессией. JavaScript выполняется в контексте этой сессии, наследуя ее файлы cookie, localStorage и права доступа к SOAP API того же источника.

Этап 1: Загрузчик JavaScript
Загрузчик заключен в самоисполняемую функцию, которая начинается с предотвращения множественных инъекций путем проверки, является ли скрипт с ID «zmb_pl_v3_«Уже запущена или нет?» Следующий важный этап — декодирование данных в формате base64 с помощью атоб () а затем выполнить операцию XOR с ключом «twichcba5e«Для загрузки финального JavaScript-кода. Он внедряет код в документ верхнего уровня, поскольку содержит контекст сессии, доступ к файлам cookie и позволяет выйти из песочницы iframe веб-почты».

Этап 2: Похититель браузера
Финальная полезная нагрузка представляет собой программу-похититель, которая выполняется в памяти браузера. Она перехватывает учетные данные для входа в систему, токены SOAP-сессий, содержимое почты и вложения, файлы cookie и т. д. Начинается все с генерации токена сессии для каждого выполнения, который представляет собой случайную 12-символьную буквенно-цифровую строку, используемую в качестве уникального идентификатора жертвы в каждом запросе к C2. Закодированный домен C2 — это... zimbrasoft[.]com[.]uaЛюбое исключение, перехваченное в любом месте полезной нагрузки, отправляет POST-запрос на /v/p с именем этапа, сообщением об ошибке и трассировкой стека. Оператор C2 точно видит, какой этап завершился с ошибкой и почему на каждой машине жертвы. Для изоляции сбоев вокруг каждой задачи используется конструкция try/catch, чтобы одна неисправная операция не прерывала другие.

Затем у нас есть оболочка Zimbra SOAP, которая отправляет аутентифицированные SOAP-запросы на собственный сервер Zimbra жертвы по адресу «/service/soap/Заголовок X-Zimbra-Csrf-Token содержит украденный токен CSRF, что делает запросы неотличимыми от легитимной активности в веб-почте. Вызовы SOAP оборачиваются таким образом, чтобы в случае сбоя возвращать null вместо генерации ошибки, что позволяет выполнять другие параллельные операции, даже если один вызов SOAP будет отклонен.

В процессе эксфильтрации DNS значения кодируются в формате Base32 согласно RFC 4648, разбиваются на 60-символьные сегменты и формируются DNS-имена хостов в следующем виде:
- д- . . .i[.]zimbrasoft[.]com[.]ua
Далее, он сериализует объекты JSON в виде двоичных данных application/octet-stream и отправляет их методом POST на /v/d с заголовком X-Filename, который используется для более крупных структурированных объектов, таких как полный дамп конфигурации сервера. Маяк представляет собой простой POST-запрос на /v/p, используемый для небольших структурированных данных наряду с DNS или вместо него. Он также может отправлять одно и то же значение как через DNS, так и через HTTPS. DNS проходит, даже когда HTTPS заблокирован; HTTPS передает полные данные, когда он не заблокирован.

В пользовательском интерфейсе Zimbra Classic токен CSRF хранится в открытом виде здесь: localStorage.getItem(“csrfToken”). Без него все SOAP-вызовы будут отклонены. Этот код выполняется синхронно первым, до начала каких-либо SOAP-операций.

Все девять параллельных операций запускаются одновременно. Обещание.всеС точки зрения C2, это максимизирует объем данных, получаемых за сессию жертвы: если вкладка закрывается через 10 секунд, то все потенциальные события уже произошли.
SendStartPing: Уведомляет C2 после начала выполнения полезной нагрузки. Это позволяет злоумышленнику сопоставлять время начала и окончания выполнения для каждой жертвы.
gather_emailДвухэтапный метод сбора адресов электронной почты, который сначала выполняет сбор данных непосредственно в тексте. tags for the batchInfoResponse Переменная JavaScript, которую Zimbra встраивает при загрузке страницы. В случае сбоя она использует... GetIdentitiesRequest SOAP, который возвращает все настроенные идентификаторы, включая псевдонимы, и осуществляет эксфильтрацию данных через DNS и HTTPS.

gather_environment: Снимает отпечатки пальцев у клиента и совершает звонок GetInfoRequest чтобы получить полный ответ с конфигурацией сервера, а затем выгрузить весь JSON в виде zimbra_batch_analytics.json. Этот объект содержит версию Zimbra, квоту учетной записи, настроенные функции, имя хоста сервера и десятки параметров учетной записи.
- Классический (?client=advanced)
- HTML (/h/)
- Современный (/modern/).
gather_2fa_codes: Оно использует GetScratchCodesRequest которая возвращает резервные коды восстановления двухфакторной аутентификации учетной записи. Это одноразовые коды, предназначенные для экстренного доступа, и с их помощью злоумышленник может пройти аутентификацию, даже если жертва сменит пароль и отменит все сессии. Каждый код передается индивидуально через DNS.

gather_app_password: Здесь используются CreateAppSpecificPasswordRequest создать новые постоянные учетные данные с именем ZimbraWebПароли, специфичные для приложений, сохраняются после сброса. Это долгосрочный механизм доступа злоумышленника: после создания он позволяет бессрочно использовать прямую аутентификацию IMAP или API и осуществлять утечку данных через DNS.
gather_device_status: GetDeviceStatusRequest (пространство имен urn:zimbraSync) используется для возврата всех мобильных устройств, подключенных к ActiveSync, с подробной информацией, такой как идентификаторы устройств, типы и состояние синхронизации. Это полезно для создания профиля цели и потенциально для последующих мобильных атак.
gather_oauth_consumers: GetOAuthConsumersRequest Используется для отображения списка всех сторонних приложений OAuth, авторизованных в учетной записи. Это позволяет увидеть другие платформы, используемые целевой системой, и какие из них имеют доступ к почтовому ящику на уровне API.

gather_autocomplete_passwordЭта атака внедряет два скрытых поля формы (autocomplete=”username” и autocomplete=”current-password”) за пределы видимой области DOM и ждет 5 секунд, пока менеджер паролей браузера автоматически их заполнит. Затем она считывает появившееся содержимое, извлекает его и удаляет все внедренные элементы. Это единственная операция, для которой не требуется токен CSRF, поскольку она нацелена на браузер, а не на Zimbra.
enable_mail_protocols: ModifyPrefsRequest Устанавливает параметр zimbraPrefImapEnabled: TRUE для учетной записи жертвы. Это незаметно включает доступ по протоколу IMAP, который пароль приложения затем может использовать для постоянного наблюдения за почтовым ящиком с любого IMAP-клиента.

Переходя к наиболее важному разделу, а именно: sendArchives Для 90-дневной эксфильтрации электронной почты. Цикл повторяется с 0 по 89 день, загружая каждый день неспамовые письма из встроенной в Zimbra точки экспорта «/home/~/?fmt=tgz». Каждый день файлы .tgz загружаются напрямую через js-[token].i.zimbrasoft.com.ua/v/d. Используются два режима загрузки:
- Потоковая передача данных (ReadableStream, передаваемый напрямую по каналу, без буфера в памяти) для современных браузеров.
- Буферизованный массив с ограничением в 500 МБ для более старых версий.

В качестве контрольных точек используются ключи localStorage (zd_comp_YYYY-MM-DD). Если вкладка открывается снова, пропускаются уже украденные данные за предыдущие дни. Тайм-аут установлен на 24 часа в сутки, то есть данные будут передаваться до тех пор, пока вкладка открыта.
Наконец, sendFinishPing Маяки используются для подтверждения завершения всех операций. Центр управления и контроля может использовать сигналы начала/окончания для измерения продолжительности сеанса взаимодействия с жертвой и определения того, что было захвачено.

Инфраструктура и атрибуция
Домен C2 был создан 20.01.2026 в 12:10:33+02, непосредственно перед отправкой фишингового письма с регистратором ua.drs. На данный момент идентифицированы два сгенерированных домена:
- js-l1wt597cimk[.]i[.]zimbrasoft[.]com[.]ua
- js-26tik3egye4[.]i[.]zimbrasoft[.]com[.]ua
Несколько связанных с Россией APT-группировок ранее использовали уязвимость Zimbra в масштабах восточноевропейских целей: Fancy Bear (APT28), Cozy Bear (APT29) и Winter Vivern (TA473). APT29 задокументировала В Zimbra используется уязвимость внедрения команд, позволяющая красть учетные данные электронной почты через уязвимый почтовый сервер. Это атака на стороне сервера, не требующая взаимодействия с электронной почтой, что представляет собой совершенно другой класс атак по сравнению с фишинговыми письмами, которые представляют собой XSS-атаку в HTML-письмах, требующую от жертвы открыть их в веб-почте. TA473 Использовались не сложные инструменты, а лишь более простые JavaScript-программы для кражи учетных данных с уязвимостью XSS в Zimbra. Отсутствует структурированное злоупотребление SOAP API и двухканальная эксфильтрация данных.
Как указано в разделе «Операции ESET». RoundPress В ходе исследования 2024 года APT28 расширила свою деятельность с Roundcube на Zimbra, Horde и MDaemon, нацеленные на государственные структуры и оборонные компании в Восточной Европе. Расшифрованная нами структура полезной нагрузки очень похожа на SpyPress.ZIMBRA, которая собирает список контактов жертвы, отправляя SOAP-запрос к конечной точке API Zimbra, и получает адрес электронной почты для эксфильтрации. Основываясь на этих совпадениях и целях, мы со средней степенью уверенности приписываем операцию GhostMail APT28.
Заключение
Операция GhostMail демонстрирует продолжающуюся эволюцию атак, направленных на веб-почту, где злоумышленники полностью полагаются на встроенные в браузер программы-крадущи, а не на традиционные вредоносные программы. Внедряя обфусцированный JavaScript непосредственно в HTML-письмо и используя уязвимость XSS в веб-почте Zimbra, злоумышленник добивается полного перехвата сессии без размещения файлов, использования макросов или срабатывания систем обнаружения на конечных устройствах. Злоупотребление легитимными вызовами SOAP API для сбора учетных данных и экспорта почтовых ящиков подчеркивает, как встроенные в платформу функции могут быть использованы для скрытого сбора данных.
Атака на украинский государственный орган соответствует продолжающейся геополитической кибердеятельности, наблюдаемой против государственных учреждений в регионе. Хотя для окончательного установления авторства требуется дополнительная инфраструктура или подтверждение совпадения кода, использованные методы соответствуют ранее задокументированным российским группам, спонсируемым государством, которые использовали уязвимости веб-почтовых платформ в Восточной Европе. Важность строгой проверки HTML-кода в веб-почтовых средах, оперативного обновления программного обеспечения и мониторинга аномальной активности SOAP указывает на компрометацию сессий через браузер.
Seqrite Покрытие
Script.Trojan.50486.GC
СОВЕТЫ
- Немедленно перейдите с Zimbra 8.8.15 на поддерживаемую версию (минимум 10.1.x) или на альтернативную платформу.
- Проведите аудит всех учетных записей на наличие паролей для конкретных приложений, названных ZimbraWeb или созданных примерно в дату получения подозрительных электронных писем. Немедленно аннулируйте их.
- Проверка настроек учетных записей на предмет неожиданных изменений параметра zimbraPrefImapEnabled: TRUE, особенно для учетных записей, которым не требуется доступ по протоколу IMAP.
- Проверьте журналы аудита Zimbra на предмет доступа к /home/~/?fmt=tgz с необычных IP-адресов или вне обычного рабочего времени.
- Внедрите мониторинг SOAP API на уровне приложения. В частности, вызовы GetScratchCodesRequest и CreateAppSpecificPasswordRequest должны практически отсутствовать при обычном использовании и их легко отслеживать в базовом режиме.
- Внедрить фильтрацию DNS для доменов IOC и рассмотреть возможность поведенческого оповещения для шаблона поддомена d-[a-z0-9]{12}.i.*, характеризующего канал утечки DNS.
- Проверьте, следует ли включить доступ по протоколам IMAP и POP3 по умолчанию для учетных записей пользователей. Отключение неиспользуемых протоколов на административном уровне устраняет один из способов сохранения доступа, даже если учетные данные впоследствии будут скомпрометированы.
- Проинформируйте сотрудников о том, что HTML-содержимое электронных писем может содержать исполняемые файлы в веб-почтовых средах. Отсутствие вложений и ссылок не является надежным показателем безопасности.
МНК
Эл. адрес
c010f64080b0b0997b362a8e6b9c618e
C2
zimbrasoft[.]com[.]ua
js-[a-z0-9]{12}.i.zimbrasoft[.]com[.]ua
MITRE ATT & CK
| тактика | TID | Техника | Метод |
| Развитие ресурсов | T1583.001 | Приобретение инфраструктуры: домены | Домен управления и контроля (C2) был зарегистрирован непосредственно перед атакой. |
| Развитие ресурсов | T1586.002 | Взлом учетных записей: учетные записи электронной почты | Фишинговое письмо, отправленное с адреса электронной почты NAVS. |
| Первоначальный доступ | T1566.001 | Фишинг: Целевое фишинговое вложение | HTML-письмо со встроенной XSS-атакой |
| Типы | T1059.007 | Интерпретатор команд и сценариев: JavaScript | Полезная нагрузка, находящаяся в браузере |
| Типы | T1203 | Эксплуатация для клиентского исполнения | Уязвимость CVE-2025-66376 была использована для взлома. |
| Настойчивость | T1098.001 | Управление учетной записью: Дополнительные облачные учетные данные | Функция CreateAppSpecificPasswordRequest создает новые постоянные учетные данные. |
| Уклонение от защиты | T1027 | Замаскированные файлы или информация | XOR + многоуровневое кодирование Base64, @import token |
| Уклонение от защиты | T1564.001 | Скрыть артефакты: скрытые файлы и каталоги | Полезная нагрузка скрыта от визуального осмотра. |
| Доступ к учетным данным | T1528 | Кража токена доступа к приложению | GetOAuthConsumersRequest |
| Доступ к учетным данным | T1539 | Украсть файл cookie веб-сессии | CSRF-токен из localStorage |
| Доступ к учетным данным | T1111 | Перехват многофакторной аутентификации | Защита от кражи кода двухфакторной аутентификации через GetScratchCodesRequest |
| Доступ к учетным данным | T1555.003 | Учетные данные из хранилищ паролей: Учетные данные из веб-браузеров | Автозаполнение DOM-инъекции сбор |
| Дискавери | T1082 | Обнаружение системной информации | GetInfoRequest отпечаток сервера |
| Дискавери | T1087.003 | Обнаружение учетной записи: учетная запись электронной почты | GetIdentitiesRequest и парсинг DOM |
| Дискавери | T1069 | Обнаружение групп разрешений | GetOAuthConsumersRequest |
| Дискавери | T1120 | Обнаружение периферийных устройств | GetDeviceStatusRequest |
| | T1114.002 | Сбор адресов электронной почты: удаленный | 90-дневная проверка |
| | T1185 | Перехват сеанса браузера | window.top.document iframe escape |
| | T1213 | Данные из информационных хранилищ | Выгрузка конфигурации zimbra_batch_analytics.json |
| эксфильтрации | T1041 | Эксфильтрация через канал C2 | HTTPS POST /v/d и /v/p |
| эксфильтрации | T1071.004 | Протокол прикладного уровня: DNS | Эксфильтрация DNS-данных, закодированных в Base32. |
Авторы
Сатвик Рам Пракки
Картик Дживани



