Отчеты о целевых атаках (APT)

APT-угроза CloudWizard: история CommonMagic продолжается

В марте 2023 года мы выявили прежде неизвестную APT-кампанию с использованием имплантов PowerMagic и CommonMagic в зоне российско-украинского конфликта. Однако тогда мы не смогли связать ее с ранее известными группами и активностями. Опубликовав отчет о фреймворке CommonMagic, мы продолжили искать новые улики, которые могли бы указать на конкретную группу. Как и предполагалось, мы смогли проследить историю этого вредоносного ПО.

В поисках имплантов, похожих на PowerMagic и CommonMagic, мы выявили ряд более сложных вредоносных кампаний, за которыми стояла та же группа. Интересно, что атаки проводились не только в Крыму, Донецке и Луганске, но и в центральной и западной частях Украины. Среди жертв были как отдельные пользователи, так и дипломатические и научно-исследовательские организации. В новой обнаруженной кампании использовался модульный фреймворк, который мы назвали CloudWizard. Он может делать снимки экрана и записывать аудио с микрофона устройства, перехватывать данные, вводимые с клавиатуры, и многое другое.

За последние годы специалисты по кибербезопасности выявили в зоне российско-украинского конфликта множество APT-угроз: Gamaredon, CloudAtlas, BlackEnergy и др. Некоторые из этих угроз давно забыты. Например, Prikormka (Operation Groundbait), которую исследователи ESET обнаружили в 2016 году. И хотя об этом зловреде уже несколько лет не слышно ничего нового, мы обнаружили многочисленные сходства между ним, CommonMagic и CloudWizard. В ходе дальнейшего расследования мы узнали, что CloudWizard имеет интересную и насыщенную историю.

Свои находки мы представили на конференции по информационной безопасности Positive Hack Days.

Первичные результаты

Мы начали расследование с анализа телеметрии с устройств с активным заражением. В ходе атаки вредоносное ПО выполнялось под именем службы Windows с именем syncobjsup, что вызывало подозрения. Этой службой управлял DLL-файл, находящийся по не менее подозрительному пути C:\ProgramData\Apparition Storage\syncobjsup.dll. Мы определили, что этот DLL-файл используется для расшифровки данных из файла mods.lrc, расположенного в той же папке, что и DLL. Для расшифровки используется алгоритм RC5 с ключом 88 6A 3F 24 D3 08 A3 85 E6 21 28 45 77 13 D0 38. Однако расшифровать данные при помощи стандартной реализации RC5 не удалось. Более подробный анализ реализации алгоритма показал, что он содержит ошибку:

Во внутреннем цикле присутствует ошибка: вместо переменной j используется переменная i.

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

Интересно, что ключ из gist-репозитория совпадает с ключом, который использовался в библиотеке syncobjsup.dll.

Расшифрованный файл представлял собой виртуальную файловую систему (VFS), содержащую несколько исполняемых файлов и их конфигурации в формате JSON:

Каждая запись в VFS содержит magic-байты (CiCi), ROR6-хеш имени записи, размер и содержимое записи.

Внутри файла mods.lrc мы обнаружили:

  • три DLL-библиотеки (имена в таблицах экспорта: Main.dll, Crypton.dll и Internet.dll);
  • файлы конфигурации DLL-библиотек в формате JSON.

DLL-библиотека syncobjsup.dll перебирает записи в VFS и ищет запись с именем Main (ROR6-хеш: 0xAA23406F). Она содержит DLL-библиотеку Main.dll — оркестратор фреймворка CloudWizard. Его загрузка происходит рефлективно, а для запуска используется экспортируемая функция SvcEntry.

Анализ оркестратора

После запуска оркестратор создает приостановленный процесс WmiPrvSE.exe и внедряется в него. Из процесса WmiPrvSE.exe оркестратор создает резервную копию VFS-файла mods.lrs. Затем он парсит файл mods.lrc, чтобы извлечь DLL-файлы всех модулей фреймворка с файлами конфигурации. Как мы уже говорили, конфигурация хранится в JSON-файлах:

В самом оркестраторе содержится конфигурация со следующими параметрами:

  • идентификатор жертвы (например, 03072020DD);
  • версия фреймворка (последняя наблюдаемая версия — 5.0);
  • временной интервал между двумя последовательными heartbeat-сообщениями.

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

