Earth Baku: как работают профессионалы кибершпионажа

В конце 2020 года мы зафиксировали новую кибершпионскую кампанию группировки Earth Baku, более известную как APT41. Атаки были направлены против различных организаций в странах Индо-Тихоокеанского региона. Как и в других кампаниях, Earth Baku использовала высококлассный инструментарий собственной разработки. В этом посте мы расскажем об этой кампании, а также о том, как Earth Baku развивала свои вредоносные инструменты для атак.

Коротко о деятельности Earth Baku

С деятельностью этой группировки мы уже сталкивались в 2018–2020 годах. APT41 «отметилась» во множестве киберинцидентов, в которых использовались waterfall-атаки и фишинг. Основными целями атак были фармацевтические и телекоммуникационные компании. 

Таймлайн кампаний и инструментов Earth Baku. Источник здесь и далее: Trend MicroТаймлайн кампаний и инструментов Earth Baku. Источник здесь и далее: Trend Micro

В конце 2020 года мы обнаружили новый загрузчик, предназначенный для выполнения произвольного кода с функцией скрытого режима. С тех пор мы нашли несколько вариантов этого загрузчика, который назвали StealthVector и, кроме того, загрузчик шелл-кода, написанный на C#, получивший название StealthMutant.

Эти загрузчики кода имеют две разные полезные нагрузки: маяк Cobalt Strike и недавно найденный модульный бэкдор ScrambleCross. Их анализ показал, что преступники, стоящие за этой кампанией, связаны с Earth Baku/APT41. 

Министерством юстиции США в августе 2020 года обвинило эту группу в преступлениях, связанных с проникновением в сети компаний, кражей данных, вымогательством и нелегальным майнингом криптовалюты.

Новая кампания Earth Baku, которая действует по крайней мере с июля 2020 года, связана с предыдущей кампанией, о которой сообщили Positive Technologies и Fireeye. В ней использовался другой загрузчик шелл-кода, который мы назвали LavagokLdr. Однако, поскольку группа полностью обновила свой набор инструментов, мы считаем эту атаку совершенно новой кампанией.

Кампания направлена на страны Индо-Тихоокеанского региона — Индию, Индонезию, Малайзию, Филиппины, Тайвань и Вьетнам. APT41 атакуют как предприятия, так и государственные структуры, включая организации в сфере авиаперевозок, компьютерной техники, автомобилестроения, инфраструктуры, издательского дела, СМИ и ИТ-индустрии. Многие страны, затронутые этой кампанией, значились и вышеупомянутом обвинительном заключении Минюста США в отношении Earth Baku.

В последней кампании Earth Baku использовали несколько векторов атак:  

  • SQL-инъекцию в веб-приложениях жертвы;

  • атаки сервера MS Exchange через уязвимость ProxyLogon;

  • атаки через LNK-файлы в электронной почте;

  • запуск c помощью InstallUtil в планировщике Windows. 

Рассмотрим эти векторы немного подробнее.

SQL-инъекция в веб-приложениях

Для загрузки вредоносного файла злоумышленники использовали sqlmap, инструмент для пентеста MS SQL Server на основе Python.

Схема атаки через SQL-инъекциюСхема атаки через SQL-инъекцию

Используя скрипт для sqlmap, преступники загружали на компьютер жертвы VBS-файл. 

Скрипт для sqlmapСкрипт для sqlmap

Скрипт декодирует VBS-файл из Base64-кодировки, сохраняет его на компьютер жертвы и запускает. 

VBS-файл, созданный на компьютере жертвыVBS-файл, созданный на компьютере жертвы

Этот VBS загружает закодированный в Base64 файл с сервера APT41 и декодирует его в файл install.bat в папке пользователя. 

Файл install.bat устанавливает StealthVector в качестве службы WindowsФайл install.bat устанавливает StealthVector в качестве службы Windows

Эксплуатация ProxyLogon

В этом варианте атаки участники Earth Baku проникали на сервер, используя уязвимость CVE-2021–26855 (ProxyLogon) в MS Exchange Server. Затем они разворачивали на сервере веб-оболочку China Chopper, после чего с её помощью загружали и устанавливали StealthVector. 

Атака Earth Baku с использованием уязвимости ProxyLogonАтака Earth Baku с использованием уязвимости ProxyLogon

Мы считаем, что APT41 и другие группировки будут продолжать использовать эксплойт для ProxyLogon, пока предприятия и организации не установят патчи для этой уязвимости.

Вредоносные письма с LNK-файлом

После дальнейшего исследования на VirusTotal мы обнаружили, что EarthBaku пытались распространить StealthVector через LNK-файлы, отправленные как вложения в электронную почту.

Цепочка атаки с LNK-файломЦепочка атаки с LNK-файлом

LNK-файл переименовывает CertUtil.exe, легитимную утилиту Microsoft, после чего использует переименованный инструмент для загрузки документа-обманки и StealthVector. Однако мы никогда не видели этот тип вектора заражения в «дикой» природе.

Команды из LNK-файлаКоманды из LNK-файла

InstallUtil в планировщике

