Найти тему

Тактики и техники кибершпионского ПО группировки Earth Baku

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

Разработчики шпионских программ используют обширный набор тактик и техник для проникновения в сети целевых организаций и для управления внедрёнными в инфраструктуру агентами.

В этой статье эксперты Trend Micro рассказывают о некоторых тактиках и техниках, которые использует в своих кампаниях профессиональная кибергруппировка Earth Baku, также известная как APT41.

Проникновение в систему и начальные действия

Для проникновения в целевые системы хакеры Earth Baku используют несколько способов:

  • эксплуатация уязвимостей веб-приложений, в том числе SQL-инъекции;
  • использование учётных данных сотрудников компаний-жертв, полученных с помощью атак на водопой и фишинга;
  • эксплуатация уязвимости ProxyLogon в серверах MS Exchange;
  • вредоносные вложения в электронных письмах.

После проникновения в систему хакеры запускают загрузчик, основная цель которого — загрузка, установка и запуск полезной нагрузки для второго этапа — собственно кибершпионажа.

В недавних кампаниях Earth Baku встречаются два варианта загрузчиков. Первая версия загрузчика, написанная на С#, получила название StealthMutant. 
Её обнаружили в июле 2020 года.

-2

Функция расшифровки исполняемого файла StealthMutant, зашифрованного AES-256-ECB. Источник здесь и далее: Trend Micro.

Исполняемый файл StealthMutant зашифрован AES-256-ECB и расшифровывается в памяти после запуска. После этого он внедряет вредоносную полезную нагрузку в целевой удалённый процесс, а затем выполняет его. Обычно в качестве полезной нагрузки используется либо агент Cobalt Strike или бэкдор ScrambleCross.

Большинство образцов StealthMutant, с которыми мы столкнулись, обфусцированы ConfuserEx, обфускатором с открытым исходным кодом для приложений .NET Framework.

Вторая версия загрузчика, получившая название StealthVector, появилась в октябре 2020 года. Для её разработки использовался С/С++. В StealthVector используются различные техники маскировки и уклонения от обнаружения, причём по нашим наблюдениям арсенал этих техник находится в активной разработке. В качестве полезной нагрузки StealthVector также использует агент CobaltStrike или вредоносную программу ScrambleCross.

StealthVector предназначен для выполнения второго этапа полезной нагрузки в скрытом режиме. Для гибкого управления функциями скрытия методы уклонения могут быть включены и отключены с помощью встроенной в исполняемый файл конфигурации. Конфигурация размещается в секции данных, зашифрована с использованием алгоритма ChaCha20 и расшифровывается при инициализации.

Рассмотрим функции скрытия, которые имеются в StealthVector и работой которых можно управлять с использованием встроенной конфигурации.

Отключение трассировки событий для Windows

Чтобы отключить Event Tracing for Windows (ETW) StealthVector, как и StealthMutant, патчит API-функцию EtwEventWrite. Это позволяет ему сделаться невидимым для встроенной системы протоколирования Windows.

Патчинг реализован как для 32-битной, так и для 64-битной архитектуры.

Отличием от StealthMutant является возможность управлять работой этой функции с помощью конфигурации.

-3

Патчинг API-функции EtwEventWrite.

Проверка окружения

Подобно другим вредоносным программам StealthVector может проверять окружение на предмет повторного запуска с помощью мьютекса или имени пользователя. Эта проверка также может быть встроена в конфигурацию.

-4

Логика для определения расположения полезной нагрузки

StealthVector расшифровывает и выполняет полезную нагрузку в памяти, но также может быть настроен на загрузку своей зашифрованную полезную нагрузку в определённое место. Некоторые варианты загрузчика внедряют полезную нагрузку в свой двоичный файл, в то время как другие загружают её в другой файл в том же каталоге, имя которого указано в конфигурации вредоносной программы.