Для шифрования строки в формате JSON используется криптографический модуль (Crypton.dll из VFS), а для отправки — сетевой модуль (Internet.dll).

В ответ на heartbeat-сообщения оркестратор получает команды управления модулями: установкой, запуском, остановкой, удалением модулей или изменением их конфигурации. Каждая команда содержит magic-байты (DE AD BE EF) и строку в формате JSON (например, {"Delete": ["Keylogger", "Screenshot"]} ), за которой может следовать DLL-файл модуля.

Шифрование и обмен данными

При каждой установке фреймворка CloudWizard в него включены два модуля, Crypton.dll и Internet.dll, упомянутые выше. Crypton выполняет шифрование и расшифровку всех отправляемых и получаемых данных. Он использует два алгоритма шифрования:

  • для шифрования heartbeat-сообщений и команд — алгоритм AES (ключ указан в JSON-конфигурации файла VFS);
  • для шифрования прочих данных (например, результатов выполнения модуля) — сочетание двух алгоритмов: AES и RSA. Сначала данные шифруются с использованием сгенерированного псевдослучайного ключа сеанса AES, затем ключ AES шифруется по алгоритму RSA.
Сетевой модуль Internet передает зашифрованные данные операторам вредоносного ПО. Он может отправлять данные:

  • в облачные хранилища OneDrive, Dropbox или Google Drive;
  • на командный веб-сервер.

Из облачных хранилищ чаще всего используется OneDrive, а Dropbox и Google Drive являются запасными вариантами на случай, если сервис OneDrive недоступен. В конфигурации модуля указаны токены OAuth для авторизации в облачных хранилищах.

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

Анализируя код сетевого модуля, мы обнаружили строку с именем каталога на компьютере разработчика: D:\Projects\Work_2020\Soft_Version_5\Refactoring.

Арсенал модулей

Для сбора информации используются вспомогательные DLL-модули со следующими экспортируемыми функциями.

Экспортируемая функция Описание
Start Запускает модуль
Stop Останавливает модуль
Whoami Возвращает JSON-объект с информацией о модуле
(например, {"Module":"Keylogger ","time_mode":"2","Version":"0.01"}).
Значение time_mode указывает на закрепление модуля в системе (1 — без закрепления, 2 — с закреплением)
GetResult Возвращает результаты выполнения модуля (снимки экрана, записи с микрофона и т. д.) Большинство модулей отправляют результаты в ZIP-архивах (хранящихся в памяти)
GetSettings Возвращает конфигурацию модуля

Модули могут оставаться в системе после перезагрузки (в таком случае они сохраняются в VFS-файле mods.lrs) или выполняться в памяти до тех пор, пока компьютер не выключится или модуль не будет удален оператором.

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

Самым интересным нам показался модуль для эксфильтрации электронной почты из Gmail. Он считывает cookie-файлы Gmail из браузеров и использует их для доступа к веб-интерфейсу Gmail в режиме для устаревших браузеров (HTML-версия). Для этого он отправляет запрос GET на адрес https://mail.google.com/mail/u/<account ID>/?ui=html&zy=h. При первом переходе к HTML-версии Gmail запрашивает у пользователя подтверждение и открывает следующую веб-страницу:

После этого модуль имитирует нажатие кнопки I’d like to use HTML Gmail (Переключиться на базовую HTML-версию Gmail), отправляя запрос POST на URL-адрес из HTML-кода запроса.

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

Любопытно также, что код этого модуля был частично позаимствован из попавшего в публичный доступ исходного кода Hacking Team.

Назад в 2017

Нам удалось найти оркестратор и модули CloudWizard, но все еще не хватало одного компонента цепочки заражения — установщика фреймворка. Однако просматривая старые данные телеметрии, мы смогли найти несколько установщиков, использовавшихся с 2017 по 2020 год. Тогда использовалась версия импланта 4.0 (как мы говорили выше, последняя найденная нами версия — 5.0).

Обнаруженный установщик был создан с помощью NSIS. После запуска он внедряет три файла:

  • C:\ProgramData\Microsoft\WwanSvc\WinSubSvc.exe
  • C:\ProgramData\Microsoft\MF\Depending.GRL (в других версиях установщика этот файл может находиться по пути C:\ProgramData\Microsoft\MF\etwdrv.dll)
  • C:\ProgramData\System\Vault\etwupd.dfg

