Positive Technologies
PT Expert Security Center

Cobalt: обновление тактик и инструментов

Cobalt: обновление тактик и инструментов

Специалисты PT Expert Security Center отслеживают активность группы Cobalt с 2016 года. На сегодняшний день группа атакует финансовые организации по всему миру. Ущерб от этих атак уже год назад превышал 1 млрд рублей. За последние четыре года мы опубликовали несколько отчетов об атаках, связанных с данной группой.

В течение прошлого года группа Cobalt не только модифицировала свои основные инструменты CobInt и COM-DLL-дроппер в связке с JavaScript-бэкдором more_eggs, но и применяла новые способы доставки и новые техники для обхода средств защиты на начальном этапе атаки. Обновление тактик и инструментов может быть обусловлено тем, что группа уже долгое время находится под прицелом у исследователей со всего мира, и ей необходимо быть на шаг впереди, чтобы обходить средства защиты.

Рисунок 1. Количество атак Cobalt, зафиксированных специалистами PT ESC
Рисунок 1. Количество атак Cobalt, зафиксированных специалистами PT ESC

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

Если взглянуть на следующую гистограмму, то можно заметить, что к концу прошлого года группа начала отдавать предпочтение использованию CobInt.

Рисунок 2. Количество атак с использованием COM-DLL-дроппера и CobInt в 2019 году
Рисунок 2. Количество атак с использованием COM-DLL-дроппера и CobInt в 2019 году

Это может быть связано c детектированием трафика JavaScript-бэкдора more_eggs сетевыми сигнатурами ETPRO, в том числе и в публичных песочницах, в то время как срабатывания на трафик CobInt отсутствуют. К тому же CobInt загружает основную библиотеку с контрольного сервера сразу в память, а COM-DLL-дроппер сохраняет на диск обфусцированный more_eggs, который затем исполняется в памяти. Следовательно, COM-DLL-дроппер оставляет больше следов на зараженной машине.

1. Фишинговый сайт European Central Bank

В конце августа 2019 года, исследуя угрозы информационной безопасности, мы зафиксировали атаку с использованием CobInt. Атака, предположительно, была нацелена на европейские финансовые организации. У нас нет данных о том, насколько она была успешна. Дроппером для CobInt служил кастомный NSIS-installer. Мы обнаружили три версии такого дроппера: для Chrome, Firefox и Opera. Внутри каждого была одна и та же версия CobInt и соответствующий установщик для браузера. После запуска дроппер сохранял CobInt в папку %TEMP%, запускал его и установщик. Проанализировав ВПО мы выяснили, что распространение дропперов происходило с фишингового сайта ecb-european[.]eu.

Рисунок 3. Главная страница фишингового сайта
Рисунок 3. Главная страница фишингового сайта

Сайт являлся копией сайта Европейского центрального банка — за исключением того, что при его посещении пользователю показывалось всплывающее окно с просьбой обновить браузер.

Рисунок 4. Всплывающее окно на поддельном сайте ECB
Рисунок 4. Всплывающее окно на поддельном сайте ECB

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

Рисунок 5. Ссылка на вредоносный скрипт
Рисунок 5. Ссылка на вредоносный скрипт

В самом скрипте присутствуют конфигурационные строки. В них можно увидеть ссылки для четырех дропперов (первый нам получить не удалось), а также присутствует возможность сделать ссылки для браузеров Safari, Edge, Internet Explorer, указывается время начала показа окна после загрузки страницы, сколько раз показать окно для одного пользователя, тип устройства, на котором будет показано окно, какой баннер показывать пользователю. Кроме того, скрипт обнаруживает ботов, которые обходят страницы и индексируют и (или) скачивают содержимое.

Рисунок 6. Параметры вредоносного скрипта
Рисунок 6. Параметры вредоносного скрипта

Ниже представлены альтернативные окна, которые присутствуют в скрипте.

Рисунок 7. Альтернативное окно, задаваемое в параметрах скрипта
Рисунок 7. Альтернативное окно, задаваемое в параметрах скрипта
Рисунок 8. Альтернативное окно, задаваемое в параметрах скрипта
Рисунок 8. Альтернативное окно, задаваемое в параметрах скрипта

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

