В июле 2024 года мы обнаружили ранее неизвестный бэкдор Loki, который был использован в ряде целевых атак. Изучив вредоносный файл и открытые источники, мы выяснили, что Loki является приватной версией агента для фреймворка с открытым исходным кодом Mythic.
Наши решения детектируют эту угрозу как Backdoor.Win64.MLoki, чтобы отличать ее от других одноименных семейств зловредов, таких как Loki Bot, Loki Locker и т. д.
Оглавление
Mythic Framework
В 2018 году разработчик Коди Томас (Cody Thomas) создал собственный фреймворк Apfell с открытым исходным кодом для постэксплуатации скомпрометированных macOS-систем. Два года спустя к его проекту присоединилось несколько разработчиков, фреймворк стал кроссплатформенным и был переименован в Mythic. Основной проблемой существующих на тот момент фреймворков было неудобство создания различных агентов (клиентов), а также отсутствие единого интерфейса управления ими и поддержки модульности. Преимущество Mythic заключалось в том, что этот фреймворк позволяет использовать агенты на любом языке, созданные под любую платформу с необходимой разработчику функциональностью. На момент написания статьи в официальном репозитории Mythic опубликовано порядка двух десятков агентов.
Технические детали
Обнаруженный нами агент Loki является совместимой с Mythic версией агента для другого фреймворка, Havoc. Модификация Loki унаследовала от Havoc различные техники для усложнения анализа агента, такие как шифрование своего образа в памяти, непрямой вызов системных функций API, поиск функций API по хэшам и другие. Но в отличие от агента для Havoc Loki был разделен на загрузчик и DLL, в которой реализована основная функциональность зловреда.
Обе версии агента используют алгоритм хэширования djb2 для сокрытия API-функций и команд, однако в версии для Mythic он был также немного изменен. Если в агенте для Havoc использовалось оригинальное магическое число Дэниеля Бернштейна 5381, то в Loki его заменили на 2231.
unsigned long
hash(unsigned char *str)
{
unsigned long hash = 2231;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
Функциональность загрузчика
После запуска загрузчик Loki формирует пакет, содержащий информацию о зараженной системе, такую как версия операционной системы, внутренний IP-адрес, имя пользователя, архитектура процессора, путь к текущему процессу и его ID, и отправляет его в зашифрованном виде на командный сервер https://y[.]nsitelecom[.]ru/certcenter. В ответ сервер отправляет DLL, которую загрузчик помещает в память зараженного устройства, — обработка команд и дальнейшая коммуникация с C2 происходят в этой библиотеке. Далее мы рассмотрим две версии загрузчика, активность которых наблюдалась в мае и июле.
Майская версия загрузчика
MD5
375CFE475725CAA89EDF6D40ACD7BE70
SHA1
8326B2B0569305254A8CE9F186863E09605667E7
SHA256
81801823C6787B737019F3BD9BD53F15B1D09444F0FE95FAD9B568F82CC7A68D
Время компоновки
13:50 23.05.2024
Компилятор
GNU Binutils 2.31
Тип файла
Исполняемый файл Windows x64
Размер файла
92328 байт
Имя файла
смета_27.05.2024.exe
Июльская версия загрузчика
MD5
46505707991E856049215A09BF403701
SHA1
21CDDE4F6916F7E4765A377F6F40A82904A05431
SHA256
FF605DF63FFE6D7123AD67E96F3BC698E50AC5B982750F77BBC75DA8007625BB
Время компоновки
11:23 25.07.2024
Компилятор
GNU Binutils 2.31
Тип файла
Исполняемый файл Windows x64
Размер файла
92672 байта
Имя файла
winit.exe
Версия загрузчика, активность которой наблюдалась в мае, несколько отличается от июльского образца. Так, например, в более ранней версии используется протокол protobuf для сериализации данных, а новая частично повторяет принцип работы агента Ceos.
Обе версии используют одни и те же алгоритмы для шифрования данных: сначала собранная информация шифруется алгоритмом AES, затем кодируется при помощи base64. При этом старая версия вместе с зашифрованными данными отправляет 36-символьный UUID в открытом виде, а новая — кодирует его посредством base64.
UUID уникален для каждого экземпляра зловреда. Изученный майский образец использовал идентификатор
86cd8a56-1657-42ce-a0e8-587bf8144c05, а июльский — 472719a8-e1ce-4a5c-9ab2-bb4d1139ae33.
В результате первого запроса к C2 сервер отдает полезную нагрузку в виде DLL с двумя экспортируемыми функциями: стандартной точкой входа DllMain и функцией Start, которую загрузчик вызывает для передачи дальнейшего управления в библиотеку.
Функциональность основного модуля
На момент обнаружения скачать полезную нагрузку с указанного выше сервера было уже невозможно, но в результате детального анализа мы смогли найти около 15 других версий загрузчика и два действующих командных сервера и в конечном итоге получили образец основного модуля для майской версии.
MD5
EB7886DDC6D28D174636622648D8E9E0
SHA1
98CFFA5906ADB7BBBB9A6AA7C0BF18587697CF10
SHA256
AA544118DEB7CB64DED9FDD9455A277D0608C6985E45152A3CBB7422BD9DC916
Время компоновки
12:00 03.05.2024
Компилятор
GNU Binutils 2.31
Тип файла
Исполняемый файл Windows x64
Размер файла
167424 байта
Имя файла
stagger_1.1.dll
Главный модуль, так же как и загрузчик, основан на версии агента для Havoc, но список поддерживаемых команд частично заимствован из других агентов Mythic. Этот список не хранится в открытом виде в DLL, вместо этого в коде библиотеки указан ряд хэшей. Когда с сервера поступает команда, для ее названия обсчитывается хэш, который затем сверяется с хэшем из DLL.
Хэш
Название команды
Описание
0x00251B5E
cd
Изменить текущую директорию
0x36D4696F
kill-process
Завершить указанный процесс
0x03A9CB57
create-process
Создать процесс
0x04C8848E
bof
Запустить Beacon Object File
0x04C89140
env
Вывести список переменных окружения и их значения
0x04C8C122
pwd
Показать текущую директорию
0x5A2DE070
sleep
Изменить интервал между запросами к C2
0x5A41B798
token
Управлять маркерами доступа Windows
0x7BD1668F
download
Отправить файл с зараженной машины на сервер
0x88BD45B4
inject
Внедрить код, переданный с командой, в уже запущенный процесс
0x9DDAE271
exit
Завершить процесс агента
0xA4E0A13C
upload
Отправить файл с сервера на зараженную машину
Инструменты для туннелирования трафика
Сам по себе агент не поддерживает туннелирование трафика, поэтому для доступа к частным сегментам сети злоумышленники применяли сторонние общедоступные утилиты. Совместно с Loki использовалась утилита ngrok в директории с загрузчиком агента. В других случаях были обнаружены экземпляры утилиты gTunnel, запущенной в контексте системных процессов svchost.exe и runtimebroker.exe. Примечательно, что, в отличие от ngrok, она была модифицирована с помощью goReflect таким образом, чтобы загружаться и выполняться в памяти, а не с диска.
Жертвы и распространение
С угрозой столкнулись более десятка российских компаний из различных сфер деятельности — от машиностроения до медицины. При этом мы полагаем, что число потенциальных жертв выше. По данным телеметрии и названиям файлов, в которых был обнаружен зловред, вроде «смета_27.05.2024.exe», «На_согласование_публикации_<предприятие>.rar», «ПЕРЕЧЕНЬ_ДОКУМЕНТОВ.ISO» и т. д. можно предположить, что в ряде случаев Loki попадает на компьютер жертвы через электронную почту, а затем невнимательный пользователь сам запускает его.
Атрибуция
На момент исследования данных о зловреде недостаточно, чтобы приписать Loki какой-либо известной группе. Вместо стандартных шаблонов электронных писем для распространения агента злоумышленники, вероятно, используют индивидуальный подход к своим целям. Также мы не заметили уникальных инструментов на зараженных машинах, которые могли бы помочь установить атрибуцию. Приоритет отдается только общедоступным утилитам для туннелирования трафика, таким как gTunnel и ngrok, и инструменту goReflect для их модификации.
Заключение
Популярность открытых фреймворков для постэксплуатации растет. Несмотря на то, что это в первую очередь полезный инструмент для усиления защиты инфраструктуры, злоумышленники все чаще активно тестируют и применяют различные фреймворки для удаленного управления устройствами жертв, а также переделывают их под свои нужды, в том числе и с целью затруднения обнаружения и атрибуции.
Индикаторы компрометации
Июльская версия загрузчика
46505707991e856049215a09bf403701
Майская версия загрузчика
f0b6e7c0f0829134fe73875fadf3942f
796bdba64736a0bd6d2aafe773acba52
5ec03e03b908bf76c0bae7ec96a2ba83
0632799171501fbeeba57f079ea22735
97357d0f1bf2e4f7777528d78ffeb46e
f2132a3e82c2069eb5d949e2f1f50c94
7f85e956fc69e6f76f72eeaf98aca731
375cfe475725caa89edf6d40acd7be70
dff5fa75d190dde0f1bd22651f8d884d
05119e5ffceb21e3b447df49b52ab608
724c8e3fc74dde15ccd6441db460c4e4
834f7e48aa21c18c0f6e5285af55b607
e8b110b51f45f2d64af6619379aeef62
Основной модуль
eb7886ddc6d28d174636622648d8e9e0
gTunnel
1178e7ff9d4adfe48064c507a299a628
dd8445e9b7daced487243ecba2a5d7a8
ngrok
4afad607f9422da6871d7d931fe63402
Адреса C2:
http://y[.]nsitelecom[.]ru/certcenter
http://document[.]info-cloud[.]ru/data
http://ui[.]telecomz[.]ru/data
Securelist