Логика расшифровки одинакова для всех вариантов StealthVector: он считывает данные определённого размера с определённого смещения. Значения смещения и размера зашифрованной полезной нагрузки уже определены в конфигурации вредоносной программы. После этого полезная нагрузка расшифровывается с помощью функции ChaCha20. Эта же функция используется для расшифровки конфигурации StealthVector, но начальный вектор (nonce) для полезной нагрузки уже задан в конфигурации.

-5

Функция внедрения зашифрованной полезной нагрузки в указанный файл в одном из вариантов StealthVector.

-6

Функция расшифровки StealthVector.

Самоудаление

StealthVector также может удалить себя из системы при определённом значении параметров конфигурации:

-7

Функция удаления из системы в StealthVector.

Техники запуска полезной нагрузки

StealthVector реализует различные техники выполнения полезной нагрузки, которые отличаются по сложности реализации и возможностям обнаружения.

Запуск с помощью CreateThread

Самый простой способ для StealthVector выполнить полезную нагрузку — воспользоваться функцией CreateThread.

-8

Запуск с помощью CreateThred.

Внедрение в локальный процесс

Некоторые варианты StealthVector реализуют технику уклонения под названием «внедрение в процесс» (module stomping), которая предназначен для обхода обнаружения. Техника внедрения хорошо известна, поскольку CobaltStrike реализовал эту функцию в      версии 3.11.14.

В случае StealthVector, однако, внедряемый полезная нагрузка представляет собой шеллкод, а не DLL. Для реализации запуска через внедрение StealthVector ищет легитимную DLL, в которой достаточно места для полезной нагрузки — payload_size + 2048.

-9

Функция поиска DLL с достаточным количеством места для внедрения в процесс.

Когда такая библиотека найдена, StealthVector загружает эту DLL с помощью функции LoadLibraryExW с флагом DONT_RESOLVE_DLL_REFERENCES. Когда этот флаг включён, система не вызывает DllMain целевой DLL при загрузке.

-10

Загрузка DLL без запуска функции DllMain.

После загрузки целевой DLL StealthVector изменяет параметры защиты DLL, включая разрешения на чтение, запись и выполнение. Затем он копирует свою полезную нагрузку в легитимную DLL и выполняет полезную нагрузку через функцию CreateThread.

-11

Алгоритм добавления вредоносной нагрузки в целевую DLL.

Обход защиты потока управления

Некоторые варианты StealthVector запускают полезную нагрузку в обход Microsoft Control Flow Guard (CFG), технологии смягчения последствий эксплойтов. CFG затрудняет выполнение вредоносными программами кода на операционных системах Windows, ограничивая косвенные вызовы на несанкционированный адрес.

Поскольку StealthVector выполняет полезную нагрузку с помощью CreateThread, который проверяет целевой адрес, ему необходимо обойти попытки проверки косвенного вызова.. Для этого он исправляет код API-функции LdrpHandleInvalidUserCallTarget в ntdll.dll с «48 FF E0 CC 90 (jmp rax; int3; nop)». Эта функция вызывается, когда CFG через функцию LdrpValidateUserCallTarget определяет, что целевой адрес недействителен. StealthVector может исправлять этот API без сбоя приложения

-12

Обход системы защиты от эксплойтов Windows.

-13

Патчинг функции в ntdll.dll.

Внедрение фантомной DLL в удалённый процесс

Некоторые варианты StealthVector могут внедрять свою полезную нагрузку в удалённый процесс, используя фантомное встраивание DLL — технику, которая представляет собой комбинацию встраивания процесса и внедрения модуля.

Для этого StealthVector порождает новый процесс, указанный в конфигурации, в приостановленном режиме. Для загрузки легитимной DLL в этот вновь созданный процесс используются API-вызовы NtCreateSection и ZwMapViewOfSection.

Логика поиска целевой DLL такая же, как и при внедрении модуля — проверяется, достаточно ли велик размер секции .text. Когда подходящая DLL найдена, StealthVector перезаписывает секцию кода загруженной DLL собственной полезной нагрузкой и выполняет ее в памяти DLL. Затем он исправляет точку входа легитимного процесса, чтобы изменить поток выполнения в этой точке входа в DLL.