Затем он создает службу Windows Subsystem Service, сконфигурированную для запуска бинарного файла WinSubSvc.exe при каждом включении компьютера.

Стоит обратить внимание, что после удачного заражения установщик показывает сообщение с текстом «Well done!» («Отлично!»):

Этот факт может говорить о том, что злоумышленники могли получать физический доступ к целевым компьютерам для развертывания CloudWizard или что установщик пытается маскироваться под конфигуратор сетевых параметров (как мы видим из заголовка окна Network Settings).

Старая (4.0) и новая (5.0) версии CloudWizard имеют значительные различия, перечисленные в таблице ниже.

Версия 4.0 Версия 5.0
Модули обмена данными и шифрования содержатся в главном модуле Модуль обмена данными и шифрования отделены друг от друга
Папка с исходными файлами фреймворка: D:\Projects\Work_2020\Soft_Version_4\Service Папка с исходными файлами фреймворка: D:\Projects\Work_2020\Soft_Version_5\Refactoring
Используется алгоритм RC5 (жестко закодированный ключ: 7Ni9VnCs976Y5U4j) из библиотеки RC5Simple для шифрования и расшифровки данных, которыми зловред обменивается с командным сервером Используются алгоритмы RSA и AES для шифрования и расшифровки данных, которыми зловред обменивается с командным сервером (ключи содержатся в файле конфигурации)

Атрибуция

После тщательного анализа CloudWizard мы решили отыскать улики, позволяющие связать этот фреймворк с уже известной группировкой. CloudWizard напомнил нам две кампании на территории Украины, отраженные в публичных отчетах: Operation Groundbait и Operation BugDrop. Кампанию Operation Groundbait впервые описали исследователи ESET в 2016 году, а первые импланты были замечены в 2008 году. Расследуя кампанию Operation Groundbait, исследователи ESET обнаружили Prikormka, «первое широко известное вредоносное ПО для целевых атак, разработанное украинской группой». Согласно отчету ESET, группа, стоящая за Operation Groundbait, «вероятнее всего, находится на территории Украины».

Кампанию Operation BugDrop в 2017 году обнаружили исследователи CyberX. В своем отчете CyberX утверждает (не приводя, впрочем, веских доказательств), что между Operation BugDrop и Operation Groundbait есть сходства. И мы нашли этому подтверждение:

  • Модуль Prikormka USB DOCS_STEALER (MD5: 7275A6ED8EE314600A9B93038876F853B957B316) содержит путь к PDB-файлу D:\My\Projects_All\2015\wallex\iomus1_gz\Release\iomus.pdb;
  • USB-стилер BugDrop (MD5: a2c27e73bc5dec88884e9c165e9372c9) содержит путь к PDB-файлу D:\My\Projects_All\2016\iomus0_gz\Release\usdlg.pdb.

