За замовчуванням PowerShell налаштований на заборону виконання скриптів в системах на базі ОС Windows. Подібні установки можуть ускладнювати роботу адмінів, пентестеров і розробників, і в цій статті я розповім про 15 способах обходу execution policy без використання прав локального адміністратора.
За замовчуванням PowerShell налаштований на заборону виконання скриптів в системах на базі ОС Windows. Подібні установки можуть ускладнювати роботу адмінів, пентестеров і розробників, і в цій статті я розповім про 15 способах обходу execution policy без використання прав локального адміністратора. Вважаю, що є техніки, які не будуть згадані через мою забудькуватість чи елементарне незнання, однак, сподіваюся, нижченаведений список буде хорошим стартом для тих, хто має потребу в ньому.
Що таке PowerShell Execution Policy?
Execution policy визначає, які типи скриптів можуть бути запущені (якщо взагалі можуть) в системі. За замовчуванням значення параметра виставлено як «Restricted», що забороняє запуск будь-яких скриптів. Однак слід розуміти, що настройка Execution Policy ніколи не ставилася до управління безпекою, а служила лише для того, щоб адміністратори випадково не могли вивести систему з ладу. Саме тому існує безліч технік, щоб обійти ці настройки, включаючи деякі, надані компанією Microsoft. Більш докладно про Execution Policy та інші можливості налаштування безпеки в PowerShell рекомендую почитати блог Карлоса Переса.
Навіщо потрібно обходити Execution Policy?
Здається, один з найбільш поширених відповідей на питання, позначений в заголовку, - автоматизація процесів. Однак є й інші причини, за якими PowerShell став популярним серед адміністраторів, пентестеров і хакерів. PowerShell:
- Вбудований в Window.
- Може викликати Windows API.
- Може запускати команди без запису на диск.
- Може уникати виявлення антивірусами.
- Уже позначений як «достовірний» і знаходиться в більшості білих списків.
- Використовується при написанні багатьох утиліт безпеки з відкритим вихідним кодом.
Як подивитися налаштування Execution Policy
Перед початком використання всіх можливостей PowerShell, потрібно обійти заборону на запуск скриптів. Поточні параметри можна отримати, виконавши команду «Get-ExectionPolicy». Якщо заборона виставлений, то при запуску команди з'явиться наступне повідомлення:
PS C: \> Get-ExecutionPolicy
Малюнок 1: Результат виконання команди в системі, де встановлено заборону на запуск скриптів
Важливо відзначити, що Execution Policy може встановлюватися на різних рівнях системи. Щоб подивитися список рівнів, використовуйте команду нижче (за більш детальною інформацією звертайтесь до відповідній сторінці TechNet).
Get-ExecutionPolicy -List | Format-Table -AutoSize
Малюнок 2: Налаштування Execution Policy на різних системних рівнях
Налаштування тестового середовища
У прикладах нижче я буду використовувати скрипт з ім'ям runme.ps, що містить наступну команду для виведення повідомлення в консоль:
Write-Host "My voice is my passport, verify me."
При запуску скрипта в системі зі стандартними настройками Execution Policy виводиться наступна помилка:
Малюнок 3: Помилка, що виводиться при запуску тестового скрипта в середовищі, де настрої заборона на запуск скриптів
Якщо ваша поточна політика дозволяє запуск скриптів, поставити заборону (з метою тестування) можна за допомогою команди Set-ExecutionPolicy Restricted, запущеної з консолі адміністратора PowerShell. Ну, добре, досить пустих балачок. Перейдемо безпосередньо до методів обходу заборони, встановленого в Execution Policy.
Скопіюйте та вставте скрипт в інтерактивну консоль, як показано нижче. Однак майте на увазі, що ви будете обмежені привілеями поточного користувача. Метод найбільш часто використовується для запуску простих скриптів, коли у вас є доступ до інтерактивної консолі. Крім того, ця техніка не тягне за собою зміни налаштувань і не вимагає записи на диск.
Малюнок 4: Запуск скрипта за допомогою копіювання в інтерактивну консоль
2. Відправлення вмісту скрипта в стандартний потік введення PowerShell
Просто надішліть вміст скрипта в стандартний потік введення. Техніка не тягне за собою зміни налаштувань і не вимагає записи на диск.
Echo Write-Host "My voice is my passport, verify me." | PowerShell.exe -noprofile -
Малюнок 5: Висновок вмісту скрипта в стандартний потік введення
3. Читання скрипта з файлу і перенаправлення вмісту в стандартний потік введення PowerShell
Використовуйте стандартний формат «type» або PowerShell команду «Get-Content» для читання вмісту скрипта з диска і перенаправьте отриманий результат в стандартний потік введення. Техніка не тягне за собою зміни налаштувань, однак вимагає записи на диск. Щоб уникнути записи на диск, можна використовувати мережевий загальний ресурс (network share).
Приклад 1: Використання PowerShell команди Get-Content
Get-Content. \ Runme.ps1 | PowerShell.exe -noprofile -
Малюнок 6: Використання команди Get-Content
Приклад 2: Використання команди Type
TYPE. \ Runme.ps1 | PowerShell.exe -noprofile -
Малюнок 7: Використання команди Type
4. Завантаження скрипта з мережі і запуск за допомогою Invoke Expression
Техніку можна використовувати для завантаження скрипта з інтернету і запуску без запису на диск. Також не будуть змінені ніякі настройки. Я бачив багато способів запуску скриптів подібним чином, але недавно натрапив на наступний приклад:
Малюнок 8: Завантаження скрипта з інтернету і запуск за допомогою Invoke Expression
5. Використання параметра Command
Приклад 1: Повна команда
Powershell -command "Write-Host 'My voice is my passport, verify me.'"
Малюнок 9: Запуск скрипта за допомогою повної версії параметра
Приклад 2: Коротка команда
Powershell -c "Write-Host 'My voice is my passport, verify me.'"
Можна об'єднати вищевказані команди в пакетні файли і помістити їх в автозавантаження для збільшення рівня привілеїв.
6. Використання параметра EncodeCommand
Метод схожий з попередньою технікою, але тут все скрипти закодовані в рядок Unicode. Кодування скрипта дозволяє уникнути помилок, що виникають при використанні параметра «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
Малюнок 10: Повний варіант команди
Приклад 2: Скорочений параметр
powershell.exe -Enc
VwByAGkAdABlAC0ASABvAHMAdAAgACcATQB5ACAAdgBvAGkAYwBlACAA
aQBzACAAbQB5ACAAcABhAHMAcwBwAG8AcgB0ACwAIAB2AGUAcgBpAGYAeQAgAG0AZQAuACcA
7. Використання команди Invoke-Command
Техніка, знайдена мною в блозі Obscuresec, використовується через інтерактивну консоль або в поєднанні з параметром «Command». Головна особливість методу в тому, що його можна використовувати для запуску команд на віддалених системах, де дозволений запуск скриптів PowerShell. Техніка не тягне за собою зміни налаштувань і не вимагає записи на диск.
Малюнок 11: Використання команди Invoke-Command
Команда нижче, створена за мотивами блогу Obscuresec, може використовуватися для перенесення налаштувань execution policy з віддаленої машини на локальну.
invoke-command -computername Server01 -scriptblock | set-executionpolicy -force
8. Використання команди Invoke-Expression
Як і в попередньому випадку, техніка використовується через інтерактивну консоль або в поєднанні з параметром «Command». Метод не тягне за собою зміни налаштувань і не вимагає записи на диск. Нижче показано кілька найбільш поширених способів використання команди Invoke-Expression для обходу execution policy.
Приклад 1: Повна версія команди Get-Content
Get-Content. \ Runme.ps1 | Invoke-Expression
Малюнок 12: Повний варіант команди Get-Content
Приклад 2: Скорочений варіант Get-Content
GC. \ Runme.ps1 | iex
9. Використання прапора Bypass
Прапор доданий розробниками Microsoft для обходу execution policy при запуску скриптів з файлів. Microsoft заявляє, що при використання цього прапора «нічого не блокується і не виводиться ніяких попереджень або повідомлень». Техніка не тягне за собою зміни налаштувань і не вимагає записи на диск.
PowerShell.exe -ExecutionPolicy Bypass -File. \ Runme.ps1
Малюнок 13: Використання прапора Bypass
10. Використання прапора Unrestricted
Техніка схожа з попередньою. Хоча, при використанні прапора Unrestricted Microsoft заявляє, що «завантажуються всі конфігураційні файлу і запускаються всі скрипти. Якщо ви запустите непідписаний скрипт, завантажені з інтернету, з'явиться повідомлення з питанням про підтвердження запуску ». Метод не тягне за собою зміни налаштувань і не вимагає записи на диск.
PowerShell.exe -ExecutionPolicy UnRestricted -File. \ Runme.ps1
Малюнок 14: Використання прапора Unrestricted
11. Використання прапора Remote-Signed
Створіть скрипт. Потім підпишіть його, використовуючи керівництво. написане Карлосом Пересом. Тепер запустіть скрипт, використовуючи команду нижче:
PowerShell.exe -ExecutionPolicy Remote-signed -File. \ Runme.ps1
12. Заборона ExecutionPolicy шляхом вивантаження Authorization Manager
function Disable-ExecutionPolicy $ executioncontext.gettype (). getfield ( "_ context", "nonpublic, instance"). getvalue (
$ Executioncontext)). Gettype (). Getfield ( "_ authorizationManager", "nonpublic, instance").
setvalue ($ ctx, (new-object System.Management.Automation.AuthorizationManager "Microsoft.PowerShell"))>
Малюнок 15: Відключення Authorization Manager в поточній сесії
13. Установка Excution Policy для рівня Process
На початку статті було сказано, що execution policy може бути застосована до різних рівнів (включаючи рівень process, на яких у вас є контроль). Використовуючи цю техніку, execution policy може бути встановлена в статус unrestricted під час сесії. Крім того, метод не тягне за собою зміни в налаштуваннях і не вимагає записи на диск. Я знайшов цю техніку в блозі r007break.
Set-ExecutionPolicy Bypass -Scope Process
Малюнок 16: Встановлення статусу Unrestricted для рівня Process
14. Установка статусу Unrestricted для рівня CurrentUser за допомогою команди
Техніка схожа з попередньою, але тут змінюються установки середовища поточного користувача шляхом модифікації ключа в реєстрі. Метод не тягне за собою зміни налаштувань і не вимагає записи на диск. Техніка також була знайдена в блозі r007break.
Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted
Малюнок 17: Встановлення статусу Unrestricted для рівня CurrentUser
15. Установка статусу Unrestricted для рівня CurrentUser через реєстр
У цьому прикладі я покажу, як виставляти постійні настройки execution policy для поточного користувача шляхом модифікації ключа реєстру безпосередньо.
Малюнок 18: Виставлення статусу для execution policy через реєстр