Специалисты Blackpoint Cyber обнаружили ранее не описанную связку вредоносных программ: модульный загрузчик и механизм закрепления HollowFrame, написанный на Go, доставлял бэкдор Matryoshka на Rust. Атаке подверглись два конечных устройства неназванной юридической фирмы. Кто стоял за операцией, исследователи пока не установили.
Первым пришло адресное фишинговое письмо со ссылкой на зашифрованный архив. Внутри находился файл ярлыка Windows формата LNK, замаскированный под документ с названием «Материалы дела». Расчёт понятен: для сотрудника юридической фирмы такое имя выглядит буднично и не вызывает лишних вопросов. Открытие ярлыка запускало многоступенчатую цепочку команд с использованием PowerShell.
PowerShell загружал следующие компоненты с сервера 2.26.252[.]84. Затем вредоносная цепочка повышала привилегии, ослабляла защитные механизмы Microsoft Defender и получала дополнительные файлы. Каждый отдельный шаг выглядел менее опасным, чем последующий: начальный ярлык не содержал всей логики заражения, загрузчик не раскрывал полную схему связи, а сетевые функции распределялись между разными модулями.
HollowFrame запускался через подменную загрузку DLL. Для этого использовалась пара из легитимного исполняемого файла python.exe и подложной библиотеки python311.dll. Windows воспринимала запуск Python как обычную операцию, но программа подхватывала DLL из контролируемого злоумышленником каталога. Такой приём позволяет спрятать вредоносный код за доверенным процессом и усложняет первичный разбор инцидента.
Перед продолжением заражения HollowFrame проверял среду. Он оценивал время работы системы после загрузки, объём установленной памяти, количество файлов в профиле пользователя и движение курсора. Пустой профиль, малая продолжительность сеанса или отсутствие человеческой активности могли выдать автоматическую песочницу. Для закрепления загрузчик создавал запланированную задачу, благодаря которой вредоносная цепочка могла снова стартовать после перезагрузки или входа пользователя.
Внутри HollowFrame находился зашифрованный встроенный контейнер. Загрузчик расшифровывал и распаковывал его, после чего начиналась вторая цепочка подменной загрузки DLL. На этом этапе в систему попадала Matryoshka в виде файла version.dll. Получилась конструкция с несколькими оболочками: внешний фишинговый ярлык запускал PowerShell, тот доставлял HollowFrame, а уже HollowFrame извлекал бэкдор.
HTTP-вариант Matryoshka связывался с управляющим сервером 45.158.196[.]184:8888. Он мог создавать или запускать командную оболочку, выполнять полученные команды, загружать инструменты и доставлять новые полезные нагрузки. Такой доступ открывал путь к краже учётных данных, перемещению между компьютерами фирмы и дальнейшему захвату доменной инфраструктуры. Набор последующих средств при этом не был жёстко зашит в первую стадию: оператор мог выбирать его уже после проникновения.
Blackpoint Cyber также восстановила вторую вредоносную DLL, wtsapi32.dll. Это оказался вариант Matryoshka, использовавший вместо обычного командного сервера закрытый репозиторий GitHub adioziaete/memio. Через GitHub бэкдор отправлял сигналы о присутствии, получал предназначенные конкретному устройству задания, проводил разведку, передавал результаты команд, пересылал файлы и забирал вторичные нагрузки.
Репозиторий был устроен как набор отдельных почтовых ящиков для заражённых узлов. Каждому компьютеру назначался каталог формата <computer>_<username>, где размещались файлы beacon.json, cmd.json и result.json. В ряде каталогов присутствовало дерево upload/ для доставки файлов. Оператор мог раздельно выдавать задания каждому хосту, получать ответы и передавать нагрузки без собственного выделенного C2-сервера. У схемы имелся неприятный для атакующего побочный эффект: GitHub сохранял версионную историю изменений, если связанные коммиты или весь репозиторий не удалялись.
Запрос к API GitHub показал, что связанная с репозиторием учётная запись была создана 6 января 2023 года, а данные профиля обновлялись ещё 7 июня 2026 года. Принадлежность аккаунта осталась неизвестной. Разделение функций между LNK-файлом, PowerShell, HollowFrame, двумя цепочками загрузки DLL и вариантами Matryoshka скрывало полный сценарий даже при обнаружении одного компонента, а использование GitHub отделяло управляющий канал wtsapi32.dll от HTTP-инфраструктуры version.dll.
Первым пришло адресное фишинговое письмо со ссылкой на зашифрованный архив. Внутри находился файл ярлыка Windows формата LNK, замаскированный под документ с названием «Материалы дела». Расчёт понятен: для сотрудника юридической фирмы такое имя выглядит буднично и не вызывает лишних вопросов. Открытие ярлыка запускало многоступенчатую цепочку команд с использованием PowerShell.
PowerShell загружал следующие компоненты с сервера 2.26.252[.]84. Затем вредоносная цепочка повышала привилегии, ослабляла защитные механизмы Microsoft Defender и получала дополнительные файлы. Каждый отдельный шаг выглядел менее опасным, чем последующий: начальный ярлык не содержал всей логики заражения, загрузчик не раскрывал полную схему связи, а сетевые функции распределялись между разными модулями.
HollowFrame запускался через подменную загрузку DLL. Для этого использовалась пара из легитимного исполняемого файла python.exe и подложной библиотеки python311.dll. Windows воспринимала запуск Python как обычную операцию, но программа подхватывала DLL из контролируемого злоумышленником каталога. Такой приём позволяет спрятать вредоносный код за доверенным процессом и усложняет первичный разбор инцидента.
Перед продолжением заражения HollowFrame проверял среду. Он оценивал время работы системы после загрузки, объём установленной памяти, количество файлов в профиле пользователя и движение курсора. Пустой профиль, малая продолжительность сеанса или отсутствие человеческой активности могли выдать автоматическую песочницу. Для закрепления загрузчик создавал запланированную задачу, благодаря которой вредоносная цепочка могла снова стартовать после перезагрузки или входа пользователя.
Внутри HollowFrame находился зашифрованный встроенный контейнер. Загрузчик расшифровывал и распаковывал его, после чего начиналась вторая цепочка подменной загрузки DLL. На этом этапе в систему попадала Matryoshka в виде файла version.dll. Получилась конструкция с несколькими оболочками: внешний фишинговый ярлык запускал PowerShell, тот доставлял HollowFrame, а уже HollowFrame извлекал бэкдор.
HTTP-вариант Matryoshka связывался с управляющим сервером 45.158.196[.]184:8888. Он мог создавать или запускать командную оболочку, выполнять полученные команды, загружать инструменты и доставлять новые полезные нагрузки. Такой доступ открывал путь к краже учётных данных, перемещению между компьютерами фирмы и дальнейшему захвату доменной инфраструктуры. Набор последующих средств при этом не был жёстко зашит в первую стадию: оператор мог выбирать его уже после проникновения.
Blackpoint Cyber также восстановила вторую вредоносную DLL, wtsapi32.dll. Это оказался вариант Matryoshka, использовавший вместо обычного командного сервера закрытый репозиторий GitHub adioziaete/memio. Через GitHub бэкдор отправлял сигналы о присутствии, получал предназначенные конкретному устройству задания, проводил разведку, передавал результаты команд, пересылал файлы и забирал вторичные нагрузки.
Репозиторий был устроен как набор отдельных почтовых ящиков для заражённых узлов. Каждому компьютеру назначался каталог формата <computer>_<username>, где размещались файлы beacon.json, cmd.json и result.json. В ряде каталогов присутствовало дерево upload/ для доставки файлов. Оператор мог раздельно выдавать задания каждому хосту, получать ответы и передавать нагрузки без собственного выделенного C2-сервера. У схемы имелся неприятный для атакующего побочный эффект: GitHub сохранял версионную историю изменений, если связанные коммиты или весь репозиторий не удалялись.
Запрос к API GitHub показал, что связанная с репозиторием учётная запись была создана 6 января 2023 года, а данные профиля обновлялись ещё 7 июня 2026 года. Принадлежность аккаунта осталась неизвестной. Разделение функций между LNK-файлом, PowerShell, HollowFrame, двумя цепочками загрузки DLL и вариантами Matryoshka скрывало полный сценарий даже при обнаружении одного компонента, а использование GitHub отделяло управляющий канал wtsapi32.dll от HTTP-инфраструктуры version.dll.