StealthMutant, в свою очередь, выполняется с помощью другого механизма. Хотя мы до сих пор не уверены в том, как именно злоумышленники получают доступ к системе, мы обнаружили, что StealthMutant выполняется программой InstallUtil.exe через запланированную задачу.

Запуск StealthMutant с помощью InstallUtil.exeЗапуск StealthMutant с помощью InstallUtil.exe

InstallUtil.exe — легитимное приложение-установщик под Microsoft .NET Framework, но он также известен как двоичный файл live-off-the-land (LOLBin), который используется в прокси-исполнении программ .NET Framework. В запланированном задании InstallUtil.exe регистрируется для запуска StealthMutant.

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

В кампании Earth Baku использовались два загрузчика, о которых говорилось выше: StealthMutant и StealthVector. Рассмотрим их более подробно. 

StealthMutant

StealthMutant — стелс-загрузчик шеллкода, написанный на C#, который используется по крайней мере с июля 2020 года. Он читает файл, зашифрованный AES-256-ECB, расшифровывает его в памяти, внедряет свою вредоносную полезную нагрузку в удалённый процесс, а затем выполняет его.

По нашим наблюдениям, в качестве полезной нагрузки используется агент Cobalt Strike или бэкдор ScrambleCross. Большинство образцов StealthMutant, с которыми мы столкнулись, обфусцированы ConfuserEx — обфускатором с открытым исходным кодом для приложений .NET Framework. 

После деобфускации этих образцов мы обнаружили необработанные пространства имён и классы, которые описывают их назначение.

Пространство имён и классы из деобфусцированного образцаПространство имён и классы из деобфусцированного образца

Расшифрованные строки выглядят следующим образом:

1) класс MagicString предоставляет свойство getter, которое расшифровывает строки при доступе;  

2) класс MagicString имеет поле, содержащее зашифрованную строку;

3) класс MagicString предоставляет __Decrypt, метод-обёртку для расшифровки;  

4) если StealthMutant впервые использует метод __Decrypt, то AES-ключ и вектор инициализации (IV) будут инициализированы на основе жёстко закодированного значения __factory, хотя этот IV не имеет смысла в режиме ECB. Ключ представляет собой хэш SHA-256, а IV — хэш MD5. Значения хэшей SHA-256 и MD5 отличаются для каждого образца StealthMutant;  

5) метод __Decrypt вызывает метод Crypto.DecryptData;

6) метод Crypto.DecryptData расшифровывает заданные данные жёстко закодированным режимом или, в данном случае, режимом ECB.

Расшифрованные строки StealthMutantРасшифрованные строки StealthMutant

Основная цель StealthMutant — выполнение второго этапа шеллкода в скрытом режиме. Для этого StealthMutant патчит API функции EtwEventWrite, чтобы отключить Event Tracing for Windows (ETW). Это делает его невидимым для встроенной системы журналирования Windows.

StealthMutant поддерживает как 32-битную, так и 64-битную архитектуру. В методе DoPatch StealthMutant определяет архитектуру динамически. Если он работает на 32-битной ОС, EtwEventWrite патчится с помощью инструкций «C2 14 00 (ret 0×14)», в то время как в 64-битной системе патч выглядит как »48 31 C0 C3 (xor rax,  rax;  ret)».

Архитектурно-зависимые патчи в StealthMutantАрхитектурно-зависимые патчи в StealthMutant

Имена файлов зашифрованной полезной нагрузки вшиты в код, но отличаются для каждого образца StealthMutant. Строка имени файла также шифруется с использованием AES-256-ECB. Если целевой зашифрованный файл существует в текущем каталоге, StealthMutant считывает и расшифровывает его в памяти.

Большинство образцов StealthMutant используют для расшифровки алгоритм AES-256-ECB, в то время как ранние версии обходились простым XOR. Однако мы с июля 2020 года не встречали эти разновидности StealthMutant.

Старая версия StealthMutant, в которой используется XORСтарая версия StealthMutant, в которой используется XOR

Варианты StealthMutant, использующие AES-256-ECB и XOR, имеют одинаковые шаги расшифровки. Образцы StealthMutant, использующие AES, имеют зашифрованный файл, содержащий мусорные байты, подпись, семя (seed) ключа шифрования, семя вектора инициализации IV и зашифрованное тело полезной нагрузки. Размеры этих полей различны для разных вариантов вредоноса.  Приведём алгоритм расшифровки одного из образцов StealthMutant, который содержит 128 мусорных байт, имеет длину семян ключа и IV в 12 байт:  

1) вычислить MD5-хэш зашифрованного тела полезной нагрузки — тело состоит из семени ключа (key seed), семени IV (IV seed) и зашифрованной полезной нагрузки;  

2) сравнить MD5-хэш с подписью в зашифрованном файле, чтобы проверить его целостность;  

3) скопировать указанное количество байтов после подписи, а затем вычислить хэш SHA-256 для ключа AES;

4) скопировать указанное количество байтов, следующее за семенем ключа, а затем вычислитm хэш MD5 для AES IV, хотя это и бессмысленно в режиме ECB;  

