Введение
В данной статье разбирается 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
инструментов обхода защиты и сокрытия активности
