В мае 2024 года мы обнаружили новую продолжительную атаку повышенной сложности (advanced persistent threat, APT), нацеленную на российские государственные организации. Мы дали ей название CloudSorcerer. Это сложное средство кибершпионажа, предназначенное для скрытого мониторинга, сбора и эксфильтрации данных через облачные службы Microsoft Graph, Yandex Cloud и Dropbox. Зловред использует их как командные серверы и взаимодействует с ними через API с помощью токенов аутентификации. Кроме того, в роли начального командного сервера CloudSorcerer выступает репозиторий GitHub.
По принципу действия CloudSorcerer напоминает APT-угрозу CloudWizard, о которой мы сообщали в 2023 году. Однако код новой вредоносной программы совершенно иной. Мы полагаем, что за CloudSorcerer стоит новая APT-группа, применившая аналогичный метод взаимодействия с публичными облачными службами.
Кратко о наших находках:
- APT-угроза CloudSorcerer использует публичные облачные службы в качестве основных командных серверов.
- Зловред взаимодействует с командными серверами с помощью специальных команд и декодирует их, руководствуясь заданной таблицей символов.
- Для осуществления вредоносных операций злоумышленник также применяет интерфейсы COM-объектов Microsoft.
- CloudSorcerer работает как отдельные модули (связи и сбора данных) в зависимости от запущенного процесса, но запускается из одного исполняемого файла.
Техническая информация
Первичный запуск
MD5 | f701fc79578a12513c369d4e36c57224 |
SHA1 | f1a93d185d7cd060e63d16c50e51f4921dd43723 |
SHA256 | e4b2d8890f0e7259ee29c7ac98a3e9a5ae71327aaac658f84072770cf8ef02de |
Время компоновки | Н/д |
Компилятор | Н/д |
Тип файла | Исполняемый файл Windows x64 |
Размер файла | 172 КБ |
Имя файла | Н/д |
Вредоносная программа запускается злоумышленником вручную на уже зараженном компьютере. Изначально она представляет собой один бинарный файл Portable Executable (PE), написанный на языке C. Функциональность этого файла зависит от процесса, в котором он выполняется. После запуска вредоносная программа вызывает функцию GetModuleFileNameA, чтобы определить имя процесса, в котором она запущена. Затем она сравнивает это имя с заданным набором строк: browser, mspaint.exe и msiexec.exe. В зависимости от полученного имени процесса вредоносная программа активирует различные функции.
- Если имя процесса — mspaint.exe, то CloudSorcerer функционирует как модуль бэкдора, осуществляя сбор данных и выполняя вредоносный код.
- Если имя процесса — msiexec.exe, то зловред инициирует свой модуль связи с командным сервером.
- Наконец, если имя процесса содержит строку browser или не совпадает ни с одним из имен в списке, то зловред пытается внедрить шелл-код в процессы msiexec.exe, mspaint.exe или explorer.exe, прежде чем завершить исходный процесс.
Шелл-код, используемый CloudSorcerer для миграции первичного процесса, демонстрирует довольно стандартную функциональность:
- анализ блока операционного окружения процесса (PEB), чтобы определить смещения на необходимые DLL-библиотеки ядра Windows;
- идентификация необходимых API Windows по хешам с помощью алгоритма ROR14;
- внедрение кода CloudSorcerer в память одного из целевых процессов и запуск этого кода в отдельном потоке.
Весь обмен данными между модулями организован через каналы Windows — механизм межпроцессного взаимодействия (IPC).
Модуль бэкдора CloudSorcerer
Модуль бэкдора, выполняемый в отдельном потоке, начинает со сбора различной системной информации о пораженном компьютере. Вредоносная программа собирает следующие данные:
- имя компьютера;
- имя пользователя;
- сведения о подверсии Windows;
- время работы системы.
Все собранные данные сохраняются в специально созданной структуре. Когда информация собрана, данные записываются в именованный канал \\.\PIPE\[1428], подключенный к процессу модуля командного сервера. Важно отметить, что весь обмен данными организован с помощью четко определенных специализированных структур, таких как структуры команд бэкдора и сбора информации.
Далее зловред пытается считать данные из канала \\.\PIPE\[1428]. В случае успеха он парсит входящие данные, помещает их в структуру COMMAND и считывает из нее один байт, который представляет собой идентификатор COMMAND_ID.
В зависимости от идентификатора COMMAND_ID вредоносная программа выполняет одно из следующих действий:
- 0x1 — сбор информации о жестких дисках в системе, включая имена, емкость и свободное пространство логических дисков;
- 0x2 — сбор информации о файлах и папках, такой как имя, размер и тип;
- 0x3 — выполнение команд терминала с помощью API ShellExecuteExW;
- 0x4 — копирование, перемещение, переименование или удаление файлов;
- 0x5 — считывание данных из любого файла;
- 0x6 — создание и запись данных в любой файл;
- 0x8 — получение шелл-кода из канала и внедрение его в любой процесс путем выделения памяти и создания нового потока в удаленном процессе;
- 0x9 — получение вредоносного PE-файла и внедрение его в удаленный процесс;
- 0x7 — выполнение дополнительных расширенных функций.
Когда зловред получает COMMAND_ID 0x7, он выполняет одну из следующих дополнительных задач.
ID команды | Действие | Описание |
0x2307 | Создать процесс | Создает любой процесс с помощью COM-интерфейса. |
0x2407 | Создать процесс от имени определенного пользователя | Создает любой процесс от имени определенного пользователя. |
0x2507 | Создать процесс с каналом | Создает любой процесс с поддержкой межпроцессного взаимодействия для обмена данными с созданным процессом. |
0x3007 | Очистить кэш DNS | Очищает кэш DNS. |
0x2207 | Удалить задачу | Удаляет любую задачу Windows с помощью интерфейсов COM-объектов. |
0x1E07 | Открыть службу | Открывает службу Windows и считывает ее состояние. |
0x1F07 | Создать новую задачу | Создает новую задачу Windows и устанавливает триггер для ее выполнения, используя COM-объекты. |
0x2007 | Получить задачи | Получает список всех задач Windows, используя интерфейс COM-объекта. |
0x2107 | Остановить задачу | Останавливает любую задачу, используя интерфейс COM-объекта. |
0x1D07 | Получить службы | Получает список всех служб Windows. |
0x1907 | Удалить значение из раздела реестра | Удаляет любое значение из любого раздела реестра Windows, выбранного злоумышленником. |
0x1A07 | Создать службу | Создает новую службу Windows. |
0x1B07 | Изменить службу | Вносит изменения в конфигурацию любой службы Windows. |
0x1807 | Удалить раздел реестра | Удаляет любой раздел реестра Windows. |
0x1407 | Получить таблицу обновлений TCP/UDP | Получает информацию из таблицы обновлений Windows TCP/UDP. |
0x1507 | Собрать процессы | Собирает данные обо всех запущенных процессах. |
0x1607 | Задать значение раздела реестра | Вносит изменения в любой раздел реестра Windows. |
0x1707 | Перечислить разделы реестра | Перечисляет разделы реестра Windows. |
0x1307 | Перечислить ресурсы | Перечисляет сетевые ресурсы Windows. |
0x1007 | Задать сведения о пользователе сети | Задает сведения об учетной записи пользователя в сети Windows с помощью NetUserSetInfo. Эта операция позволяет администраторам изменять свойства учетной записи пользователя на локальном или удаленном компьютере. |
0x1107 | Получить участников сети | Получает участника группы локальной сети. |
0x1207 | Добавить участника | Добавляет пользователя в группу локальной сети. |
0xE07 | Получить сведения о пользователе сети | Собирает информацию о пользователе сети. |
0xB07 | Перечислить пользователей сети | Перечисляет пользователей сети. |
0xC07 | Добавить пользователя сети | Добавляет нового пользователя сети. |
0xD07 | Удалить пользователя | Удаляет пользователя сети. |
0x907 | Отменить подключение | Отменяет существующее сетевое подключение. Эта функция позволяет отключать сетевые ресурсы, например общие каталоги. |
0x507 | Выполнить файловую операцию | Копирует, перемещает или удаляет любой файл. |
0x607 | Получить сведения о сети | Собирает информацию о сети и интерфейсах. |
0x707 | Перечислить подключения | Перечисляет все сетевые подключения. |
0x807 | Подключить сетевой ресурс | Подключает удаленный сетевой диск. |
0x407 | Считать файл | Считывает любой файл в виде текстовых строк. |
0x107 | Перечислить RDP | Перечисляет все сеансы протокола удаленного рабочего стола (RDP). |
0x207 | Выполнить WMI | Выполняет любой запрос WMI, используя интерфейсы COM-объектов. |
0x307 | Получить файлы | Создает список файлов и папок. |
Вся собранная информация или результаты выполненных задач добавляются в специально созданную структуру и передаются в процесс модуля командного сервера по именованному каналу.
Модуль командного сервера
При запуске модуль командного сервера создает новый канал Windows с именем \\.\PIPE\[1428]. Затем он настраивает соединение с начальным командным сервером, предоставляя необходимые аргументы последовательности функций API Windows, отвечающих за подключение к интернету:
- InternetCrackUrlA;
- InternetSetOptionA;
- InternetOpenA;
- InternetConnectA;
- HttpOpenRequestA;
- HttpSendRequestA.
Вредоносная программа задает тип запроса (GET), настраивает информацию о прокси, устанавливает заголовки по заданным значениям и предоставляет URL-адрес командного сервера.
Затем вредоносная программа подключается к исходному командному серверу, который представляет собой страницу GitHub с адресом https://github[.]com/alinaegorovaMygit. Зловред считывает всю веб-страницу в буфер памяти, используя вызов InternetReadFile.
Репозиторий GitHub содержит форки трех публичных проектов без каких-либо изменений или обновлений. Таким образом создается впечатление, что это легитимная и активная страница GitHub. Однако в разделе «Автор» на странице GitHub есть интересная строка:
Это строка в шестнадцатеричной кодировке, которая начинается и заканчивается одинаковой последовательностью байтов: CDOY. Вредоносная программа полностью загружает HTML-страницу GitHub, после чего парсит ее в поисках именно этой последовательности символов — CDOY. Найдя ее, зловред копирует все символы до второго разделителя CDOY и сохраняет их в буфере памяти. Затем он анализирует эти символы, преобразуя строковые значения в шестнадцатеричные. После этого программа декодирует строку с помощью заданной таблицы символов. Каждый байт из анализируемой строки является индексом в таблице символов и указывает на байт для подстановки. Таким образом формируется новый шестнадцатеричный массив байтов.
Вместо подключения к GitHub вредоносная программа CloudSorcerer также пытается получить те же данные с hxxps://my.mail[.]ru/ — российского облачного фотохостинга. Имя фотоальбома злоумышленников содержит ту же шестнадцатеричную строку.
Первый расшифрованный байт шестнадцатеричной строки — это магическое число, которое указывает вредоносной программе, какую облачную службу использовать. Например, если это байт 1, то вредоносная программа использует облако Microsoft Graph, а если 0 — Yandex Cloud. Следующие байты представляют собой строку токена авторизации, который использует облачный API для аутентификации.
В зависимости от магического числа вредоносная программа создает структуру и указывает смещение на виртуальную таблицу функций, которая содержит подмножество функций для взаимодействия с выбранной облачной службой.
Далее вредоносная программа подключается к облачному API посредством следующих операций:
- настройка исходного подключения с помощью InternetOpenA и InternetConnectA;
- настройка всех необходимых заголовков и токена авторизации, полученного со страницы GitHub;
- настройка путей API в запросе;
- отправка запроса с использованием HttpSendRequestExA и проверка ошибок в ответе;
- считывание данных из облака с помощью InternetReadFile.
После этого вредоносная программа создает два отдельных потока: один отвечает за получение данных из канала Windows, а другой — за отправку данных в этот канал. Эти потоки обеспечивают асинхронный обмен данными между модулями командного сервера и бэкдора.
Наконец, модуль командного сервера взаимодействует с облачными службами: считывает данные, получает закодированные команды, декодирует их с помощью таблицы символов и отправляет через именованный канал в модуль бэкдора. И наоборот: получает результаты выполнения команд или эксфильтрованные данные от модуля бэкдора и записывает эти данные в облако.
Инфраструктура
Страница GitHub
Страница на GitHub была создана 7 мая 2024 года, и в тот же день на нее были скопированы два репозитория. 13 мая 2024 года был добавлен еще один репозиторий, и больше никаких взаимодействий с GitHub не происходило. Скопированные репозитории не подвергались изменениям. Имя репозитория командного сервера Alina Egorova — распространенное русское женское имя, однако на фотографии на странице GitHub изображен мужчина, а сам снимок скопирован из публичного фотобанка.
Фотохостинг Mail.ru
Эта страница содержит ту же закодированную строку, что и страница GitHub. Информация о том, когда был создан и опубликован альбом, отсутствует. В качестве фото владельца использована та же самая фотография из фотобанка.
Облачная инфраструктура
Служба | Главный URL-адрес | Исходный путь |
Yandex Cloud | cloud-api.yandex.net | /v1/disk/resources?path=
/v1/disk/resources/download?path= /v1/disk/resources/upload?path= |
Microsoft Graph | graph.microsoft.com | /v1.0/me/drive/root:/Mg/%s/%s:/content |
Dropbox | content.dropboxapi.com | /2/files/download
/2/files/upload |
Атрибуция
Облачные службы применялись и ранее, и мы уже приводили подобный пример в сообщении об APT-угрозе CloudWizard (кампания в российско-украинском конфликте, связанная с Operation Groundbait и CommonMagic). Однако маловероятно, что автором CloudSorcerer является тот же злоумышленник, так как код и общая функциональность вредоносных программ различаются. Поэтому на данном этапе мы полагаем, что CloudSorcerer — это новый автор, который перенял методику взаимодействия с публичными облачными службами.
Жертвы
Государственные организации в Российской Федерации.
Выводы
Вредоносная программа CloudSorcerer — это комплексный набор инструментов, нацеленных на российские государственные организации. Применение облачных служб, таких как Microsoft Graph, Yandex Cloud и Dropbox в качестве инфраструктуры командного сервера, а также GitHub для первоначального обмена данными с командным сервером указывает на кибершпионаж с тщательно спланированным подходом. Способность вредоносной программы динамически адаптировать свое поведение в зависимости от процесса, в котором она запущена, а также использовать сложное межпроцессное взаимодействие через каналы Windows еще больше подчеркивает ее проработанность.
Несмотря на сходство с ранее зарегистрированной APT-угрозой CloudWizard, значительные различия в коде и функциональности указывают на то, что за CloudSorcerer стоит новая APT-группа. Возможно, она вдохновлялась ранее встречавшимися методами, но разработала свои собственные уникальные инструменты.
Индикаторы компрометации
Хеш-суммы файлов (вредоносные документы, троянцы, электронные письма, приманки)
F701fc79578a12513c369d4e36c57224 | CloudSorcerer |
Домены и IP-адреса
hxxps://github[.]com/alinaegorovaMygit | CloudSorcerer C2 |
hxxps://my.mail[.]ru/yandex.ru/alinaegorova2154/photo/1 | CloudSorcerer C2 |
Правила для YARA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
rule apt_cloudsorcerer { meta: description = "Detects CloudSorcerer" author = "Kaspersky" copyright = "Kaspersky" distribution = "DISTRIBUTION IS FORBIDDEN. DO NOT UPLOAD TO ANY MULTISCANNER OR SHARE ON ANY THREAT INTEL PLATFORM" version = "1.0" last_modified = "2024-06-06" hash = "F701fc79578a12513c369d4e36c57224" strings: $str1 = "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" $str2 = "c:\\windows\\system32\\mspaint.exe" $str3 = "C:\\Windows\\system32\\msiexec.exe" $str4 = "\\\\.\\PIPE\\" condition: uint16(0) == 0x5A4D and all of ($str*) } |
Сопоставление с базой знаний MITRE ATT&CK
Тактика | Метод | Название метода |
Выполнение | T1059.009 | Интерпретатор команд и сценариев: облачные API |
T1559 | Межпроцессное взаимодействие (IPC) | |
T1053 | Запланированная задача, задание | |
T1047 | Инструментарий управления Windows | |
Закрепление | T1543 | Создание или изменение системного процесса |
T1053 | Запланированная задача, задание | |
Обход защиты | T1140 | Деобфускация, декодирование файлов или информации |
T1112 | Внесение изменений в реестр | |
Исследование | T1083 | Поиск файлов и каталогов |
T1046 | Обнаружение сетевых служб | |
T1057 | Обнаружение процессов | |
T1012 | Поиск данных в реестре | |
T1082 | Получение информации о системе | |
Сбор данных | T1005 | Поиск данных в локальных системах |
Управление и контроль | T1102 | Веб-служба |
T1568 | Динамическое разрешение | |
Эксфильтрация данных | T1567 | Эксфильтрация через веб-службу |
T1537 | Передача данных в учетную запись в облаке |
CloudSorcerer: новая APT-угроза, нацеленная на российские государственные организации