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 самого хоста и вариативность запуска командных сценариев, получаем очередную порцию головной боли из Рэдмонда.

ссылка на оригинал статьи http://habrahabr.ru/post/253887/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *