В октябре 2022 г. наша команда Глобального центра исследований и анализа угроз (GReAT) подразделения Threat Research анализировала атаки на транспортные, правительственные и сельскохозяйственные организации в Донецке, Луганске и Крыму. В процессе мы обнаружили несколько неприметных, но, как оказалось в дальнейшем, крайне интересных вредоносных компонентов.
В этой статье мы — исследователи ИБ-угроз GReAT Леонид Безвершенко и Георгий Кучерин — расскажем об исследовании, которое объединило несколько APT-кампаний в зоне российско-украинского конфликта, а также в западной и центральной частях Украины и вылилось в целую «магическую» историю.
Глава 1. Обыкновенная магия
В октябре 2022 г. мы обнаружили несколько активных заражений вредоносными PowerShell-скриптами. Атаки были направлены на уже упомянутые правительственные, сельскохозяйственные и транспортные организации. Нашей задачей было установить полные цепочки заражения.
Согласно данным нашей телеметрии, все жертвы скачали уникальные ZIP-файлы, которые мимикрировали под архивы с законодательными актами и другими документами от госорганов.
Пользователи скачивали их с двух доменов:
- webservice-srv[.]online;
- webservice-srv1[.]online.
На тот момент мы не могли однозначно ответить на вопрос, как жертвы попадают на эти домены, но предположили, что в атаках использовался целевой фишинг — рассылки по электронной почте.
Вредоносные ZIP-архивы содержали по два файла. Первый — легитимный PDF без какого-либо «зла». При этом в тексте PDF упоминалось название второго документа из архива. Он представлял собой файл с двойным расширением — LNK. По сути, это классическая история с ярлыком Windows, содержащим вредоносный код.
При открытии LNK-файла срабатывала ссылка на загрузку и установку вредоносного инсталлятора attachment.msi с удаленного хоста (чуть позже мы о нем поговорим). Жертва ничего не замечала, поскольку после установки вредоносного пакета мгновенно открывался настоящий документ.
Нам удалось найти несколько документов-приманок:
По таймлайну приманок мы смогли примерно понять длительность всей кампании. Первый документ мы обнаружили еще в 2021 г., а основное количество заражений произошло в 2022-м.
Перейдем к техническим деталям цепочки заражения.
Stage 0. Инсталлятор
Внутри attachment.msi находятся три файла:
- service_pack.dat — зашифрованный следующий стейдж;
- runservice_pack.vbs — декриптор, который расшифровывает и запускает service_pack.dat;
- легитимный документ, который отображается жертве, чтобы она ничего не заподозрила.
Фактически runservice_pack.vbs — это простой скрипт, который запускает PowerShell. Вся полезная нагрузка закодирована в Base64. Внутри — декриптор на PowerShell, который читает первый файл из архива и расшифровывает при помощи операции XOR.
Любопытно, что первые три операции в данном случае абсолютно бесполезны (см. выделенный фрагмент на рис. 6), поскольку исходный массив не перезаписывается. Срабатывает только последний XOR — с байтом 0xFF.
Stage 1. PowerShell-дроппер
После расшифровки файла service_pack.dat мы увидели, что следующий стейдж — не финальный. Это дроппер, который позволяет закрепиться в системе через менеджер запланированных задач. С его помощью на устройстве жертвы каждый день запускается следующая полезная нагрузка (создается scheduled-таск WindowsActiveXTaskTrigger).
Stage 2. PowerMagic
Полезная нагрузка следующего этапа — сам вредоносный имплант, который получает команды от оператора. Мы назвали его PowerMagic, поскольку злоумышленники дали такое имя папке, в которую записывается имплант в коде одного из семплов.
Судя по образцам PowerMagic, которые мы видели, в качестве командного сервера использовались OneDrive или Dropbox. Зловред получал команды из облачной папки и загружал в нее все результаты — по пути, который содержит идентификатор жертвы и временную метку:
/$AppDir/$ClientResultDir/<UUID зараженного компьютера>.<временная метка>
Stage X. CommonMagic
Однако одним PowerShell в настоящей целевой атаке не обойтись. У всех жертв, зараженных PowerMagic, мы обнаружили более сложный вредоносный имплант — фреймворк, который мы назвали CommonMagic. Он состоит из нескольких модулей — EXE-файлов, работающих в отдельном процессе. Эти процессы взаимодействуют между собой при помощи пайпов (именованных каналов). Кроме того, мы обнаружили модули для снятия скриншотов с экрана жертвы, кражи файлов с USB-носителей и др.
Скачанную у жертв информацию шифровал отдельный модуль. Данные передавались в него через пайп, шифрование осуществлялось с помощью RC5 (реализация из библиотеки RC5Simple). После этого информация отправлялась по пайпу в модуль для эксфильтрации, который загружал ее в облачное хранилище OneDrive.
Картина прояснялась, но по итогам анализа PowerMagic и CommonMagic оставалось непонятно, какая именно группировка стоит за этими атаками. В марте 2023 г. мы опубликовали наше исследование в блоге на Securelist и в Twitter.
Как оказалось, PowerMagic и CommonMagic анализировали не только мы. Пост в Twitter прокомментировал ресечер Хоссейн Джази (Hossein Jazi). До недавнего времени он работал в Malwarebytes: команда Джази проводила расследование той же вредоносной кампании, однако отчет им опубликовать не удалось. По словам самого ресечера, причина была в «чувствительной атрибуции».
Впоследствии цепочка пополнилась данными от других компаний. Например, благодаря коллегам из Positive Technologies нам удалось подтвердить гипотезу о том, что первоначальное заражение осуществляется через фишинговые письма, которые рассылаются якобы от лица госорганов.
В мае 2023-го Malwarebytes все же решилась опубликовать свое исследование несмотря на «чувствительность атрибуции». В отчете мы обнаружили много интересного: к примеру, коллеги нашли установщик PowerMagic 2020 г. (MSI-файл), а также дополнительные приманки из 2021-го.
Содержимое приманок было аналогично тому, что мы видели ранее — постановления и всевозможные законодательные акты.
Malwarebytes удалось понять, что происходит между заражением PowerMagic и последующей установкой CommonMagic. На устройствах жертв использовалась утилита Ngrok, предназначенная для проброса портов. Далее с ее помощью злоумышленники собирали информацию о жертве и устанавливали CommonMagic.
Эксперты Malwarebytes также нашли установщик CommonMagic. Он написан на PowerShell и раскладывает вредоносные модули по определенным папкам. В своем отчете мы указывали эти же директории.
Интересно, что команде Malwarebytes удалось продолжительное время следить за облаком OneDrive, в которое отправлялись данные жертв. Эксперты установили, что в нем создавались папки с именами на украинском языке.
Также команде Malwarebytes удалось ознакомиться с файлами, которые злоумышленники скачали у жертв.
И самое главное — в облачном хранилище были скриншоты с компьютера разработчика CommonMagic, сделанные во время тестирования вредоносного модуля. В результате экспертам удалось проследить за процессом разработки и отладки вредоноса.
Казалось бы, Malwarebytes получили возможность следить за самими злоумышленниками. Это должно было пролить свет на группировку, которая стоит за атаками. Однако сделать это экспертам не удалось — атрибуция оказалась непростой задачей.
«In this case, attributing the attack to a specific country is not an easy task», — Malwarebytes.
Глава 2. Облачный чародей
Теперь поговорим о новой, недавно обнаруженной нами угрозе — CloudWizard. Кампания интересна тем, что вредоносное ПО, которое в ней используется, намного сложнее описанного в первой главе. Больше вредоносных модулей, более качественный код и т. д. Кроме того, жертвы располагаются не только в регионах, где мы встречали CommonMagic, но и в центральной и западной частях Украины. В данном случае атаки были нацелены на дипломатические представительства и научно-исследовательские организации.
В данных телеметрии мы обнаружили подозрительную службу, которой управляла DLL’ка, расположенная в не менее подозрительной директории C:\ProgramData\Apparition Storage\syncobjsup.dll. Мы начали анализировать DLL и поняли, что при помощи алгоритма RC5 она расшифровывает файл mods.lrc, лежащий в той же папке. Однако при попытке расшифровать этот файл по RC5 мы получили лишь случайные байты. Тогда мы решили подробнее рассмотреть реализацию алгоритма расшифровки и увидели в декомпиляторе следующую процедуру (см. рис. 20).
Во внутреннем цикле указана неправильная переменная — i вместо j. Выходит, злоумышленники допустили ошибку в коде. Если поменять i на j, мы получим корректную реализацию алгоритма RC5.
Мы начали искать в открытых источниках аналогичную неправильную реализацию RC5 и, как ни странно, вышли на GitHub, а точнее, на Gist. Один из разработчиков опубликовал ее на языке C, а пользователи даже указали в комментариях на ошибку в цикле.
Любопытно, что в интересующей нас кампании злоумышленники использовали тот же ключ шифрования, который был в коде на Gist (он полностью позаимствован оттуда). Однако версию о том, что разработчик и является злоумышленником, мы отмели сразу. Его пример кода с ошибкой — одна из первых ссылок, которые поисковик выдает по запросу «RC5 C Implementation github».
VFS
Итак, теперь мы умеем расшифровывать mods.lrc, зашифрованный модифицированным RC5. Оказалось, что этот файл — полноценная виртуальная файловая система (VFS), содержащая несколько записей: json-конфигурацию и три DLL’ки. Злоумышленники назвали их Main, Crypton и Internet.
Служба syncobjsup.dll расшифровывает VFS и передает управление в основной модуль — Main (далее будем называть его оркестратором).
Структура VFS подразумевает наличие перед каждой записью магических байтов СiСi. Дальше идет хеш имени модуля (используется ROR6), размер модуля и сам бинарный файл или конфиг — в зависимости от того, о какой записи идет речь.
Оркестратор
Перейдем непосредственно к оркестратору, потому что он начинает исполняться после отработки syncobjsup.dll. В нем также используется ROR6-хеш, но чтобы вызывать API-функции не по имени, а по значению хеша от имени. Цель — усложнить анализ бинарного файла. Дальше происходит инжект в легитимный процесс WMI Provider Host — WmiPrvSE.exe. Следом запускаются модули Crypton и Internet, которые хранятся в VFS.
Оркестратор может загружать и запускать дополнительные модули. К примеру, подгружать .exe, .dll и произвольные шеллкоды, получая их от командного сервера. Кроме того, оркестратор регулярно шлет heartbeats — данные в формате JSON, в которых есть информация о зараженном компьютере и состоянии импланта (какие модули и каких версий уже подгружены).
Оркестратор получает команды для управления модулями, которые тоже представляют из себя данные в JSON. Это могут быть команды на удаление модуля, остановку, перезапуск и загрузку новых модулей или же изменение их конфигураций.
В начале каждой команды находятся магические байты: DE AD BE EF. Далее идет порядковый номер команды, ее размер, команда или конфигурация для модуля (если злоумышленник подгружает новый модуль или меняет конфигурацию — тоже в JSON) и непосредственно бинарный файл (если нужно залить новый модуль).
Модуль шифрования
Crypton — внутреннее название модуля шифрования. В нем используется комбинация из двух алгоритмов: AES и RSA. В принципе, это стандартная схема для продвинутых вредоносов. Если нужно отправить какие-либо данные на сервер, модуль шифрует их временным ключом AES, а затем шифрует сам временный ключ при помощи RSA.
Публичный ключ шифрования находится в конфиге. Команды, которые приходят в ответ от сервера, зашифрованы только AES с ключом из конфига.
Модуль обмена данными
Все шифрованные данные обрабатывает модуль Internet. Он взаимодействует с облачными сервисами OneDrive, Dropbox и Google Drive. По умолчанию — OneDrive, но если ресурс недоступен, модуль переключается на Dropbox и Google Drive.
Модуль заходит на сервер с OAuth при помощи Access- и Refresh-токенов и выгружает данные в определенную папку. Из другой папки он берет команды. После этого файлы команд удаляются из облака.
В коде Internet даже предусмотрена ситуация, в которой он теряет доступ ко всем облачным сервисам. В этом случае модуль отправляет запрос на резервный веб-сервер, чтобы получить новые токены. Они записываются в конфигурацию и используются при дальнейшем общении.
Модули сбора информации
Также в CloudWizard есть целый пакет модулей для сбора информации. Отметим, что наборы модулей, которые приходят конкретным жертвам, подбираются индивидуально и могут отличаться друг от друга.
К примеру, один из модулей осуществляет запись звука через микрофон компьютера. Он работает по стандартной схеме — через Windows API, конвертируя запись в MP3. Но не обошлось и без капельки магии. Когда человек пользуется микрофоном на Windows 10 или 11, в панели задач появляется соответствующая иконка.
Бывает смешно, когда кернеловая malware таким образом обнаруживает свое присутствие, потому что бдительный пользователь наверняка заметит появление иконки. В нашем случае разработчики так просто не палились и отключали ее через реестр. В нем есть ключ, отвечающий за битовую маску включенных и отключенных иконок.
Другой интересный модуль CloudWizard крадет письма из веб-клиента Gmail. Причем он делает это довольно необычно: смотрит, какие браузеры установлены у пользователя, берет из них базы данных и ищет куки от Gmail. С их помощью модуль заходит на legacy-версию веб-клиента Gmail.
Злоумышленники используют для атаки именно legacy-версию, потому что ее HTML-код проще парсить. Когда пользователь впервые в нее заходит, Gmail спрашивает: «Не хотите ли воспользоваться чем-то поновее?». Если это сообщение приходит модулю в ответ на один из запросов, он эмулирует нажатие кнопки «Хочу использовать legacy-версию». Для этого модуль парсит исходный код сообщения, извлекает из него ссылку, которая соответствует кнопке, и делает POST-запрос.
После получения доступа к legacy-версии Gmail модуль выкачивает все сообщения с аттачами, контакты и историю активности пользователя с IP-адресами. Любопытно, что код этого модуля был частично позаимствован из попавшего в публичный доступ исходного кода Hacking Team.
Помимо уже упомянутых инструментов, в CloudWizard также есть модули:
- для снятия скриншотов;
- кейлоггинга;
- копирования файлов с устройства;
- сбора информации об ОС;
- листинга директорий;
- поиска сетевых шар;
- сбора паролей.
Как все устанавливается
Для формирования полной цепочки не хватало одного звена: мы не понимали, как злоумышленники устанавливают CloudWizard жертвам. Тогда мы обратились к историческим данным. В поисках семплов других версий CloudWizard мы нашли NSIS-инсталлятор 2020 г., который работает следующим образом:
- кидает файлы на диск;
- для персистента создает службу с именем WinSubSvc;
- отображает сообщение «Well done!».
При этом других окон не появляется: никаких тебе «Добро пожаловать в инсталлятор!» или «Нажмите далее, чтобы продолжить». Мы предположили, что этот инсталлятор используется при заражении устройств, к которым у злоумышленников есть физический доступ. Человек подходит к компьютеру, вставляет флешку, запускает инсталлятор и видит сообщение «Well done!». Также возможно, что приложение мимикрирует под программу для настройки, ведь в заголовке окна с этим сообщением указано «Network settings».
Версия CloudWizard, которую устанавливал инсталлятор, отличалась от той, о которой мы рассказывали ранее, — как минимум номером. В бинарном файле вредоносов зашиты пути к исходному коду на компьютере разработчика. В старом была версия 4 (D:\Project\Work_2020\Soft_Version_4\Service), а в новом — версия 5 (D:\Project\Work_2020\Soft_Version_5\Service).
Были отличия и в архитектуре. В старой версии шифрование и передача данных реализованы в основном модуле, в новой — поделены между Crypton и Internet. Также в пятой версии используется более криптостойкое шифрование — комбинация AES и RSA. В четвертой применяется реализация RC5 из библиотеки RC5Simple.
Глава 3. Корм для рыб
Пора начинать обещанный экскурс в историю — перенесемся на семь лет назад. В 2016 г. ESET опубликовала исследование о новой APT-группировке, которая занималась кибершпионажем на Украине. Ее цели находились на тех же территориях, где встречался CommonMagic.
Кампанию назвали Operation Groundbait, или Prikormka (поэтому и «Корм для рыб»). ESET писали: «This threat is the first publicly known Ukrainian malware that is being used in targeted attacks».
В исследовании было указано следующее:
- кампания активна с 2008 г. (тогда были обнаружены первые семплы);
- жертвы находятся на Украине и в зоне российско-украинского конфликта;
- приманки в целом напоминают документы, которые мы показывали выше (см. рис. 3 и рис. 12). Это тоже были законодательные акты и т. п.
Наконец, ответим на важный вопрос: почему Prikormka? Дело в том, что в одну из приманок злоумышленники поместили таблицу со списком прикормок для рыб. Жертва думала, что они содержат натуральный бетаин, но это был многомодульный фреймворк, который проводит операции кибершпионажа :)
Архитектура
У Prikormka интересная модульная архитектура. Есть персистентный модуль, который запускает загрузчик или оркестратор. Последний, в свою очередь, загружает с сервера модули, которые начинают работать на устройстве жертвы и собирать данные. Далее оркестратор отправляет информацию злоумышленникам.
BugDrop
Переходим к следующей APT-кампании из прошлого — BugDrop. Команда CyberX обнаружила ее в 2017 г. Исследования уже нет на сайте компании, но его можно посмотреть через web archive.
Эксперты отмечали, что между BugDrop и Prikormka есть связь. Среди схожих черт можно отметить:
- виктимологию;
- использование модульного фреймворка, включающего инструменты для прослушивания микрофона, записи экрана, кейлоггинга и др.
Отдельно отметим, что именно в BugDrop злоумышленники начали использовать Dropbox вместо командного сервера.
Глава 4. Все переплетено
А теперь сведем все эти истории воедино и сформируем таймлайн — все в лучших традициях фильмов Кристофера Нолана ;)
Первый интересный факт. Эксперты CyberX указали в отчете, что BugDrop похожа на Prikormka по тактикам, техникам и процедурам, но четких доказательств не привели. Мы подробно проанализировали семплы и подтвердили гипотезу о том, что у BugDrop и Prikormka есть общие корни. В качестве примера возьмем PDB-путь модуля для кражи документов (специалисты ESET назвали его DOCS_STEALER).
В одной из презентаций 2019 г. ESET — первооткрыватели Prikormka — упоминают, что нашли файл с именем etwdrv.dll (имя в таблице экспортов: LCrPsdNew.dll). Их вердикт — это троян Win64/Prikormka.BF. Файл с таким же названием (и именем в таблице экспортов) создает на диске установщик четвертой версии CloudWizard.
Другие компоненты четвертой версии CloudWizard, согласно данным мультисканеров, ESET также детектит как Prikormka.
В коде BugDrop и CloudWizard тоже есть сходства. Рассмотрим модуль, который крадет данные с USB-устройств (см. рис. 41). Чтобы понять, с каких флешек данные уже загружены, а с каких еще нет, он получает список идентификаторов устройств, подключенных к компьютеру. В BugDrop и CloudWizard этот процесс реализован одинаково — с помощью IOCTL_STORAGE_QUERY_PROPERTY.
Если идентификатор получить не удается, вместо него записывается строка undef (см. рис. 42). В открытом доступе мы не нашли аналогичного кода.
Переходим к модулям, которые делают скриншоты. В Prikormka и CloudWizard совпадает список окон, при появлении которых частота съемки увеличивается, — это Skype и Viber. Сходится и интервал между созданием снимков: по умолчанию — 15 минут.
Сходства обнаруживаются и в модулях листинга директорий. Они выдают данные в одинаковом формате: пять табов, затем размер файла в скобках, число, месяц и год последней модификации.
Также мы нашли в Prikormka и CloudWizard практически одинаковые списки расширений, которые используются для фильтрации файлов. Разве что в пятой версии CloudWizard нет TBB — расширения базы почтового клиента The Bat!, который сейчас мало кто использует.
CloudWizard и Prikormka также объединяют имена файлов, которые отправляются на сервер в формате dd.mm.yy_hh.mm.ss.<ext> и dd.mm.yyyy_hh.mm.ss.ms.dat. При этом командные серверы обеих кампаний размещены на хостингах украинских провайдеров. Сходится и виктимология: жертвы находятся в зоне российско-украинского конфликта, в центральной и западной частях Украины.
При чем здесь CommonMagic
У CommonMagic, о котором мы рассказали в начале статьи, тоже есть сходства с CloudWizard. К примеру, взаимодействие с OneDrive у них реализовано одинаково. Причем это тот самый код со скриншотов из исследования Malwarebytes (см. рис. 16).
Следующий момент — уже упомянутый алгоритм шифрования RC5 из библиотеки RC5Simple. Код не просто взят из библиотеки, в нем есть важное изменение — 7-байтовый заголовок, который содержат все шифротексты. В оригинальной библиотеке это RC5SIMP (см. рис. 47), в CloudWizard четвертой версии — DUREX43 (см. рис. 48), а в CommonMagic — Hwo7X8p (рандомные 7 байт).
Также мы заметили, что в CommonMagic и CloudWizard используются схожие ID жертв: в них есть дата, за которой следуют две заглавные буквы.
Также есть схожесть в именах файлов с временной меткой и расширением .dat.
Отдельно отметим уже привычную нам виктимологию: зона российско-украинского конфликта, западная и центральная части Украины.
Развязка
О чем все это говорит? О том, что все эти кампании связаны! Со средней (и даже высокой) долей вероятности можно утверждать, что Prikormka, BugDrop, CloudWizard и CloudMagic написаны одним и тем же автором.
В итоге вырисовывается следующая цепочка:
- В 2008 г. начали появляться первые семплы Prikormka.
- Почти через 10 лет ESET выпускает отчет о Prikormka (Operation Groundbait), по следам которого CyberX нашли BugDrop.
- В 2017 г. появилась четвертая версия CloudWizard. Ее зарефакторили в 2020-м — появилась пятая версия.
- Далее к арсеналу злоумышленников добавились PowerMagic (инструмент на PowerShell) и фреймворк CommonMagic.
Финальный таймлайн выглядит следующим образом (см. рис. 53).
Получается, злоумышленники работают более 15 лет! Мы начали расследование со скучных PowerShell-скриптов и никак не ожидали, что оно выльется в столь масштабное исследование. На данный момент мы не наблюдаем активности, связанной с этими группировками, однако продолжаем следить за изменениями в ландшафте киберугроз для выявления новых вредоносных кампаний наподобие CommonMagic и CloudWizard.