Данный фреймворк не является уникальным. Скорее всего, он был приобретен группой на одном из теневых форумов. Так, специалисты из Zscaler в ноябре 2019 года опубликовали статью о том, что похожим образом распространялся NetSupport RAT. Фреймфорк размещался на взломанных сайтах и при их посещении пользователям показывалось одно из всплывающих окон.

С сайта ecb-european[.]eu также распространялся вредоносный файл Login_Details.img, детальный разбор которого сделали коллеги из Group-IB.

2. Вредоносный VHD

В конце декабря 2019 года мы обнаружили очередной загрузчик CobInt группы Cobalt. Необычным был контейнер, в котором содержался данный загрузчик. Это был virtual hard disk (VHD), который, предположительно, рассылался по почте.

VHD-формат был создан компанией Connectix для их продукта Virtual PC, в 2003 году продукт был приобретен компанией Microsoft и стал называться Microsoft Virtual PC. В 2005 году формат стал общедоступным. VHD-формат используется с момента создания технологии виртуализации Hyper-V. VHD-файл может содержать все, что можно найти на обычном HDD: дисковые разделы, файловую систему с папками и файлами.

Начиная с Windows 7 пользователь может вручную подключить VHD, например через MMC-консоль. Начиная с Windows 8 пользователь может подключить VHD просто два раза кликнув на него мышкой, и он отобразится в системе как обычный диск.

В сентябре 2019 года в блоге CERT/CC вышла статья об опасности VHD-файлов и об использовании их как потенциального вектора в атаках . Will Dorman показал, что ни антивирусы, ни mark on the web не будут сигнализировать пользователю о том, что содержимое скачанного из интернета VHD-файла может нанести вред компьютеру. Исследователь создал вредоносный VHD-контейнер с EICAR внутри и загрузил его на VirusTotal, однако ни один антивирус не сработал. Низкое количество вердиктов или их отсутствие может быть связано с тем, что VHD является ключевым файлом при работе виртуальной машины в Hyper-V, и если он будет поврежден или заблокирован, виртуальная машина не запустится.

В документации, Microsoft рекомендует добавлять файлы формата VHD в исключения антивирусов, как это уже автоматически сделано в Windows Defender. Это нужно именно для того, чтобы не возникало ошибок в работе Hyper-V.

Не исключено, что результатами этого исследования воспользовалась группа Cobalt. Их VHD-файл также не детектировался антивирусами в момент его появления на VirusTotal. Спустя полгода этот файл детектируется всего одним антивирусом: это очень низкий показатель.

Рисунок 9. Уровень детектирования VHD группы Cobalt на момент атаки
Рисунок 9. Уровень детектирования VHD группы Cobalt на момент атаки

Внутри VHD находятся два файла CobInt. К концу одного из файлов прикреплены два невалидных сертификата Google для снижения вероятности обнаружения средствами защиты.

Рисунок 10. Сертификаты, прикрепленные к одному из файлов CobInt
Рисунок 10. Сертификаты, прикрепленные к одному из файлов CobInt

Поскольку VHD, по сути, представляет собой контейнер с файловой системой, в нем также можно искать различные артефакты. Например, в неразмеченном пространстве VHD-файла мы обнаружили изображение с текстом якобы от антифрод-системы банка HSBC.

Рисунок 11. Изображение в неразмеченном пространстве VHD
Рисунок 11. Изображение в неразмеченном пространстве VHD

Возможно данный артефакт был оставлен злоумышленниками случайно, когда они переразмечали пространство в контейнере: эта же картинка использовалась как иконка для CobInt и хранилась у них в ресурсах.

2.1. Анализ CobInt

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

Основная библиотека загружается CobInt с контрольного сервера в виде HTML-файла. В сравнении с алгоритмом, описанным компанией ProofPoint в 2018 году , есть некоторые изменения.

Рисунок 12. Пример обфускации основной библиотеки
Рисунок 12. Пример обфускации основной библиотеки

В начале удаляются все теги, их содержимое игнорируется.

Рисунок 13. Снятие тегов
Рисунок 13. Снятие тегов

На втором этапе обрабатываются символы точки, запятой и пробела. Все символы, стоящие после указанных, переводятся в верхний регистр (вычитается значение 0x20).

