Руководство по обходу политики выполнения PowerShell

Руководство по обходу политики выполнения PowerShell

В статье рассказывается, как без прав локального пользователя обойти запрет на выполнение скриптов в PowerShell, который становится препятствием для пентестеров и разработчиков в их работе.

image

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

Политика выполнения PowerShell (PowerShell Execution Policy) — это параметр, определяющий, какие типы сценариев PowerShell можно запускать в системе. По умолчанию для параметра установлено значение «Restricted». Когда этот режим активирован, PowerShell предоставляет только базовые команды интерактивной сессии командной строки, не позволяя загрузку и выполнение пользовательских сценариев. Параметр обеспечивает защиту от случайного или злонамеренного выполнения вредоносного кода.

Отметим, что режим «Restricted» может ограничить возможности PowerShell и повлиять на его функциональность. Поэтому существует несколько вариантов обхода этого параметра.

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

Основная и самая частая причина – автоматизация процессов. Также есть несколько других причин, по которым PowerShell стал популярным среди администраторов, пентестеров и хакеров:

  • Встроен в Windows;
  • Предоставляет возможность вызова API Windows;
  • Предоставляет возможность запускать команды без записи на диск;
  • Предоставляет возможность избежать обнаружения антивирусом;
  • Позволяет создавать наборы инструментов для пентеста с открытым исходным кодом.

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

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

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

Настройка тестовой среды

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

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

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

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

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

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

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

2. Отправьте сценарий в стандартный поток ввода PowerShell

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

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

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

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

Пример 2: Введите команду

4. Загрузите скрипт по URL-адресу и выполните его с помощью Invoke Expression.

Такой метод можно использовать для загрузки сценария PowerShell из Интернета и его выполнения без записи на диск. Способ также не приводит к каким-либо изменениям конфигурации.

5. Используйте переключатель функций PowerShell (Command Switch)

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

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

Пример 2: Укороченная команда

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

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

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

EncodeCommand Switch очень похож на Command Switch, но отображает все скрипты в кодировке Unicode/base64. Кодирование скрипта таким образом помогает избежать ошибок синтаксического анализа, с которыми вы сталкиваетесь при использовании Command Switch.

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

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

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

powershell.exe -Enc VwByAGkAdABlAC0ASABvAHMAdAAgACcATQB5ACAAdgBvAGkAYwBlACAAaQBzACAAbQB5ACAAcABhAHMAcwBwAG8AcgB0ACwAIAB2AGUAcgBpAGYAeQAgAG0AZQAuACcA

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

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

Следующую команду также можно использовать для переноса настроек политики выполнения с удаленного компьютера на локальный.

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

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

Команда не требует изменения конфигурации и записи на диск.

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

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

GC .runme.ps1 | iex

9. Используйте флаг Bypass

Флаг будет обходить политику выполнения, когда вы выполняете скрипты из файла. Microsoft заявляет, что при использовании флага «ничего не блокируется и не выводится никаких предупреждений или сообщений». Техника не влечет за собой изменения настроек и не требует записи на диск.

10. Используйте флаг Unrestricted

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

11. Используйте флаг Remote-Signed

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

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

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

Функцию можно выполнить через интерактивную консоль PowerShell или в сочетании с параметром «Command». После вызова функция заменит «AuthorizationManager» на null. В результате политика выполнения устанавливается на unrestricted до конца сессии.

Метод не приводит к постоянному изменению конфигурации и не требует записи на диск. Однако изменение будет применяться на протяжении всей сессии.

13. Установите Excution Policy для уровня Process

В начале статьи было сказано, что политику выполнения можно применять на многих уровнях, включая уровень Process, который вы контролируете. Такой способ позволяет установить политику выполнения на unrestricted на время сессии. Кроме того, команда не приводит к изменению конфигурации и не требует записи на диск.

14. Установите статус Unrestricted для уровня CurrentUser с помощью команды

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

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

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

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

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

Где кванты и ИИ становятся искусством?

На перекрестке науки и фантазии — наш канал

Подписаться