В статье рассказывается, как без прав локального пользователя обойти запрет на выполнение скриптов в PowerShell, который становится препятствием для пентестеров и разработчиков в их работе.
Политика выполнения PowerShell (PowerShell Execution Policy) — это параметр, определяющий, какие типы сценариев PowerShell можно запускать в системе. По умолчанию для параметра установлено значение «Restricted». Когда этот режим активирован, PowerShell предоставляет только базовые команды интерактивной сессии командной строки, не позволяя загрузку и выполнение пользовательских сценариев. Параметр обеспечивает защиту от случайного или злонамеренного выполнения вредоносного кода.
Отметим, что режим «Restricted» может ограничить возможности PowerShell и повлиять на его функциональность. Поэтому существует несколько вариантов обхода этого параметра.
Основная и самая частая причина – автоматизация процессов. Также есть несколько других причин, по которым PowerShell стал популярным среди администраторов, пентестеров и хакеров:
Перед использованием всех функций PowerShell злоумышленникам, возможно, придется обойти политику выполнения «Restricted». Мы можем посмотреть текущую конфигурацию с помощью команды PowerShell «Get-ExectionPolicy». Параметр по умолчанию имеет значение «Restricted».
Также стоит отметить, что политика выполнения может быть установлена на разных уровнях системы. Чтобы просмотреть их список, используйте следующую команду:
В приведенных примерах используется сценарий с именем «runme.ps1», который содержит следующую команду PowerShell для вывода сообщения на консоль:
Write-Host "My voice is my passport, verify me."
Когда пользователь пытается выполнить команду в системе, настроенной с политикой выполнения по умолчанию, отображается следующая ошибка:
Если ваша текущая политика разрешает запуск скриптов, и вы хотите установить запрет в целях тестирования приведенных методов, запустите команду «Set-ExecutionPolicy Restricted» из консоли администратора 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 предоставила несколько полезных встроенных инструментов, а сообщество специалистов по безопасности продемонстрировало несколько интересных трюков.
5778 К? Пф! У нас градус знаний зашкаливает!