Рисунок 14. Удаление ненужных символов и перевод букв в верхний регистр
Рисунок 14. Удаление ненужных символов и перевод букв в верхний регистр

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

Рисунок 15. Первый уровень XOR
Рисунок 15. Первый уровень XOR

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

Данные после декодирования из Base64 показаны на рис. 16. Красным отмечена 4-байтная предустановка для первого дешифровщика, которая в неизменном виде будет и на втором этапе, а желтым остальные данные.

Рисунок 16. Данные после декодирования из Base64
Рисунок 16. Данные после декодирования из Base64

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

Рисунок 17. Данные после снятия первого уровня XOR
Рисунок 17. Данные после снятия первого уровня XOR

После второго дешифрования получаем валидный PE-файл (рис. 18). Назначение первых восьми байтов выяснить не удалось, в загрузчике они никак не используются.

Рисунок 18. Деобфусцированная библиотека
Рисунок 18. Деобфусцированная библиотека

2.2. Анализ основной библиотеки

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

Рисунок 19. Алгоритм генерации части адреса
Рисунок 19. Алгоритм генерации части адреса

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

2.3. Дешифрование плагинов

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

После первичного преобразования происходит декодирование полученных данных из алфавита a—z в символы 0x00—0xff. Для этого применяется ранее не встречавшаяся процедура декодирования, основанная на преобразовании входных значений в зависимости от текущего значения, предыдущего (в некоторых случаях) и значений глобального счетчика.

Рисунок 20. Алгоритм декодирования плагина
Рисунок 20. Алгоритм декодирования плагина

После декодирования происходят два цикла дешифрования.

Рисунок 21. Первый цикл дешифрования
Рисунок 21. Первый цикл дешифрования

Ключ для первого дешифрования находится в коде приложения, при этом он жестко зашит по смещению, которое принимает только два значения.

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

Рисунок 22. Пример XOR-ключа
Рисунок 22. Пример XOR-ключа

На последнем этапе происходит дешифрование с 4-байтным ключом, который также несложно получить путем анализа нулевых последовательностей PE-заголовка.

Рисунок 23. Ключ XOR в зашифрованных данных
Рисунок 23. Ключ XOR в зашифрованных данных

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

2.4. Дешифрование трафика

Собранные плагинами данные библиотека отправляет на сервер.

Пример трафика:

Рисунок 24. Закодированные данные от плагина
Рисунок 24. Закодированные данные от плагина

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

Далее полученные данные шифруются вшитым 64-байтным ключом, тем же, которым дешифровывалась библиотека. После этого на данные накладывается рассмотренная ранее кодировка, в начало добавляется знак = и сгенерированная последовательность из символов a—z длины от 8 до 16.

Пример декодированного и дешифрованного трафика, полученного из предыдущего пакета:

Рисунок 25. Декодированные данные
Рисунок 25. Декодированные данные

Функция создания и преобразования пакета:

Рисунок 26. Алгоритм создания пакета с данными
Рисунок 26. Алгоритм создания пакета с данными

3. BIFF-макрос

В марте 2020 года мы зафиксировали документ группы Cobalt в формате XLS, который скачивал и запускал COM-DLL-дроппер. Документ содержал в себе достаточно старый формат макроса Excel 4.0 и практически не определялся антивирусами (1 вердикт из 60 по данным сервиса VirusTotal).

Рисунок 27. Количество вердиктов антивируса при первой загрузке файла с макросом Excel 4.0 на VirusTotal
Рисунок 27. Количество вердиктов антивируса при первой загрузке файла с макросом Excel 4.0 на VirusTotal

Этому стандарту макросов уже 20 лет. Его особенность в том, что макрос не хранится в VBA-проекте, он расположен в ячейках страницы, при этом страница может быть скрыта в самом Excel. Это значит, что макрос будет не в VBA-стриме, а в BIFF-записи (Binary Interchange File Format).

Если открыть документ в Excel, то мы увидим лишь одну страницу и отсутствие макросов в VBA-проекте. Однако Excel все равно обнаружит наличие макроса и заблокирует его исполнение. Для того чтобы обнаружить макрос, можно использовать утилиту olevba3.py из набора oletools.

Рисунок 28. Результат выполнения olevba3.py
Рисунок 28. Результат выполнения olevba3.py

