Исследователи зафиксировали атаку, в которой злоумышленники сочетали агрессивную социальную инженерию с использованием Deno - защищённой среды выполнения JavaScript и TypeScript на движке V8. Вредоносная кампания была направлена на рядовых сотрудников, а её отличительной чертой стала не традиционная скомпилированная вредоносная программа, а модульный Remote Access Trojan на базе Deno, состоящий из четырёх JavaScript-файлов. Сам имплант и его канал управления не были заблокированы при первоначальном запуске конечной системой защиты, что подчёркивает необходимость мониторинга не только бинарных файлов, но и скриптовых рантаймов.
Описание
Событие началось с массированной рассылки электронных писем. В течение дня три сотрудника получили сотни сообщений. Большинство из них было отфильтровано почтовым шлюзом, однако значительная часть всё же достигла почтовых ящиков. Такая атака, известная как mailbombing, преследовала две цели. Во-первых, она создавала у пользователей усталость и путаницу. Во-вторых, она давала правдоподобный повод для звонка от "техподдержки" - именно так злоумышленники обосновали свой следующий шаг.
Сразу после почтового флуда целевые пользователи получили звонки через Microsoft Teams от внешнего аккаунта, который выдавал себя за сотрудника внутренней IT-поддержки. Двое сотрудников не ответили, один - поднял трубку. Злоумышленник представился специалистом, реагирующим на проблему с почтой. Для повышения доверия использовались внутренний контекст компании и имена работников, вероятно, собранные из открытых источников вроде LinkedIn. Социальная инженерия сработала потому, что совпала с непосредственным опытом пользователя - его почтовый ящик явно атаковали, и кто-то, представившийся IT-поддержкой, предлагал помощь.
Согласно данным телеметрии, этот звонок сгенерировал событие TeamsImpersonationDetected в журнале аудита Microsoft 365, поскольку вызывающий использовал подозрительную внешнюю tenant-идентификацию, напоминающую внутреннюю IT-учётную запись. Организациям рекомендуется отслеживать подобные сигналы, особенно при совпадении со всплесками входящего спама, запросов на сброс пароля или других индикаторов mailbombing. Корреляция оповещений от платформ совместной работы с почтовой телеметрией может дать раннее предупреждение до выполнения вредоносного кода.
В ходе разговора жертву направили на поддельный портал самообслуживания, который имитировал легитимный рабочий процесс. Страница предложила скачать файл patch09913.b, который на самом деле являлся архивом, распаковываемым штатным средством Windows tar. Пользователю было велено извлечь содержимое ZIP-архива в каталог AppData\Roaming\DenoJSEnv и запустить основную нагрузку через команду: conhost --headless C:\u...\DenoJSEnv\deno.exe --allow-run C:\u...\DenoJSEnv\app.js.
Выбор Deno в качестве среды выполнения обусловлен несколькими факторами. В отличие от Node.js, Deno по умолчанию безопасен - для доступа к чувствительным ресурсам (файловая система, сеть, переменные окружения, запуск процессов) требуются явные флаги разрешений. Автор вредоносной программы адаптировался к этой модели, разделив функциональность на несколько скриптов, каждый из которых запускался с узким набором прав. В результате получилась модульная архитектура.
Первый модуль app.js выполняет роль дроппера и оркестратора. Он определяет путь к deno.exe и запускает три остальных модуля как фоновые дочерние процессы: back.js (мост управления и контроля), helper.js (движок выполнения команд) и webui.js (TCP-прокси и модуль перехода). Каждый модуль получает только необходимые разрешения. Например, back.js использует --allow-run и --unsafely-ignore-certificate-errors, helper.js - --allow-run и --allow-env, webui.js - --allow-net. Такое разделение операционно выгодно для атакующего: если один компонент выходит из строя, остальные продолжают работу, а анализ усложняется, так как ни один файл не содержит полного функционала.
Модуль back.js устанавливает WebSocket-соединение с C2-сервером, размещённым на CloudFront. Это затрудняет сетевую триаж - трафик выглядит как обращение к легитимной CDN-инфраструктуре. Сразу после подключения модуль отправляет локальный HTTP-запрос к helper.js, указывая выполнить разведывательную команду: set && ipconfig /all && route print && tasklist. Собранные данные позволяют оценить возможности хоста, выявить сетевые сегменты и спланировать перемещение внутри сети. Кроме того, back.js устанавливает постоянство (persistence) записью в ветку реестра HKCU\Software\Microsoft\Windows\CurrentVersion\Run с ключом Deno_AutoRun.
Модуль helper.js представляет собой простой HTTP-сервер на 127.0.0.1:10021. При POST-запросе на /exec он извлекает команду из JSON-тела и выполняет её через cmd.exe /c, возвращая результат. Такая изоляция не позволяет сетевому компоненту напрямую выполнять команды - он лишь ретранслирует запросы внутреннему сервису. Это снижает подозрительную активность в процессе, работающем с сетью.
Модуль webui.js даёт импланту способность к проксированию. Он слушает порт 10022 и предоставляет эндпоинты /connect (открывает TCP-сокет к цели), /send (отправляет данные в поток) и /closesocket. Сокетный трафик из внутренней сети захватывается, кодируется в base64 и отправляется обратно через back.js атакующему. Таким образом, скомпрометированный хост становится точкой перехода (pivot) для доступа к ресурсам, недоступным извне: сканирование портов, перебор сервисов, взаимодействие с базами данных и SMB.
Ключевой аспект данного инцидента - активная на хосте система защиты (EDR) не выявила сам имплант и его канал связи; тревога сработала только на последующие действия разведки (LDAP-запросы и проверки сертификатов). Если бы атакующие уделили больше внимания методам сокрытия, канал управления мог бы остаться незамеченным значительно дольше. Для обнаружения подобных угроз защитникам следует отслеживать не только хэши файлов, но и необычные сценарии выполнения Deno: запуск из каталогов, доступных для записи пользователем, присутствие флагов --allow-run, --allow-env, --allow-net, наличие локальных HTTP-сервисов на loopback-интерфейсах, а также появление процессов deno.exe, порождающих cmd.exe. Дополнительным индикатором служит процесс conhost.exe --headless, оборачивающий нестандартные дочерние процессы.
Завершающий вывод состоит в том, что атакующие продолжают комбинировать социальную инженерию с легитимными средами выполнения, обходя традиционные предположения о том, как должно выглядеть вредоносное ПО. Модель разрешений Deno была спроектирована для повышения безопасности, но злоумышленники адаптировались, создав модульный имплант, в котором каждый компонент запрашивал только минимально необходимый доступ. Сильнейшие сигналы в этом случае лежали не в обфусцированном JavaScript, а в окружающем поведении: почтовая бомбардировка, подмена учётной записи Teams, запуск Deno из %APPDATA%, подозрительные флаги разрешений, слушатели на loopback и фоновый консольный процесс. Эффективная защита требует корреляции телеметрии из источников идентификации, почты, конечных точек, процессов, реестра и сети.
Индикаторы компрометации
Domains
- d2cff16eusb8mg.cloudfront.net
SHA256
- 2ed6fdfa5f9120306167ba5d8d48a62dbe5fd0d05e87c33c9784f08698f8a66b
- 3b48a334dcf0a08bed2a9766fd553474ae3014db600b65573dfee0f183e9d1d9
- 3d8afae76c5982458849d21221e089ee161266a4248b12ea3048d1e79b76707e
- 9469268c421b7821f897deb2d4d2316b21ff5da35bef417aa4e284010ef78302
- d317371cf2b4cd524849551ffd3b97d91edbc17f6b39c8693217383ba6a0370d