Командный язык Windows весьма скуден, но даже несмотря на это, множество энтузиастов со всего мира продолжают с ним экспериментировать, открывая подчас вещи весьма неожиданные, которые, наверное, все же правильнее было бы назвать багами. Как бы там ни было, факт остается фактом: скриптовая (и не только) малварь была, есть и будет покуда существует IT-индустрия (а не только Microsoft, как полагают многие). Речь пойдет о лазейках в командных сценариях, позволяющих комбинировать их «бесшовно» с другими технологиями, что может быть использовано как во благо, так и во вред, так что давайте условимся сразу: все изложенное ниже является лишь информацией к размышлению, а не руководством к действию, карающемуся органами в погонах.
Лет эдак девять-десять тому назад попадалась мне заметка одного буржуина, описывающая то, каким образом можно запустить командный сценарий как JScript:
@set @script=0 /*
@echo off
set @script=
cscript /nologo /e:jscript "%~f0"
exit /b
*/
WScript.echo('Hello, world!');
Тогда я не придал этому особого значения, а спустя пару лет стало очевидно, что зря. Народные умельцы быстро приспособили данный трюк в своих корыстных целях, плодя и множа скрипты, поражающие изворотливостью ума их авторов. Неудивительно, что вскоре неким анонимусом был открыт трюк, позволяющий запускать командные сценарии как VBScript, причем без временных файлов.
::'@cscript /nologo /e:vbscript "%~f0"&exit /b
WScript.Echo "Hello, world!"
У VBScript перед JScript есть ряд преимуществ, например, он перемалывает тип VARIANT, не говоря уже о том, сколько кода на нем написано. Но это лирика, а по факту CMDVBscript выше — не самый удачный ход, так как некоторые текстовые процессоры могут искажать символ Ctrl+Z между апострофом и символом собачки, а потому закладываться на почку об эффективности данного подхода не стоит.
Мои эксперименты с PowerShell, а также то, о чем написано выше, привели к следующему:
<# :
@echo off
powershell /nologo /noprofile /command ^
"%*))}"
exit /b
#>
Write-Host Hello, $args[0] -fo Green
Замечу, что трюк работает в PowerShell -ge 2, так как многострочные комментарии были введены в PS со второй версии. В отличие от интепретатора WSH, PowerShell также «смотрит» на расширение файла, а значит подсунуть ему .cmd.bat не получится. Читаем файл целиком (cat """%~f0"""), полученный массив строк объединяем в строку (ScriptBlock работает со строками), далее создаем собственно скрипт-блок, вызываемый методом Invoke (метод вполне допускает нулевое количество аргументов, что задействуется при проецировании аргументов командной строки в аргументы PowerShell).
Помнится в СМИ всплывала информация на тему вирусов, сооруженных на PowerShell, правда, не уточнялось, каким образом они запускаются в системе. Учитывая, что в распоряжении PowerShell не только COM'ы, но и типы .NET, а также имеющиеся лазейки в ExecutionPolicy самого хоста и вариативностью запуска командных сценариев, получаем очередную порцию головной боли из Рэдмонда.
Автор: gregzakharov