В результате выполнения мы видим, что одна из страниц документа имеет состояние very hidden и имеет тип Excel 4.0 macro. При таком состоянии страницы вы не только не увидите ее в интерфейсе Excel, но и никак не сможете ее сделать видимой через интерфейс. Сделать видимой ее поможет либо Visual Basic, либо ручное модифицирование байтов документа.

Чтобы распознать структуру BIFF в удобном представлении, можно использовать утилиту BiffView . Распарсив исходный документ, увидим, что одна из страниц с названием sygfdfdfdesie имеет аттрибут very hidden. В Hex-редакторе изменяем этот параметр либо на 1, либо на 0.

Рисунок 29. Структура страниц вредоносного документа
Рисунок 29. Структура страниц вредоносного документа

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

Рисунок 30. Формула макроса, которая запускается при открытии документа
Рисунок 30. Формула макроса, которая запускается при открытии документа

Начальная формула запускает большую цепочку команд СЦЕПИТЬ, ВЫПОЛНИТЬ, СИМВОЛ, ВЫЗВАТЬ, что в конечном итоге приведет к загрузке и запуску COM-DLL-дроппер. Вся цепочка команд разбросана по огромному полю ячеек страницы Excel, что затрудняет анализ.

Рисунок 31. Формулы макроса, приводящие к загрузке и запуску COM-DLL-дроппера
Рисунок 31. Формулы макроса, приводящие к загрузке и запуску COM-DLL-дроппера

4. Анализ COM-DLL-дроппера

В начале апреля 2020 года мы обнаружили новую версию COM-DLL-дроппера. По функциям он отличался от всех, что мы видели ранее. Однако полезная нагрузка в виде JavaScript-бэкдора more_eggs осталась такой же.

COM-DLL-дроппер появился в арсенале Cobalt летом 2017 года и до сих пор используется группой для доставки JavaScript-бэкдора more_eggs, который содержится в нем в зашифрованном и заархивированном виде.

Особенности дроппера:

  • Полностью написан на PureBasic.
  • Использует большое число различных техник антианализа.
  • Содержит в себе зашифрованные и заархивированные JavaScript-загрузчик, JavaScript-бэкдор, легитимную утилиту преобразования командной строки для запуска JavaScript-бэкдора more_eggs.
  • Имеет встроенный обфускатор для зашитого внутрь JavaScript-бэкдора и JavaScript-загрузчика.

4.1. Внешнее устройство PE-файла

Все исследуемые экземпляры представляют собой PE-DLL-файлы, предназначенные для регистрации средствами regsvr32. Помимо экспортов, вызываемых regsvr32, каждый из образцов снабжен различными наборами экспортов, свойственных легитимным DLL-файлам. С помощью использования сторонних экспортов группа Cobalt пыталась замаскировать COM-DLL-дроппер. На рис. 32 можно увидеть статистику по самым популярным экспортам использовавшихся в файлах ВПО (всего 249 уникальных экспортов).

Рисунок 32. Наиболее популярные экспорты в COM-DLL-дропперах

Данные экспорты содержат в себе, как правило, ничего не делающие заглушки. По названиям экпортов можно предположить, что злоумышленники пытались замаскировать дропперы под библиотеки медиаприложений. C 2019 года в ВПО появился экспорт DllInstall, который также вызывается с помощью regsvr32, и основной код дроппера был перемещен туда.

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

Для анализа необходимы две сущности — строки и массивы объектов. Строки в PureBasic хранятся в специальном буфере, выделяются и освобождаются практически без задействования системного API. На рис. 33 показан процесс выделения строки. При инициализации программы для строк создается отдельная куча через вызов HeapCreate().

Рисунок 33. Устройство строк
Рисунок 33. Устройство строк

Типичный шаблон для работы с этой сущностью такой:

  1. Выделить строку в хранилище из константы.
  2. Выполнить операции со строкой.
  3. Обновить глобальную строку, обычно выделенную на куче. После завершения операции обновления индекс вершины сдвигается обратно. Таким образом, данная операция чем-то напоминает операцию pop().

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

Массивы объектов так подробно рассматривать не будем, достаточно сказать, что каждый массив хранит перед собой специальный заголовок, который содержит информацию о размере элемента, количестве элементов, а также о типе элементов. Заголовок занимает 18h байт, таким образом размер выделяемого пространства под массив объектов может быть рассчитан как размер элемента × количество элементов + 18h.

