Microcin снова в деле

С асинхронными сокетами, стеганографией, историей про найм в GitLab и просто носком в стиральной машине.

В феврале 2020 года мы обнаружили троянца, внедренного в память системного процесса на машине жертвы. Как оказалось, целью атаки была дипломатическая организация. В первую очередь наше внимание привлекли архитектура зловреда и асинхронная работа с сокетами в нем. На этот раз функция в сетевом модуле и ее взаимодействие с загрузчиком похожи на нормальный API. Такой подход в мире вредоносного ПО встречается нечасто и обычно используется APT-группами высокого уровня.

Благодаря повторному использованию командного сервера (арендованного у Choopa VPS service), методам профилирования зараженной системы и схожести программного кода мы с высокой степенью уверенности приписываем эту кампанию группе SixLittleMonkeys (также известной как Microcin). C другой стороны, ранее эта группа не использовала упомянутые выше стиль программирования и архитектуру. В ходе анализа мы не обнаружили схожих инструментов с открытым исходным кодом; похоже, что злоумышленники разработали этот троянец самостоятельно.

Для доставки нового сетевого модуля, архитектура которого напоминает нормальные коммерческие корпоративные приложения, группа Microcin использовала стеганографию в фотографиях, в частности в этом фото носка

Сфера интересов группы SixLittleMonkeys остается прежней – шпионаж за дипломатическими организациями. Она продолжает использовать стеганографию для доставки данных конфигурации и дополнительных модулей – на этот раз с легитимного публичного хостинга изображений cloudinary.com. Среди прочих изображений можно выделить одно, связанное с нашумевшим запретом GitLab на наем граждан России и Китая. С точки зрения программирования схожая с API архитектура модулей и асинхронная работа с сокетами являются для этой группы прогрессом.

Почему нас заинтересовала эта новая программная архитектура

Под «схожей с API для нормальных корпоративных приложений» мы, во-первых, подразумеваем асинхронную работу с сокетами. С точки зрения объектов пользовательского пространства Windows — это порты завершения ввода-вывода (I/O completion ports). В пространстве ядра ОС им соответствует очередь асинхронного вызова процедур (APC). По нашему мнению, в первую очередь этот механизм используется в бэкэнд-приложениях на высоконагруженных серверах. Однако троянские программы подобного рода не нуждаются в подобном уровне программирования. Мы полагаем, что разработчики зловреда обладают некоторым опытом программирования серверных приложений и пользовались привычным для себя стилем при написании кода.

Во-вторых, расскажем подробнее о параметрах экспортируемой функции внедряемой сетевой библиотеки, напоминающей API. Указатели на две вызываемые функции (колбэки для шифровальщика/дешифратора и логгера) передаются в качестве  аргументов. Соответственно, если авторы решат изменить алгоритмы шифрования или логирования, это можно легко сделать, переписав всего одну функцию в модуле-инжекторе и вообще никак не затрагивая сетевой модуль, по коду которого рассыпано множество вызовов этих колбэков. Еще раз отметим, что даже во вредоносных образцах, разработанных специально для целевых атак, нечасто принимаются во внимание такие архитектурные особенности.

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

Начальное заражение

Описание модуля Имя файла Время обнаружения
Дешифратор загрузчика, загружаемый легитимным приложением GoogleCrashHandler version.dll 31.12.2019
Загрузчик/дешифратор изображения в адресном пространстве spoolsv.exe spoolsv.dll 16.01.2020
Bitmap-изображение, содержащее стеганографию Случайное имя bmp-файла 16.01.2020
Сетевой модуль из изображения в том же адресном пространстве spoolsv.exe Module.dll 16.01.2020

Хронология заражения

Начальный модуль-дешифровщик загрузчика (version.dll) загружается в память легитимным файлом GoogleCrashHandler.exe – используется метод перехвата порядка поиска DLL. На последнем шаге расшифрованный из Bitmap-файлов сетевой модуль внедряется в системный процесс.

Рассмотрим используемые модули последовательно. Согласно данным нашей телеметрии, другой бэкдор группы Microcin уже присутствовал на хосте до внедрения нового сетевого модуля. Весьма вероятно, что имело место повторное заражение обновленным вредоносным ПО.

MD5 образца Имя файла Метка времени компиляции Размер
c9b7acb2f7caf88d14c9a670ebb18c62 version.dll 20.05.2020, 02:37:58 407552

DLL-библиотека, упакованная с помощью UPX, была загружена с помощью легитимного приложения GoogleCrashHandler.exe в канун старого Нового года – метка времени компиляции, очевидно, была подменена – с использованием широко распространенной тактики перехвата порядка поиска библиотек (DLL search order hijacking).

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

Загрузчик/дешифратор

