Введение

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

  1. Механизм скрытых ресурсов

  2. Полифиллы и маскировка под легитимный JS

  3. WSH / ActiveX инфраструктура

  4. Сбор системной информации (recon)

  5. Управление процессами

  6. Файловая система и диски

Скрытые ресурсы в комментариях

Ключевая идея

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.bind

  • String.prototype.trim

  • Array.prototype.indexOf

  • forEach, 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, FileDelete

  • DirCopy, 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).

Реализованные проверки

Функция

Назначение

StringIsAlNum

Проверка на буквенно‑цифровую строку

StringIsAlpha

Проверка на алфавитные символы

StringIsASCII

Проверка на ASCII‑строку

StringIsDigit

Проверка на числовую строку

StringIsFloat

Проверка числа с плавающей точкой

Пример:

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‑подобных функций:

  • ProcessExists

  • ProcessClose

  • ProcessWait

  • ProcessPath

Возможности:

- Получение 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 без планировщика
- Триггер по действию пользователя

Типовой сценарий:

  • Startup

  • Desktop

  • Start Menu

  • masquerading под легитимный ярлык

Рекурсивный 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

  • инструментов обхода защиты и сокрытия активности