В июле 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.
1 2 3 4 5 6 7 8 9 |
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
Loki: новый приватный агент для популярного фреймворка Mythic