Используя этот метод, злоумышленники могут спрятать полезную нагрузку StealthVector в пространстве памяти DLL и скрыться от обычных механизмов сканирования памяти.

-14

Внедрение фантомной DLL.

Полезная нагрузка

Наш анализ показал, что StealthMutant и StealthVector могут содержать две различные полезные нагрузки: маяк Cobalt Strike и недавно обнаруженную вредоносную программу ScrambleCross.

Агент Cobalt Strike

Среди большинства образцов, с которыми мы сталкивались, есть два типа агентов Cobalt Strike: гибридный HTTP-DNS и HTTPS. Интересно, что все агенты Cobalt Strike в памяти имеют формат файла Portable Executable (PE) с характерным заголовком. Хотя он выглядит как действительный MZ-заголовок, он также может быть выполнен как машинный код.

-15

Агент Cobalt Strike в PE-файле.

Этот код вычисляет адрес функции, которая служит в качестве точкой входа для рефлексивного загрузчика для динамической инициализации и выполнения DLL. Следует также отметить, что некоторые из образцов имеют PE-файлы со сломанными заголовками, но при этом всё равно работают аналогичным образом.

-16

Некорректный заголовок в PE-файле.

Агент Cobalt Strike, обнаруженный в образцах StealthMutant и StealthVector, имеет два типа водяных знаков. Один из них — «305419896» —относится к взломанной версии и широко используется различными другими злоумышленниками. Другой водяной знак — «426352781» — используется по крайней мере с мая 2021 года, но никогда не приписывался злоумышленникам.

ScrambleCross или переработанный Crosswalk

В ходе анализа мы обнаружили новый вариант полезной нагрузки StealthMutant и StealthVector. При более тщательном изучении выяснилось, что эта полезная нагрузка использует техники, схожие с бэкдором Crosswalk. Этот модульный бэкдор также используется Earth Baku.

После проведённого анализа мы пришли к выводу, что неизвестная полезная нагрузка является новой версией или, скорее, полностью переработанной версией Crosswalk. Она по-прежнему имеет многие из тех же возможностей, что и Crosswalk, но они реализованы по-другому. Учитывая это, мы назвали этот новый бэкдор ScrambleCross, чтобы чтобы отличить его от предшественника.

ScrambleCross имеет следующие общие черты с Crosswalk:

  • разработан как полностью позиционно-независимый код;
  • в нём зашифрованы код, данные и конфигурация;
  • он вычисляет хэш участка кода в качестве техники защиты от отладки;
  • поддерживает несколько типов протоколов сетевого взаимодействия;
  • использует очереди сообщений для асинхронного получения команд от рабочих потоков.

Однако несмотря на сходство есть несколько ключевых различий между этим бэкдором и ScrambleCross. Например, ScrambleCross также внедряет в себя зашифрованный код, но при этом использует несколько иной алгоритм шифрования. Для декодирования своих функций и глобальных значений, включая импорты или строки, ScrambleCross использует 16-байтовое XOR.

-17

ScrambleCross использует 16-байтовы XOR для декодирования функция и глобальных переменных.

-18

Как и StealthVector, ScrambleCross использует фиксированное значение 0xB для своего начального счётчика. Процедура ChaCha20 используется для шифрования и дешифрования данных при обмене с управляющим сервером:

-19

Процедура ChaCha20.

Для связи с сервером управления и контроля ScrambleCross поддерживает TCP, HTTP и HTTPS для протоколов прикладного уровня, но использует ChaCha20 и пользовательскую структуру сообщений для шифрования на транспортном уровне. Независимо от того, используется ли протокол TCP или HTTP, запрос клиента и ответ управляющего сервера имеют одну и ту же структуру сообщений.

Данные клиентского запроса составляются в следующие девять шагов. Данные в ответе сервера формируются в обратном порядке.

1. Получается от сервера 16-байтовый ответ или вместо него генерируется 16-байтовый нулевой ключ.

2. Генерируется случайный 16-байтовый начальный вектор (nonce) ChaCha20.

3. Генерируется 32-байтовый ключ ChaCha20.

4. Необработанные данные запроса сжимаются с помощью алгоритма сжатия LZ4.

5. Блок полезной нагрузки шифруется с помощью ChaCha20, используя ключ, сгенерированный на шаге 3. В качестве nonce используются первые 12 случайных байтов, сгенерированных на шаге 2.

6. Вычисляется MD5-хэш информации о жертве. Информация о жертве состоит из глобально уникального идентификатора (GUID), идентификатора бота и имени компьютера устройства жертвы.

7. Фрагмент заголовка шифруется с помощью ChaCha20 с помощью ключа, в конфигурацию сети. В качестве начального вектора (nonce) используются последние 12 случайных байтов, сгенерированных на этапе 2.

8. Вычисляется общий размер хэша MD5, который является суммой числа 13, nonce, зашифрованного блока заголовка и зашифрованного блока полезной информации. Хэш MD5 копируется в начало блока данных сообщения.

9. Если сообщение отправляется по протоколу TCP, добавляется размер данных сообщения.

-20

Алгоритм обработки данных в ScrambleCross.

ScrambleCross получает команды от сервера управления. При этом они сильно отличаются от тех, что используются в CrossWalk. В случае ScrambleCross целью команд бэкдора является получение подключаемых модулей c сервера и управление ими.

-21

Функция приёма команд от сервера управления.

Поскольку ScrambleCross поддерживает HTTPS, некоторые варианты этого бэкдора используют вычислительную платформу Cloudflare Workers, чтобы скрыть деятельность своего управляющего сервера. Cloudflare Workers может оказаться мощным и доступным инструментом для злоумышленников по следующим причинам:

  • он обеспечивает лучшую масштабируемость, что делает его полезным для злоумышленников, которые хотят создать свою инфраструктуру управления и контроля;
  • вредоносная программа не будет напрямую связываться с сервером управления, что созда     тьпроблему для аналитиков безопасности — они просто не смогут найти IP-адрес для блокировки, поскольку наблюдаемый IP-адрес относится к Cloudflare, а не к реальному серверу злоумышленников;
  • платформа Cloudflare Workers разрешена многими продуктами безопасности, а соединения с ней обычно считаются легитимными и поэтому, скорее всего, не будут замечены решениями для мониторинга сети.

Заключение

Мы рассмотрели технические приёмы, которые кибершпионские программы группировки Earth Baku используют для скрытия своего присутствия в инфраструктуре атакованных организаций.

Изучение кода загрузчиков и полезных нагрузок, использованных преступниками, показало, что набор технических приёмов становится всё более сложным, а сами программы — всё более изощрёнными. Это явным образом указывает на то, что в составе группировки есть как минимум один человек, знакомый с инструментами и методами, используемыми пентестерами (red teams).  Использование группой бэкдора ScrambleCross свидетельствует, что среди членов группы есть как минимум один человек, который обладает глубокими знаниями в области низкоуровневого программирования и разработки сложного программного обеспечения.

Для эффективной защиты от подобных кибератак необходима реализация комплеса мер, среди которых в обязательном порядке должны быть следующие:

  • управление обновлениями систем, оборудования и ПО;
  • принцип наименьших привилегий;
  • разграничение доступа к информации;
  • резервное копирование по правилу 3-2-1: минимум три копии в двух разных форматах, одна из которых вне офиса.

Предприятия и государственные учреждения могут воспользоваться преимуществами передовых решений, которые позволяют проактивно защищать ИТ-среды от широкого спектра угроз кибербезопасности. Например, Trend Micro™ XDR эффективно защищает подключённую электронную почту, конечные точки, серверы, облачные рабочие нагрузки и сети, используя мощный искусственный интеллект и экспертную аналитику безопасности для корреляции данных и предоставления меньшего количества более точных предупреждений для раннего обнаружения угроз.

Больше интересного материала на cisoclub.ru. Подписывайтесь на нас: Facebook | VK | Twitter | Instagram | Telegram | Дзен | Мессенджер | ICQ New | YouTube | Pulse.