Завершая необходимые пояснения, дадим описания функций, которые встречаются на скриншотах далее.

Таблица 1

Функция Описание

ObjectManager::AllocateObjectArray

Выделяется массив объектов

ObjectArray::ReleaseObjectArray

ObjectManager::FreeObject

Массив объектов освобождается

ObjectManager::GetStringObject

ObjectManager::ConcatenationWithStringObject

Создать строку в хранилище

ObjectManager::PopStringObject

Обновить глобальную строку

4.2. Антианализ

Для нахождения нужных API-функций используются нестандартные хеш-суммы от имен этих функций. Хеш-сумма реализуется как CRC32 от данных и последующий XOR с константой. Константы в семплах разные, поэтому в табл. 3 включены также CRC32-значения без XOR с константой.

В новой версии COM-DLL-дроппера cтроки зашифрованы алгоритмом RC4 (ранее использовался XOR).

Таблица 2. Техники, используемые в ВПО для затруднения анализа

Техника Описание

Брутфорс ключа для расшифровки строк

Начиная с апреля 2020 года используется RC4, ранее был XOR. Эта техника реализует нестандартный вариант функции Sleep, что может отложить запуск основных функций ВПО в песочнице

Проверка наличия в CommandLine процесса строки «/s /i»

Таким образом проверяется, что запуск осуществлен через regsvr32

Проверка имени процесса и расширения .ocx

Расширение и имя процесса также проверяются с помощью нестандартной хеш-функции

Проверка списка модулей, загруженных в процесс

Проверка осуществляется с помощью кастомной хеш-функции

Загрузка дополнительного отображения NTDLL в процесс

Таким образом, вероятно, создается доверенный образ NTDLL, в котором отсутствует перехват NT API

Проверка значений регистров Dr0-Dr3

Ненулевые значения в этих регистрах указывают на наличие аппаратных точек остановки и, как следствие, отладчика. Доступ к значениям регистров осуществляется через NtGetContext()

Проверка ProcessDebugPort

Осуществляется вызов NtQueryInformationProcess с соответствующим значением

Проверка ProcessDebugObjectHandle

Осуществляется вызов NtQueryInformationProcess с соответствующим значением

Проверка ProcessDebugFlags

Осуществляется вызов NtQueryInformationProcess с соответствующим значением

Проверка имени родительского процесса

Проверка осуществляется с помощью нестандартной хеш-функции

Проверка текущего года, установленного в системе

Текущая дата получается в с помощью вызовов NtQuerySystemTime и RtlTimeToTimeFields

Проверка значения переменной окружения «COMPUTERNAME»

Имя компьютера проверяется с жестко заданной строкой «FLAREVM »

Таблица 3. Различные строки и соответствующие им хеш-суммы, используемые в техниках

Хеш-сумма CRC32 Строка

0x322CD34E

0x322C4A66

.ocx

0xF43AEA50

0xF43A7378

regsvr32.exe

0x6FECDEE9

0x6FEC47C1

sbiedll.dll

0x16430EDF

0x164397F7

cmdvrt64.dll

0x2B256AC8

0x2B25F3E0

cmd.exe

0xA82757CC

0xA827CEE4

cmstp.exe

0xB3C6B186

0xB3C628AE

msxsl.exe

Брутфорс ключа для расшифровки строк не происходит полностью. В коде жестко прописан префикс, который занимает большую часть ключа. Окончание ключа — это число в десятичной форме записи. Таким образом, ключ = префикс + число.

 Рисунок 34. Брутфорс RC4-ключа
Рисунок 34. Брутфорс RC4-ключа

4.3. JavaScript-генераторы

Дроппер в процессе работы создает два файла. Первый — это JavaScript-загрузчик, а второй — скриптлет, содержащий зашифрованный бэкдор more_eggs. Оба скрипта генерируются.

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

Рисунок 35. Пример генерации части загрузчика
Рисунок 35. Пример генерации части загрузчика

В генератор встроены несколько шаблонов обфускации:

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

