[Из песочницы] CMD: новая волна злокодинга
Командный язык 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, не говоря уже о том, сколько кода на нем написано. Но это лирика, а по факту CMD\VBscript выше — не самый удачный ход, так как некоторые текстовые процессоры могут искажать символ Ctrl+Z между апострофом и символом собачки, а потому закладываться на почку об эффективности данного подхода не стоит.Мои эксперименты с PowerShell, а также то, о чем написано выше, привели к следующему:
<# : @echo off powershell /nologo /noprofile /command ^ "&{[ScriptBlock]::Create((cat """%~f""") -join [Char]10]).Invoke(@(&{$args}%*))}" 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 самого хоста и вариативность запуска командных сценариев, получаем очередную порцию головной боли из Рэдмонда.