Введение
В данной статье разбирается JavaScript‑файл, предназначенный для выполнения в Windows Script Host (WSH). Представленный код является вредоносным фреймворком, маскирующимся под вспомогательную библиотеку, но по факту реализующим:
полный доступ к файловой системе;
управление процессами;
сбор системной информации (fingerprinting);
сетевые операции;
взаимодействие с WMI;
механизмы сокрытия полезной нагрузки.
По своей структуре код очень близок к AutoIt API, что прямо указывает на его назначение - портирование AutoIt‑вредоносов в JScript.
Идентификация образца
Хеши файла:
MD5 49e68f02d9a2464da06333acf669d72d SHA1 f7c516131eed61718cd4d8dc986f3d15a1074ef6 SHA256 545af4e3a9f7f9cc45e00fe549c8213fdb5bf96e192b42634bbd7771b2fc030d SSDEEP 768:/YJxjJHL4N87VBBBbsrlSp0WK5UyJSTn+n5YeJDT/itJoytilPJgqF3u6q6u9HVm:QJxFsVVT/NGWGqF3a1Uflva0QxhP5O
Тип файла: WSH JScript malware framework.
Архитектура вредоносного кода
Код можно логически разделить на 6 крупных модулей:
Механизм скрытых ресурсов
Полифиллы и маскировка под легитимный JS
WSH / ActiveX инфраструктура
Сбор системной информации (recon)
Управление процессами
Файловая система и диски
Скрытые ресурсы в комментариях
Ключевая идея
Function.prototype.GetResource = function (ResourceName) { if (!this.Resources) { ... this.toString().replace(/\/\*(\[(?:[^\[]+)?\[)((?:[\r\n]|.)*?)\]\]\*\//gi, f); } return this.Resources[ResourceName]; }
Что происходит
Вредонос извлекает данные из комментариев вида:
/*[[PAYLOAD[ base64 / shellcode / js ]]*/
Код парсит собственный исходник
Извлекает данные между
/*[[ ... ]]*/Сохраняет их как ресурсы
Зачем это нужно:
- Обход сигнатур
- Хранение payload внутри одного файла
- Отсутствие внешних ресурсов
- Упрощение доставки
Это классическая техника fileless‑malware.
Полифиллы как маскировка
Код реализует ES5‑полифиллы:
Function.prototype.bindString.prototype.trimArray.prototype.indexOfforEach,map,filter,every,some
Почему это важно
Антивирусы часто используют эвристики:
«слишком много ActiveX» - подозрительно
«голый WSH» - подозрительно
Добавляя обычные JS‑конструкции, malware выглядит как:
«Обычная бизнес‑логика под IE6/IE7»
ActiveX как основа атаки
Создаются ключевые объекты:
var FSO = new ActiveXObject("Scripting.FileSystemObject"); var WshShell = new ActiveXObject("WScript.Shell");
Это полный контроль над системой:
чтение / запись файлов
запуск процессов
изменение текущей директории
доступ к окружению
Генерация случайных идентификаторов
function GenerateString(L) { return new ActiveXObject('Scriptlet.TypeLib') .Guid.replace(/[^\w]+/g,"").slice(0,L); }
Используется COM‑объект Scriptlet.TypeLib - редкий и плохо детектируемый.
Применение:
имена временных файлов
mutex‑ы
идентификаторы заражения
WMI как универсальный API
Функция‑обертка:
function WMIQuery(Moniker, Query) { var Service = GetObject(Moniker); var Items = Service.ExecQuery(Query); return new Enumerator(Items).toArray(); }
Через неё реализовано:
получение PID
путь к процессу
OS version
IP, MAC
информация о дисках
управление процессами
Полный fingerprint системы
Что собирается:
Категория | Примеры |
|---|---|
ОС | версия, билд, язык, service pack |
Пользователь | имя, домен |
Сеть | локальный IP, MAC, публичный IP |
Экран | разрешение, глубина |
Диски | тип, размер, serial |
Процессы | PID, путь |
Архитектура | x86/x64 |
Пример:
function GetPublicIPAddress() { var o = new ActiveXObject("MSXML2.XMLHTTP"); o.open("GET", "http://ifconfig.me/ip", false); o.send(); return o.responseText; }
- Утечка данных
- Внешний HTTP без TLS
- IOC: ifconfig.me
Управление процессами (Process Injection Prep)
Реализованы аналоги AutoIt:
ProcessExists() ProcessClose() ProcessWait() ProcessWaitClose() ProcessPath()
Назначение
закрытие антивирусов
ожидание запуска целевого процесса
подготовка к DLL / code injection
Полный файловый менеджер
Возможности
FileCopy,FileMove,FileDeleteDirCopy,DirMove,DirRemoveрекурсивное удаление
поддержка wildcard
работа с сетевыми дисками
Пример
function DirRemove(Path) { var main_folder = readoptions.GetFolder(Path); function DirWithSubFolders(_folder) { new Enumerator(_folder.SubFolders) .toArray() .forEach(function (f){ DirWithSubFolders(_folder); }); _folder.Delete(true); } DirWithSubFolders(main_folder); }
Функции валидации строк как часть AutoIt‑совместимого API
В коде реализован набор функций, полностью повторяющих семантику стандартных функций AutoIt (StringIsAlNum, StringIsAlpha, StringIsDigit, StringIsFloat).
Реализованные проверки
Функция | Назначение |
|---|---|
| Проверка на буквенно‑цифровую строку |
| Проверка на алфавитные символы |
| Проверка на ASCII‑строку |
| Проверка на числовую строку |
| Проверка числа с плавающей точкой |
Пример:
function StringIsAlNum(s) { return /^[0-9a-z]+$/i.test(s)?1:0; }
Почему это важно:
- Прямое копирование AutoIt API
- Повышение переносимости AutoIt‑вредоносов
- Унификация логики между разными языками
- Упрощение портирования loader’ов и RAT’ов
Фреймворк позволяет практически без изменений переносить AutoIt‑скрипты в JScript.
Ошибка дублирования функций как артефакт портирования
В коде присутствует критическая деталь:
//StringIsASCII function StringIsAlpha(s) { return /^[\u0000-\u007f]+$/gi.test(s)?1:0; }
Функция StringIsAlpha объявлена второй раз, но выполняет проверку ASCII, а не алфавита.
Что это означает:
- Типичная ошибка автопортирования
- Признак генерации кода
- Косвенное подтверждение AutoIt‑происхождения
- Вероятно, оригинальное имя было StringIsASCII
Подобные ошибки регулярно встречаются в AutoIt‑to‑JS malware‑фреймворках.
Работа с FileSystemObject как базовая инфраструктура
var readoptions = new ActiveXObject("Scripting.FileSystemObject"); var keratitises = readoptions.GetParentFolderName(WScript.ScriptFullName);
Назначение
Через Scripting.FileSystemObject вредонос получает:
абсолютный путь к собственному файлу
родительский каталог
возможность писать payload рядом со скриптом
доступ к любым путям в системе
keratitises - это рабочая директория malware, аналог $ScriptDir в AutoIt.
WMI‑инициализация с параметрами скрытого запуска
var sully = GetObject("winmgmts:root\\cimv2"); var napalming = sully.Get("Win32_ProcessStartup").SpawnInstance_(); napalming.ShowWindow = 0;
Что здесь происходит:
- Инициализация WMI‑контекста
- Создание объекта Win32_ProcessStartup
- Установка ShowWindow = 0
Это означает:
- все процессы запускаются полностью скрыто
- нет консольных окон
- нет UI‑артефактов
Используется для:
dropper’ов
загрузчиков
запуска DLL‑инжекторов
persistence‑модулей
Управление процессами через Win32_Process
var haircloths = sully.Get("Win32_Process");
Объект Win32_Process используется как backend для AutoIt‑подобных функций:
ProcessExistsProcessCloseProcessWaitProcessPath
Возможности:
- Получение PID
- Завершение процессов
- Ожидание запуска нужного EXE
- Определение пути процесса
Это критически важно для:
killing AV / EDR процессов
ожидания explorer.exe / browser.exe
stage‑2 injection
Unicode‑обфускация как контейнер полезной нагрузки
Переменная:
var ousel = "JỼ᩶ೆང⒄ࠓⳛ✬🐮🍒..."
Характеристики:
- Огромная строка
- Unicode + emoji
- Повторяющийся паттерн
- Невалидна как текст
Назначение
Это обфусцированный blob, который может содержать:
base64‑данные
XOR‑encoded payload
shellcode
JS‑stage
PE‑файл в Unicode‑представлении
Подобная техника:
- ломает сигнатурный анализ
- осложняет статический разбор
- маскирует энтропию
Комбинация техник сокрытия
На данном этапе вредонос использует сразу несколько уровней маскировки:
Техника | Назначение |
|---|---|
Unicode‑строки | Сокрытие payload |
ES5‑полифиллы | Маскировка под легитимный JS |
WMI | Уход от WinAPI‑хуков |
ActiveX | Полный доступ |
Inline‑ресурсы | Fileless‑подход |
Это не одиночный loader, а полноценный malware‑framework.
Проверка административных привилегий через запись в защищённые каталоги
function IsAdmin() { var path = readoptions.GetSpecialFolder(1) + "\\IsAdmin.txt"; try { f = readoptions.CreateTextFile(path,true); f.WriteLine("test"); f.Close(); readoptions.DeleteFile(path); return true; } catch(e) { return false; } }
Анализ
Метод определения прав администратора не использует API Windows напрямую, а применяет побочный эффект:
GetSpecialFolder(1)System32попытка создать файл
если операция успешна — процесс запущен с повышенными правами
Почему так делают в malware:
- Обходит UAC API
- Работает в WSH без WinAPI
- Не триггерит security‑события
- Типовой приём в dropper’ах
Используется для:
принятия решения об установке persistence
включения руткит‑функций
отключения защитных сервисов
Доступ к буферу обмена как канал утечки данных
Чтение clipboard
function ClipGet() { return new ActiveXObject("HTMLFile").parentWindow.clipboardData.getData("text"); }
Запись в clipboard
function ClipPut(data) { new ActiveXObject("WScript.Shell").Run( 'mshta.exe "javascript:window.clipboardData.setData(\'text\',\''+data+'\');close()"', 0 ); }
Назначение:
- Кража паролей
- Перехват криптокошельков
- Замена адресов BTC/ETH
- Side‑channel data exfiltration
Особенно важно: используется mshta.exe, что:
живёт в whitelist
часто разрешён AppLocker’ом
редко мониторится EDR
FileSelectFolder как примитив социальной инженерии
objShell.BrowseForFolder(hwnd, dialogText, flag, rootDir);
Функция полностью повторяет FileSelectFolder из AutoIt.
Возможности злоупотребления:
- Ввод пользователя в доверенный UI
- Выбор чувствительных директорий
- Маскировка malware под installer
- Использование как lure‑элемент
Пример сценария:
«Выберите папку для обновления»
![]()
%APPDATA%
Скрытый запуск процессов через WMI (без ShellExecute)
var objProcess = GetObject("winmgmts:\\\\.\\root\\cimv2:Win32_Process");
Отличия от WshShell.Run
Метод | Детекция |
|---|---|
WshShell.Run | Легко ловится |
ShellExecute | API‑хуки |
WMI Create | stealth |
Дополнительно:
objConfig.ShowWindow = 12;
процесс полностью невидим
Используется для:
загрузчиков
execution stage
lateral movement
RunWait как примитив синхронизации stage’ей
function RunWait(app, workingdir, show_flag, timeout) { var process = Run(app, workingdir, show_flag); ProcessWait(process, timeout); return process; }
Зачем это malware:
- Дождаться распаковки payload
- Дождаться запуска explorer.exe
- Синхронизация multi‑stage attack
Классическая архитектура:
Stage 1 → RunWait → Stage 2 → Inject
Работа с короткими путями как анти‑детекция
FileGetShortName("C:\\Program Files") → C:\PROGRA~1
Используется для:
- Обход сигнатур AV
- Обход path‑based rules
- Маскировка IOCs
- Устойчивость к локализации ОС
Управление ярлыками (.lnk) как механизм persistence
Создание shortcut
FileCreateShortcut(...)
Чтение shortcut
FileGetShortcut(...)
Почему это важно:
- Persistence без реестра
- Persistence без служб
- Persistence без планировщика
- Триггер по действию пользователя
Типовой сценарий:
StartupDesktopStart Menumasquerading под легитимный ярлык
Рекурсивный FileSearch как инструмент пост‑эксплуатации
FileSearch("%USERPROFILE%", "*.hta", callback)
Возможности:
- Поиск документов
- Поиск криптокошельков
- Поиск конфигов
- Поиск других malware
Особенность:
асинхронная остановка поиска (
FileSearchStop)контроль глубины
маски
.docx,.key,*.wallet
Массовая подмена временных меток (anti‑forensics)
FileSetTime(...)
Реализация:
- Генерируется .NET‑утилита
- Компилируется через jsc.exe
- Запускается скрыто
- Меняет timestamps рекурсивно
Что это даёт атакующему:
- Сокрытие времени заражения
- Анти‑форензика
- Обход timeline‑анализа
- Маскировка persistence
Это редкая и очень сильная функция, встречающаяся в APT‑tooling.
Общая классификация образца
На этом этапе можно утверждать:
Это не скрипт. Это malware SDK.
Поддерживаемые стадии kill‑chain
Этап | Реализация |
|---|---|
Initial access | HTA / WSH |
Execution | WMI |
Persistence | LNK |
Privilege check | IsAdmin |
Discovery | WMI / FileSearch |
Credential access | Clipboard |
Defense evasion | timestamps |
Command execution | Run / RunWait |
Вывод
Представленный JavaScript‑файл является полноценным вредоносным фреймворком под Windows Script Host, обладающим функциональностью, значительно превышающей возможности обычного скрипта. Основные характеристики:
AutoIt‑подобная архитектура — большинство функций повторяют стандартные API AutoIt, что упрощает портирование существующих вредоносов в JScript.
Полный контроль над системой — через ActiveX и WMI код получает доступ к файловой системе, процессам, окружению и сетевым ресурсам.
Stealth и анти‑детекция — использование Unicode‑обфускации, ES5‑полифиллов, скрытого запуска процессов, работы с короткими путями и временными метками позволяет обходить антивирусы и EDR.
Persistence и социальная инженерия — создание ярлыков, диалогов выбора папок, скрытые процессы и манипуляции с clipboard делают malware гибким и трудноотслеживаемым.
Многоступенчатая архитектура — функции Run/RunWait, FileSearch и управление процессами позволяют реализовать multi‑stage атаки с синхронизацией и подготовкой к инъекциям.
Anti‑forensics — изменение timestamps файлов и папок скрывает следы заражения и осложняет анализ для цифровой криминалистики.
В совокупности эти элементы делают образец универсальным malware SDK, пригодным для реализации:
RAT и stealer‑модулей
загрузчиков и dropper’ов
lateral movement toolkit
инструментов обхода защиты и сокрытия активности