Каждый генератор содержит в себе пул имен, которые генерируются перед началом создания скрипта, эти имена в дальнейшем используются в JavaScript. На рис. 35 можно видеть локальную переменную, которая называется lpbobj_arraywcs__JSObjectPool, а на рис. 36 — цикл инициализации этого пула.

Рисунок 36. Пример заполнения пула имен, используемых в скрипте
Рисунок 36. Пример заполнения пула имен, используемых в скрипте

Каждой доступное для использования в скрипте имя состоит из двух частей — случайный префикс, создаваемый один раз на весь скрипт, и случайное число в десятичной форме записи, ограниченное заданным количеством знаков. На рис. 37 можно видеть схему генерации имени и результат, получаемый в скрипте.

Рисунок 37. Генерация имен, доступных для использования в скрипте
Рисунок 37. Генерация имен, доступных для использования в скрипте

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

Рисунок 38. Генерация обфусцированных констант
Рисунок 38. Генерация обфусцированных констант

Полезная нагрузка вставляется в скрипт в закодированном с помощью RC4 и Base91 виде. Реализации RC4 и декодера Base91 также вставляются в скрипт.

4.4. Закрепление в системе

Дроппер в зависимости от имеющихся у него прав в системе закрепляется на зараженной машине несколькими разными способами:

  • через Task Scheduler,
  • через ключ реестра Environment\UserInitMprLogonScript,
  • через ключ реестра Software\Microsoft\Windows\CurrentVersion\Run.

Для всех трех способов записываемое значение идентично и содержит в себе команду для запуска JavaScript-скрипта — загрузчика.

Рисунок 39. Пример закрепления через UserInitMprLogonScript
Рисунок 39. Пример закрепления через UserInitMprLogonScript

Для настройки таска, создаваемого дроппером, генерируется специальный XML-файл. Часть его хранится зашифрованной в дроппере, а часть генерируется в процессе работы.

Рисунок 40. Расшифрованная часть XML
Рисунок 40. Расшифрованная часть XML
Рисунок 41. Создание окончания для XML-файла
Рисунок 41. Создание окончания для XML-файла

Полученный XML-файл сохраняется со случайным именем, состоящим из шестнадцатеричных символов. Затем этот XML-файл передается в schtasks.exe как значение параметра «/XML».

4.5. Запуск полезной нагрузки

COM-DLL-дроппер сохраняет на диск три файла:

  • обфусцированный JavaScript-загрузчик,
  • обфусцированный JavaScript-бэкдор,
  • легитимную утилиту преобразования командной строки для запуска JavaScript-бэкдора more_eggs.

Запуск основного бэкдора производится с помощью известной техники обхода AppLocker, использующей утилиту msxsl. Команды выглядит следующим образом:

  • “C:\Users\\AppData\Roaming\Microsoft\msxsl.exe”
  • “C:\Users\\AppData\Roaming\Microsoft\<имя_javascript_загрузчика>.txt”
  • “C:\Users\\AppData\Roaming\Microsoft\<имя_javascript_бэкдора>.txt”

4.6. Функциональность JavaScript-бэкдора

Сохраненный на диск JavaScript-бэкдор, который нес в себе новый COM-DLL-дроппер, имеет версию 6.6.

Рисунок 42. Заголовок бэкдора
Рисунок 42. Заголовок бэкдора

Данный бэкдор используется группой с 2017 года, исполняется в памяти и всегда имеет низкое количество вердиктов антивируса.

Основные возможности бэкдора:

  1. Шифрование трафика RC4 и Base91.
  2. Выполнение команд от оператора (в этой версии команда more_eggs, по которой бэкдор получил свое название, отсутствовала):
    • exec — загрузка и выполнение файла (.exe или .dll)
    • gtfo — деинсталляция;
    • more_onion — выполнить скрипт
    • via_c — исполнить команду с помощью «cmd.exe /C»
    • more_time — исполнить команду с помощью «cmd.exe / C», с сохранением результата во временный файл. После этого файл вычитывается, удаляется, а содержимое кодируется в Base64 и отправляется на сервер.
  3. Проверка наличия в списке процессов системы антивирусов и исследовательского ПО путем сравнения CRC32 от имени процесса в нижнем регистре без расширения с заданными значениями внутри кода.
  4. Сбор информации о системе:
    • дата установки системы,
    • IP-адрес зараженной машины,
    • тип системы (серверная или стационарная),
    • версия Windows (от XP до 10).