Перечисленные ниже факты позволяют нам со средней степенью уверенности сделать вывод, что фреймворком CloudWizard управляет группа, стоявшая за кампаниями Operation Groundbait и Operation BugDrop.

  • Исследователи ESET обнаружили загрузчик CloudWizard версии 4.0 dll (с экспортируемым именем LCrPsdNew.dll), похожий на DLL Prikormka. Сходства между этими двумя файлами были отмечены на конференции Virus Bulletin 2019 в презентации «Rich headers: leveraging the mysterious artifact of the PE format» («Rich-заголовки: использование таинственных артефактов в формате PE»), на слайде 42.

    42-й слайд презентации

    42-й слайд презентации «Rich headers: leveraging the mysterious artifact of the PE format» («Rich-заголовки: использование таинственных артефактов в формате PE»)

  • Инструменты ESET обнаруживают загрузчик из образца CloudWizard версии 4 (MD5: 406494bf3cabbd34ff56dcbeec46f5d6, путь к PDB-файлу: D:\Projects\Work_2017\Service\Interactive Service_system\Release\Service.pdb) как Win32/Prikormka.CQ.
  • Согласно нашей телеметрии, во многих случаях заражения зловредом Prikormka заканчивались заражением фреймворком CloudWizard.
  • Реализация нескольких модулей CloudWizard напоминает реализацию соответствующих модулей Prikormka и BugDrop, хотя они написаны на C++, а не на C.
    • Модули USB-стилеров извлекают серийные номера и идентификаторы продуктов подключенных USB-устройств через системный вызов IOCTL_STORAGE_QUERY_PROPERTY. В случае неудачи используется одно и то же резервное значение по умолчанию — undef.

      Получение серийного номера и идентификатора продукта USB-устройства в BugDrop (MD5: F8BDE730EA3843441A657A103E90985E)

      Получение серийного номера и идентификатора продукта USB-устройства в BugDrop (MD5: F8BDE730EA3843441A657A103E90985E)

      Получение серийного номера и идентификатора продукта USB-устройства в CloudWizard (MD5: 39B01A6A025F672085835BD699762AEC)

      Получение серийного номера и идентификатора продукта USB-устройства в CloudWizard (MD5: 39B01A6A025F672085835BD699762AEC)

      Присвоение строки undef в рассмотренных образцах BugDrop и CloudWizard

      Присвоение строки undef в рассмотренных образцах BugDrop (слева) и CloudWizard (справа)

    • Модули для создания снимков экрана используют один тот же список имен окон, увеличивающих частоту создания снимков: Skype и Viber. В CloudWizard и Prikormka установлено одинаковое значение по умолчанию для интервала создания снимков экрана (15 минут).

      Сравнение текста в заголовках окон в Prikormka (MD5: 16793D6C3F2D56708E5FC68C883805B5)

      Сравнение текста в заголовках окон в Prikormka (MD5: 16793D6C3F2D56708E5FC68C883805B5)

      Добавление строки SKYPE и VIBER к списку заголовков окон в CloudWizard (MD5: 26E55D10020FBC75D80589C081782EA2)

      Добавление строки SKYPE и VIBER к списку заголовков окон в CloudWizard (MD5: 26E55D10020FBC75D80589C081782EA2)

    • Модули составления списка файлов в образцах Prikormka и CloudWizard называются одинаково: Tree. Они используют одну и ту же строку форматирования для создания списков папок: «\t\t\t\t\t(%2.2u,%2.2u.%2.2u.%2.2u)\n».

      Использование одинаковой строки форматирования для составления списков папок в Prikormka (MD5 EB56F9F7692F933BEE9660DFDFABAE3A) и CloudWizard (MD5: BFF64B896B5253B5870FE61221D9934D)

      Использование одинаковой строки форматирования для составления списков папок в Prikormka (MD5 EB56F9F7692F933BEE9660DFDFABAE3A) и CloudWizard (MD5: BFF64B896B5253B5870FE61221D9934D)

      Использование одинаковой строки форматирования для составления списков папок в Prikormka (сверху, MD5 EB56F9F7692F933BEE9660DFDFABAE3A) и CloudWizard (снизу, MD5: BFF64B896B5253B5870FE61221D9934D)

    • Модули записи с микрофона работают одинаково: сначала они создают запись в формате WAV, используя API Windows Multimedia, затем преобразуют ее в формат MP3, используя библиотеку LAME. Эта схема часто встречается во вредоносном ПО, но для определения настроек библиотеки LAME использовались конкретные строки: 8000 Hz и 16 Kbps. Модули Prikormka и CloudWizard извлекают из этих строк целочисленные значения и используют их в библиотеке LAME.
    • Списки расширений в модулях Prikormka и CloudWizard выстроены в схожем порядке:
      Списки расширений в Prikormka (MD5: EB56F9F7692F933BEE9660DFDFABAE3A) и CloudWizard (MD5: BFF64B896B5253B5870FE61221D9934D) Списки расширений в Prikormka (MD5: EB56F9F7692F933BEE9660DFDFABAE3A) и CloudWizard (MD5: BFF64B896B5253B5870FE61221D9934D)

      Списки расширений в Prikormka (слева, MD5: EB56F9F7692F933BEE9660DFDFABAE3A) и CloudWizard (справа, MD5: BFF64B896B5253B5870FE61221D9934D)

  • В Prikormka имена файлов, отправляемых на командный сервер, записываются в формате дд.мм.гг_чч.мм.сс.<расширение>. В CloudWizard имена файлов имеют формат дд.мм.гггг_чч.мм.сс.мс.dat. Дата, подставляемая в строки формата имен, извлекается из API-функции GetLocalTime.
  • Командные серверы Prikormka и CloudWizard размещены на хостингах украинских провайдеров. Кроме того, есть сходства между способами отправки файлов в облачное хранилище Dropbox, используемыми BugDrop и CloudWizard.
  • Жертвы Prikormka, BugDrop и CloudWizard были обнаружены в западной и центральной части Украины, а также в зоне российско-украинского конфликта.