Процесс spoolsv.exe загружает в свое адресное пространство 64-разрядный модуль загрузчик/дешифратор spoolsv.dll.

MD5 загрузчика/дешифратора Время изменения Размер Сборка Целевой ID
c7e11bec874a088a088b677aaa1175a1 04.03.2020, 12:20:13 155291 20200304L02f @TNozi96
ef9c82c481203ada31867c43825baff4 15.10.2019, 11:46:04 145233 20200120L03o @TNozi96
1169abdf350b138f8243498db8d3451e 25.01.2019, 04:58:15 150195 20191119L 123456

На текущий момент мы обнаружили три образца этого модуля. В конце файлов содержатся следующие зашифрованные данные конфигурации:

Параметр Длина (в байтах) Возможные значения
Длина URL Bitmap-изображения 4 82
URL Bitmap-изображения Длина URL Bitmap-изображения http://res.cloudinary.com/ded1p1ozv/image/upload/v1579489581/<случайное_имя>.bmp
Таймер сна, антисэндбоксинг 2 17211 и другие некруглые случайные значения
Длина даты сборки модуля 4 15
Дата сборки модуля Длина даты сборки модуля Дата на основе предыдущей таблицы
Длина целевого ID 4 9
Целевой ID Длина ID цели Строки простого текста из предыдущей таблицы
Случайные символы ASCII 16 Случайно генерируется на хосте
Жестко прописанный предохранитель (canary) 4 0x5D3A48B6

Мы опубликовали исходный код нашего дешифратора данных конфигурации и стеганографии группы Microcin на странице https://github.com/dlegezo/common

URL Bitmap-файла (такого, например, как фото носка выше) используется для загрузки этого изображения с зашифрованным троянцем внутри. Из перечисленных выше параметров дата сборки модуля (вероятно используется в качестве его версии), ID цели и случайные символы ASCII нужны троянцу на следующем этапе заражения. Он использует их для взаимодействия с командным сервером.

Для получения Bitmap-файла загрузчик отправляет HTTP GET запрос на сайт cloudinary.com. Стеганография применена в части файла .bmp, отвечающей за цветовую палитру. Кастомный алгоритм расшифровки включает в себя четыре этапа:

  1. Объединение половинок соседних байтов в один;
  2. Расшифровка длины блока данных кастомным алгоритмом на базе операции XOR;
  3. Расшифровка 6-байтового XOR-ключа для основного массива данных;
  4. Расшифровка самих данных с использованием расшифрованной длины и ключа.

Схожий алгоритм расшифровывает не только конфигурационные данных и картинки, но и трафик командного сервера. Как уже говорилось, благодаря особенностям архитектуры вредоносного ПО этот алгоритм можно легко изменить. Шифрование основано на XOR, как это часто бывает, но развертывание ключа организовано достаточно необычно. В приложении мы приводим часть дешифратора, которая содержит алгоритм. Полностью его исходники можно увидеть здесь https://github.com/dlegezo/common

Растровые изображения и стеганография

Помимо изображения носка, операторы кампании используют и более социально ориентированные фотографии. В качестве фона используется запрет GitLab на наем граждан России и Китая.

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

Содержимое изображения Домен командного сервера MD5 сетевого модуля
Носок в стиральной машине apps.uzdarakchi.com 445b78b750279c8059b5e966b628950e
Двое в толстовках forum.mediaok.info 06fd6b47b1413e37b0c0baf55f885525
Запрет GitLab на наем сотрудников forum.uzdarakchi.com 06fd6b47b1413e37b0c0baf55f885525
Женщина с ребенком и военные owa.obokay.com 06fd6b47b1413e37b0c0baf55f885525

Внедренный в память троянец

Наконец, загрузчик расшифровывает данные из BMP-файла, и все готово к последнему этапу заражения. Троянец, соответственно, внедряется в то же виртуальное адресное пространство spoolsv.exe. Вот мы и добрались до модуля, представляющего, по нашему мнению, наибольший интерес во всей цепочке заражения.

Входной точкой сетевого модуля является экспортируемая функция SystemFunction000() с аргументами, перечисленными в таблице ниже. В качестве сигнального сообщения серверу троянец подготавливает запрос HTTP POST с цифровым отпечатком целевой системы. Многие аргументы функции включаются в запрос в качестве параметров.

