GhostContainer не атакует Exchange. Он становится его частью — и подчиняет себе весь трафик

GhostContainer не атакует Exchange. Он становится его частью — и подчиняет себе весь трафик

CVE-2020-0688 снова в деле. Но теперь с новым лицом.

image

Команда аналитиков из Лаборатории Касперского обнаружила крайне изощрённую вредоносную программу, внедрённую в Exchange-инфраструктуру правительственных учреждений. По данным журналов и характеру исполняемого кода, заражение произошло через известную N-day уязвимость — предположительно CVE-2020-0688 . За инцидентом, скорее всего, стоит высокопрофессиональная APT-группа , специализирующаяся на атаках на критические цели в азиатском регионе.

Центром всей операции стал .NET-файл под названием App_Web_Container_1.dll. Это модуль размером 32,8 КБ, оформленный как сборка Mono/.NET под архитектуру Intel 80386 (x86), со следующими контрольными суммами: MD5 — 01d98380dfb9211251c75c87ddb3c79c, SHA1 — 2bb0a91c93034f671696da64a2cf6191a60a79c5, SHA256 — 87a3aefb5cdf714882eb02051916371fbf04af2eb7a5ddeae4b6b441b2168e36. Время компиляции в PE-файле подделано и указывает на 01.01.1970.

Файл содержит три основных класса: Stub, App_Web_843e75cf5b63 и App_Web_8c9b251fb5b3. Дополнительно задействован утилитный класс StrUtils. Стартовая точка — класс Stub, который играет роль C2-командного парсера. Он выполняет команды удалённого атакующего, в том числе: исполнение шелл-кода, запуск системных команд, загрузку файлов и байткода .NET, инъекцию веб-страниц, а также работу в роли прокси и туннеля.

Первое действие Stub — отключение AMSI и системного логирования Windows путём модификации в памяти библиотек amsi.dll и ntdll.dll. Затем он извлекает ключ валидации из конфигурации ASP.NET и, преобразовав его в SHA-256, использует в качестве AES-ключа для шифрования/дешифрования передаваемых данных. Обмен осуществляется через заголовок x-owa-urlpostdata, в котором команды шифруются AES и кодируются в Base64. После расшифровки команда интерпретируется по ID и исполняется. При необходимости модуль может выполнять действия от имени системного пользователя, применяя токены из контекста приложения.

Команды, которые понимает и выполняет Stub, представлены в таблице ниже.

ID Функциональность
0 Определение архитектуры (x86/x64)
1 Выполнение shellcode
2 Выполнение системной команды
3 Загрузка и исполнение .NET-байткода
4 GET-запрос
5 Скачивание и сохранение файла
6 Сохранение сырых данных в файл
7 Удаление файла
8 Чтение содержимого файла
9 Исполнение .NET-программы с выводом
10 Инъекция фейковой страницы (инициализация App_Web_843e75cf5b63)
11 Удаление файлов с подстрокой "App_Global"
14 Параллельные HTTP POST-запросы

Ответ на каждую команду возвращается в виде XML. Значение внутри элемента value всегда начинается с строки /wEPDwUKLTcyODc4, что указывает на сходство с проектом ExchangeCmdPy.py, использующимся для эксплуатации уязвимости CVE-2020-0688.

Второй класс — App_Web_843e75cf5b63 — используется для создания виртуальных ASPX-страниц. Он основан на открытом коде PageLoad_ghostfile.aspx и реализует виртуальную загрузку страниц с использованием классов типа VirtualProvider. Страница создаётся на лету с помощью двух аргументов: фиктивное имя страницы и путь. Внутри неё содержится зашифрованный в Base64 .aspx-код, который выполняется и инициализирует следующий ключевой модуль — App_Web_8c9b251fb5b3.

Этот третий модуль представляет собой гибрид веб-прокси и туннеля. Он использует заголовки Qprtfva и Dzvvlnwkccf для маршрутизации запросов. Первый — для создания прокси-соединений: URL декодируется из Base64, оригинальный запрос клонируется и пересылается на целевой адрес, ответ возвращается пользователю. Второй заголовок — для установления и управления TCP-туннелями между внешними и внутренними узлами. Каждое соединение идентифицируется уникальным именем сокета (первые 22 байта заголовка), а команды начинаются с 23-го байта и включают: подключение, отключение, пересылку данных и чтение из сокета.

Команды управления туннелем, встроенные в модуль прокси:

  • 1iGBIM1C5…: Расшифровка IP и порта, подключение, сохранение сокета
  • vfhafFQZ4…: Закрытие и удаление сокета
  • M4LubGO0x…: Отправка данных из HTTP-запроса во внутреннюю сеть
  • NYIJVBf2PX…: Получение данных из внутренней сети и возврат через HTTP

Утилитный класс StrUtils выполняет базовые операции: разбиение строк, удаление символов из путей, извлечение значений из XML. При этом XML-функции нигде явно не используются.

Примечательно, что GhostContainer не устанавливает исходящих соединений и не использует статические C2-серверы. Все команды передаются через обычные Exchange-запросы, что позволяет злоумышленникам полностью сливаться с легитимным трафиком и скрывать свою активность от традиционных средств обнаружения.

На данный момент подтверждено как минимум два случая компрометации: ключевое правительственное учреждение и высокотехнологичная компания — обе цели находятся в Азии. Несмотря на использование кода из открытых проектов (в частности, Neo-reGeorg, ExchangeCmdPy и других), общая архитектура и реализация GhostContainer уникальны. Это исключает простое копирование и говорит о глубокой технической компетенции группировки.

Весь ход атаки демонстрирует детальное понимание внутренней архитектуры Exchange и IIS, а также мастерское использование доступных компонентов с адаптацией под конкретные цели. Исследователи считают, что за этим стоит зрелая и высокопрофессиональная команда. Анализ их активности продолжается.