Между CloudWizard и CommonMagic мы отметили следующие сходства.

  • В обоих фреймворках используется один и тот же код для обмена данными с хранилищем OneDrive. Мы не нашли его ни в одной библиотеке открытых исходных кодов. В коде используется одно и то же значение User-Agent: «Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136».

Одинаковая строка в сетевом модуле CloudWizard (MD5: 84BDB1DC4B037F9A46C001764C115A32) и CommonMagic (MD5: 7C0E5627FD25C40374BC22035D3FADD8)

Одинаковая строка в сетевом модуле CloudWizard (слева, MD5: 84BDB1DC4B037F9A46C001764C115A32) и CommonMagic (справа, MD5: 7C0E5627FD25C40374BC22035D3FADD8)

  • Оба фреймворка, CloudWizard (версия 4) и CommonMagic используют для шифрования библиотеку RC5Simple. Файлы, зашифрованные с помощью RC5Simple, начинаются с 7-байтового заголовка — RC5SIMP в исходном коде библиотеки. Однако во вредоносных имплантах это значение изменено на DUREX43 в CloudWizard и Hwo7X8p в CommonMagic. Кроме того, и CloudWizard, и CommonMagic используют библиотеку RapidJSON для парсинга JSON-объектов.
  • Имена файлов, отправляемых на командный сервер, в CommonMagic имеют формат гггг.ммм.дд_чч.мм.сс.мс.dat (в CloudWizard — дд.мм.гггг_чч.мм.сс.мс.dat).
  • Идентификаторы жертв, извлеченные из образцов CloudWizard и CommonMagic, похожи: они содержат дату, после которой следуют две одинаковые буквы, например 03072020DD, 05082020BB в CloudWizard и WorkObj20220729FF в CommonMagic.
  • Жертвы CommonMagic и CloudWizard находятся в зоне российско-украинского конфликта.

Подводим итоги

Мы начали расследование в 2022 году с анализа простых вредоносных скриптов PowerShell, внедряемых неизвестной группой, и закончили обнаружением и атрибуцией двух крупных, связанных между собой модульных фреймворков: CommonMagic и CloudWizard. Их корни можно отследить до обнаружения первых образцов Prikormka в 2008 году. С 2017 года не наблюдалось никаких признаков активности Groundbait и BugDrop. Однако группа, стоящая за этими двумя кампаниями, не прекратила свою деятельность и продолжала разрабатывать инструменты для кибершпионажа и заражать ими целевые системы.

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

NSIS-установщик

MD5 0edd23bbea61467f144d14df2a5a043e
SHA256 177f1216b55058e30a3ce319dc1c7a9b1e1579ea3d009ba965b18f795c1071a4

Загрузчик (syncobjsup.dll)

MD5 a2050f83ba2aa1c4c95567a5ee155dca
SHA256 041e4dcdc0c7eea5740a65c3a15b51ed0e1f0ebd6ba820e2c4cd8fa34fb891a2

Оркестратор (Main.dll)

MD5 0ca329fe3d99acfaf209cea559994608
SHA256 11012717a77fe491d91174969486fbaa3d3e2ec7c8d543f9572809b5cf0f2119

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

91.228.147[.]23
curveroad[.]com

APT-угроза CloudWizard: история CommonMagic продолжается

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

 

Отчеты

CloudSorcerer: новая APT-угроза, нацеленная на российские государственные организации

«Лаборатория Касперского» обнаружила новую APT-угрозу CloudSorcerer, нацеленную на российские государственные организации и использующую облачные службы в качестве командных серверов аналогично APT CloudWizard.

StripedFly: двуликий и незаметный

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

Подпишитесь на еженедельную рассылку

Самая актуальная аналитика – в вашем почтовом ящике