Аргумент экспортируемой функции Значение параметра
Имя целевого хоста Имя должно совпадать с именем хоста зараженного компьютера. Только в этом случае троянец запустится и будет получать команды. Инициализируется загрузчиком.
Целевой ID Мы уже приводили эти простые ASCII-строки из расшифрованной конфигурации загрузчика, в частности @TNozi96.
Версия сборки В этих строках в кодировке ASCII явно просматриваются даты. Данный параметр позволяет командному серверу определить, с какой сборкой троянца он работает в текущий момент.
Поле WORD структуры цифрового отпечатка Инициализируется загрузчиком с содержимым 0x4004. У нас недостаточно данных для описания смысла этого поля.
IP-адрес и номер порта командного сервера Координаты командного сервера, инициализируемые из расшифрованного Bitmap-файла.
Строка ASCII в структуре цифрового отпечатка Уникальная случайная строка, генерируемая загрузчиком.
Значение для вычисления времени сна Время сна вычисляется по формуле <данный аргумент> + <случайное_число>%<данный аргумент>. Таким образом значение находится в пределах от половины до полного времени сна
Адрес логгера Колбэк, адрес первой вызываемой функции. В данном случае это функция-логгер в загрузчике.
Адрес шифровальщика/дешифратора Колбэк, адрес второй вызываемой функции. В нашем случае это функция-шифровщик/дешифратор в загрузчике.

Два последних аргумента являются примером ранее упомянутых нами API-подобных функций: можно подключить любые процедуры шифрования и логирования без вмешательства в код модуля. Мы полагаем, что такой подход отличается лучшей масштабируемостью. Теперь рассмотрим эти две вызываемые функции.

Вызываемая функция и ее аргументы Назначение функции
Логгер принимает ASCII- строку как сообщение лога Параметром логгера выступает текст сообщения в журнале выполнения зловреда. В данном модуле все сообщения представляют собой сокращения типа LIOO, RDOE и т. п.
Шифровщик/дешифратор работает с трафиком между хостом и командным сервером и принимает в качестве аргументов данные, длину данных, ключ шифрования и флаг (0 – шифрование; 1 – дешифровка). Эта колбэк функция сначала используется для шифрования сигнального сообщения с цифровым отпечатком цели, а затем для дешифровки структур команд с командного сервера и шифрования ответов на них.

Троянец использует функцию Windows API WSAIoctl(), которая редко задействуется вредоносным ПО, для получения адреса ConnectEx() и отправляет подготовленный запрос. Другая функция Windows API GetQueuedCompletionStatus() отвечает за асинхронную работу операций ввода-вывода. Таким образом, вредоносная программа использует порты завершения ввода-вывода – объекты пользовательского режима , которые по существу являются очередью APC (асинхронного вызова процедур) в ядре ОС.

Одна и та же структура данных используется для коммуникаций в обоих направлениях: как от хоста к командному серверу, так и обратно. Охарактеризуем ее основные поля.

Поле Назначение
Код команды Один байт в структуре является кодом команды, который может варьироваться от 0x00 до 0x16 (22). Команды основного сетевого модуля описаны в отдельной таблице ниже.
Код ошибки Еще один байт используется как код ошибки.
Аргумент команды Основное поле команды, включающее все необходимые строки и другие параметры, а также хранящее данные цифрового отпечатка в случае сигнального сообщения.

Мы уже описали цепочку заражения, архитектуру модуля, кастомный алгоритм шифрования и протокол коммуникации с командным сервером на основе HTTP POST и в завершение приводим набор основных команд.

Код команды Назначение команды
3 Проверить соответствие ID цели параметру
4 Создать список логических дисков
5 Создать список файлов
6 Создать папку
7 Удалить папку
8 Копировать файл
9 Переместить файл
10 Удалить файл
11 Выполнить PE-файл
12 Выполнить shell-команду Windows
14 Завершить программу
15 Загрузить файл
16 Читать из загруженного файла
17 Выгрузить файл
18 Записать в файл
19 Стоп
20 Сон

Инфраструктура

Домен IP Первое обнаружение ASN
apps.uzdarakchi[.]com 95.179.136[.]10 11 ноября 2019 г. 20473
forum.uzdarakchi[.]com 172.107.95[.]246 7 февраля 2020 г. 40676
forum.mediaok[.]info 23.152.0[.]225 19 марта 2020 г. 8100
owa.obokay[.]com Н/Д (сейчас неактивен)

Заключение

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

Индикаторы компрометации

Загрузчик

ef9c82c481203ada31867c43825baff4
1169abdf350b138f8243498db8d3451e
c7e11bec874a088a088b677aaa1175a1

Сетевой модуль

f464b275ba90b3ba9d0a20b8e27879f5
9320180ef6ee8fa718e1ede01f348689
06fd6b47b1413e37b0c0baf55f885525
625a052ddc80efaab99efef70ba8c84f

Домены и IP-адреса

95.179.136.10
apps.uzdarakchi[.]com
forum.uzdarakchi[.]com
forum.mediaok[.]info
owa.obokay[.]com

 

Публикации на схожие темы

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *