CMD: новая волна злокодинга

в 14:21, , рубрики: cmd, jscript, powershell, vbscript

Командный язык 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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js