5) расшифровать оставшиеся байты с помощью AES-256-ECB со сгенерированным ключом SHA-256;  

6) сравнить длину в верхней части расшифрованных байтов с жёстко закодированным значением в поле Protocol.Flag;  

7) если StealthMutant прошёл все эти проверки, прочитать размер полезной нагрузки.

Алгоритм расшифровки StealthMutantАлгоритм расшифровки StealthMutant

После расшифровки полезной нагрузки StealthMutant выполняет её в удалённом процессе с использованием техники внедрения. Эта техника содержит следующие шаги:  

1) создаётся процесс в приостановленном режиме (CREATE_SUSPENDED);  

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

3) раздел отображается на удалённый процесс, что также приводит к отображению шеллкода;

4) ищется и патчится точка входа удалённого приостановленного процесса, чтобы изменить поток выполнения на точку входа отображённой полезной нагрузки;

5) основной поток приостановленного процесса возобновляется и выполняет полезную нагрузку.

Внедрение в процесс полезной нагрузкиВнедрение в процесс полезной нагрузки

Эта техника широко используется в качестве инструмента red-team в C#. Мы предполагаем, что автор StealthMutant использовал реализацию встраивания в процесс, опубликованную на GitHub.

StealthVector

В октябре 2020 года мы обнаружили StealthVector, стелс-загрузчик шеллкода, написанный на C/C++. Это вредоносное ПО реализует различные техники маскировки и продолжает активно разрабатываться. По нашим наблюдениям, его полезной нагрузкой является либо агент Cobalt Strike, либо вредоносная программа ScrambleCross. 

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

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

Расшифровка конфигурации StealthVectorРасшифровка конфигурации StealthVectorЗашифрованная конфигурация StealthVector и информация о ключе ChaCha20Зашифрованная конфигурация StealthVector и информация о ключе ChaCha20 Фиксированное значение счётчика в функции ChaCha20Фиксированное значение счётчика в функции ChaCha20

Согласно RFC7539, определяющей спецификацию потокового шифра ChaCha20 и аутентификатора Poly1305, алгоритм ChaCha20 использует 32-битный начальный счётчик. Этот счётчик может быть любым числом, но обычно это 0 или 1. По нашим наблюдениям StealthVector всегда использует для начального счётчика 0×13, что является необычной практикой. Это затрудняет расшифровку конфигурации вредоносной программы помощью обычных методов, таких как библиотека Python pycryptodome, которая не поддерживает пользовательские начальные счётчики.

Расшифрованные данные конфигурации копируются в выделенный буфер. Встречаются два типа конфигураций. Один используется для локального запуска шеллкода и имеет размер 0×38 байт. Этот тип конфигурации содержит поля для контрольной суммы, флаги контекста, флаги для скрытия, и информацию для полезной нагрузки.

Конфигурация, которая загружает зашифрованную полезную нагрузку из двоичного файла StealthVectorКонфигурация, которая загружает зашифрованную полезную нагрузку из двоичного файла StealthVectorКонфигурация, которая загружает зашифрованную полезную нагрузку из внешнего файлаКонфигурация, которая загружает зашифрованную полезную нагрузку из внешнего файла

Второй тип конфигурации для удалённого инжектора шеллкода имеет длину 0×44 байта. Здесь содержатся поля для контрольной суммы, флаги контекста, флаги для скрытия, информация для инъекции и информация для полезной нагрузки.

Конфигурация, которая загружает зашифрованную полезную нагрузку из внешнего файла без внедрения в процессКонфигурация, которая загружает зашифрованную полезную нагрузку из внешнего файла без внедрения в процессКонфигурация, которая загружает зашифрованную полезную нагрузку из внешнего файла и выполняет внедрение в процессКонфигурация, которая загружает зашифрованную полезную нагрузку из внешнего файла и выполняет внедрение в процесс

Выводы и рекомендации

Мы рассмотрели лишь небольшую часть технических особенностей свежей кибершпионской кампании Earth Baku. Больше подробностей содержится в нашем новом исследовании Earth Baku: An APT Group Targeting Indo-Pacific Countries With New Stealth Loaders and Backdoor.

Новые версии вредоносного ПО демонстрируют, что Earth Baku состоит из участников с разнообразными навыками. Использование группой загрузчиков StealthMutant и StealthVector показывает, что в её рядах есть как минимум один человек, знакомый с инструментами и методами, используемыми «красными командами» (red team). Использование группой бэкдора ScrambleCross свидетельствует, что среди членов группы есть как минимум один человек, который обладает глубокими знаниями в области низкоуровневого программирования и разработки сложного программного обеспечения.

Вот несколько мер, которые помогут защитить сети компаний от кибершпионажа и минимизировать риск компрометации данных:  

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

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

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

  • соблюдайте правило 3–2–1: храните как минимум три копии корпоративных данных в двух разных форматах, причём одну копию вне офиса, регулярно обновляйте и тестируйте эти копии, чтобы убедиться в отсутствии ошибок.

© Habrahabr.ru