Авторы: Денис Кувшинов, Сергей Тарасов, Даниил Колосков, PT ESC

Заключение

Группа Cobalt продолжает атаковать финансовые организации по всему миру, берет на вооружение новые тактики, обновляет инструментарий и старается все более эффективно обходить средства защиты. Из-за карантина сейчас многие работники кредитно-финансовой сферы работают «на удаленке», вне досягаемости корпоративных средств защиты . К тому же многие злоумышленники используют тему коронавируса в своих атаках, как, например, группа Higaisa . Не исключено, что группа Cobalt попытается использовать эту тему в своих будущих атаках.

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

Фишинг ECB

Type MD5 SHA1 SHA256

Browser droppers

152cd7014811ae8980981a825e5843b0

90f7d0b0f90aeadaeff1adf45db5dcc598dec8c4

2d02bbae38f4dba5485fbc2e38640898907ecdd6b9ee43501d1ee951653ab36f

f2712de0c8575ff32828c83cfbf75d4b

e80ef396462fe651c3cdeb91651ac27799d2dab5

33ba8cd251512f90b7249930aee22d3f47255420a8d41e1326169e0f948cc7d0

a3391d1d3482553545d7c0111984abb6

1a371353c6a46ddea19d520d8ce3b5599a8ee9f1

9e8a99ad401ef5d2bb3aea3a463d85220f0e6724f91a3c2ffd195d0b8628bf9d

CobInt

f924c690f7bbaf60d56a446b7a66a43b

8ada87f00ed3afdd4dbdb07879ba6ebe4a2a9ffa

b83d2c4f5c2bb562981a104d4e49cf25291096d37a4161c32a76e369d1a931e8

Контрольные серверы

ecb-european[.]eu

timeswindows[.]com

VHD

Type MD5 SHA1 SHA256

VHD-file

fce9fcd5fa337d020bd6758008221b81

e288b0410fb95060ce8c5527673978cb2ceffe05

3382a75bd959d2194c4b1a8885df93e8770f4ebaeaff441a5180ceadf1656cd9

CobInt

600154fcb03e775f007ef7b1547b169c

384a13abe42d249e354cd415c4bcbf01086deafb

0c85c1045899291cba47c7171599446642b87015a76d5b22f8cc51f4a6e45a90

6ec0edd1889897ff9b4673600f40f92f

4d50f1cae2acc8c92ff1f678fc1fdfdd1e770f24

64d16900fce924da101744edce28b9ee648192486d9062c427c17589b5f204fb

Контрольные серверы

telekom-support[.]info

45.80.69[.]34

BIFF

Type MD5 SHA1 SHA256

XLS-File

36399ebf94f66529dc72d8b2844f43dd

b912f222e79feadbcefe2d6ead5fab74b15b1f40

0aee265a022ee84e9c8b653e960559c9761a7362e1c345019a552188114b7e80

COM-DLL

862c19b2b4b6a7c97fb8627303b8f5d7

d3fc5f848d630ca2dc8e99b0d4dfe704b8ec1832

7122cf59f8a59f9a44f20fd4c83451c5c4313e0021d3f1ba9c2b1a4f39801db1

Контрольные серверы

download.sabaloo[.]com

origin.cdn77[.]kz

Новый COM-DLL-дроппер

Type MD5 SHA1 SHA256

COM-DLL

47e7212b097b5cffa60903055e3c4d5a

dfcd5692729e859f074b95720505f711ba7d14ac

c1a633a940fc4c595ebbe36823fee1b02bfd755615c51799c9f4e4320b597af1

Контрольный сервер

maps.doaglas[.]com

MITRE TTPs

Tactic ID Name

Initial Access

T1193

Spearphishing Attachment

T1192

Spearphishing Link

Execution

T1059

Command-Line Interface

T1117

Regsvr32

T1204

User Execution

T1064

Scripting

Persistence

T1037

Logon Scripts

T1050

New Service

T1053

Scheduled Task

T1060

Registry Run Keys / Startup Folder

Defense Evasion

T1027

Obfuscated Files or Information

T1220

XSL Script Processing

Discovery

T1063

Security Software Discovery

Command And Control

T1105

Remote File Copy