Настройка рабочего окружения PowerShell в Windows и Linux
PowerShell — это платформа, инструмент автоматизации и настройки, который работает в различных операционных системах. PowerShell это больше чем просто скриптовый язык программирования, PowerShell содержит функции для управления локальным и удалённым компьютером. В зависимости от установленного ПО (в первую очередь административного и серверного программного обеспечения) количество функций (командлетов) PowerShell может быть различным.
Знание PowerShell необходимы системным администраторам Windows, а также аудиторам безопасности, поскольку имеется достаточно много отличных и уникальных инструментов, написанных на PowerShell (в первую очередь направленных на пентест Windows). Для продвинутых пользователей Windows знание PowerShell не будет лишним, т. к. с его помощью можно автоматизировать рутинные задачи и более тонко (или просто быстрее чем через графический интерфейс) настроить свою систему Windows.
PowerShell имеет богатые возможности, активно развивается, портирован на Linux, имеет огромную справку, которая также активно поддерживается и развивается. Эта статья посвящена не языку PowerShell, а настройке рабочего окружения для поддержки PowerShell и запуску скриптов — хотя PowerShell предустановлен в каждую Windows, свои особенности (трудности) есть даже там. Проще говоря, эта статья посвящена не тому, как написать свою первую программу «Hello, World!» на PowerShell, а тому, как запустить готовую программу «Hello, World!» в PowerShell.
Отличия PowerShell и CMD в Windows
В Windows PowerShell уже давно устанавливается по умолчанию.
Чтобы открыть PowerShell, нажмите Win+x и выберите Windows PowerShell (администратор):
В приглашении командной строки вы увидите PS и текущую рабочую директорию:
Чтобы открыть CMD нужно нажать Win+r, напечатать cmd и нажать ENTER:
Приглашение командной строки CMD выглядит так:
В CMD можно запустить:
- утилиты командной строки Windows
- встроенные функции CMD
- файлы .bat
В PowerShell можно запустить всё то же самое, что и в CMD, а также дополнительно:
- команды языка PowerShell
- скрипты PowerShell
В PowerShell сработает такая простая команда как dir:
dir
Но если выполнить эту команду в PowerShell и в CMD, то можно увидеть, что вывод этих команд различается.
А если попытаться выполнить эту команду с опцией, например:
dir /A
То в CMD она сработает, а в PowerShell завершится ошибкой.
Дело в том, что вместо реализации таких же утилит как в CMD, в PowerShell используются собственные командлеты, работа которых различается, например, выводом или поддержкой опций. В PowerShell сработают команды cd, ls, dir, cat, man, kill, mount, move, sort, pwd, wget, curl и другие, знакомые по Linux, но это НЕ ОЗНАЧАЕТ что эти команды поддерживают те же самые опции, что и опции в Linux. Это просто аналоги, причём довольно грубые. Точнее говоря, это псевдонимы команд PowerShell. Полный список псевдонимов вы можете просмотреть командой:
Get-Alias
Как установить PowerShell в Linux
PowerShell работает также и в Linux, но некоторые команды PowerShell отсутствуют в Linux. При запуске скриптов PowerShell в Linux возникнут проблемы в следующих случаях:
- в скрипте используются команды, которые отсутствуют в Linux версии PowerShell (например, из-за того, что связаны с настройками Windows или неприменимы для Linux по другим причинам)
- скрипт обращается к переменным окружения Windows
- в скрипте используются утилиты Windows, отсутствующие в Linux
Могут быть и другие причины проблем, но много всё равно работает.
Многие дистрибутивы Linux поддерживаются официально и простые инструкции по установке PowerShell в свой дистрибутив, а также установочные файлы вы найдёте здесь: Как установить PowerShell в Linux.
Установка PowerShell в Kali Linux
PowerShell добавлен в стандартные репозитории Kali Linux, поэтому установка очень простая:
sudo apt install powershell
Установка PowerShell в Arch Linux, BlackArch
git clone https://aur.archlinux.org/powershell-bin.git cd powershell makepkg -si
Чтобы узнать версию PowerShell выполните команду:
Get-Host | Select-Object Version
Как запустить скрипт PowerShell в Windows
Для запуска скрипта с расширением .ps1 нужно открыть консоль PowerShell и затем указать полный путь до файла. Вы также можете перейти в папку со скриптом либо с помощью команды cd, либо, если вы хотите полностью окунуться в стиль PowerShell, то можете использовать Set-Location.
Например, мне нужно перейти в папку C:\Users\Администратор\Downloads\WinPwn-master\:
Set-Location C:\Users\Администратор\Downloads\WinPwn-master\
Если вы просто попытаетесь запустить скрипт, то почти наверняка столкнётесь с ошибкой, что запуск скриптов запрещён. Для исправления ошибки выполните команду:
Set-ExecutionPolicy unrestricted
Подробности смотрите в статье «Ошибка «Невозможно загрузить файл ….ps1, так как выполнение сценариев отключено в этой системе» (РЕШЕНО)»
Запуск скрипта с помощью Import-Module
При запуске некоторых скриптов может ничего не происходить. Дело в том, что скрипт может содержать в себе функцию, которую нужно импортировать, а затем запустить. Поищите в документации по интересующей вас программе примеры со строкой Import-Module.
Например для запуска WinPwn нужно вначале импортировать файл с функциями:
Import-Module .\WinPwn.ps1
А после этого можно вызывать содержащиеся в файле функции:
WinPwn
Как запустить скрипт PowerShell в Linux
В Linux для вызова консоли PowerShell нужно набрать:
pwsh
Затем в консоли PowerShell либо просто запустите желаемый скрипт:
./hello_world.ps1
Либо запустите функцию после импорта файла с помощью Import-Module. Пример запуска через импорт одной из функции Invoke-TheHash:
Import-Module .\Invoke-SMBEnum.ps1 Invoke-SMBEnum -Target 192.168.0.53 -Username HackWare-mial\Администратор -Hash 5187b179ba87f3ad85fea3ed718e961f -verbose
Как получить справку по командам в PowerShell
Если вы хотите получить справку по опциям функции, команды или программы в PowerShell, то используйте команду Get-Help, после которой укажите другую команду, по которой вы хотите получить справку:
Get-Help КОМАНДА
Для получения справки по Set-Location:
Get-Help Set-Location
Для получения справки по Invoke-SMBEnum (после импорта функции из файла):
Get-Help Invoke-SMBEnum
Как обновить PowerShell до последней версии
По умолчани в Windows 10 предустановлена версия PowerShell 5, но в настоящее время последней версией является PowerShell 7. Чтобы обновиться до последней версии смотрите статью «Как установить PowerShell 7 в Windows 10». Обратите внимание, что PowerShell 7 не заменит PowerShell 5. То есть в системе будут доступны обе версии PowerShell.
Адаптация скриптов PowerShell для Linux
Я сам только начинаю знакомство с PowerShell, но хочу привести интересный пример, как можно самостоятельно решить проблему и запустить скрипт PowerShell в Linux не смотря на то, что он выдавал ошибку.
В Invoke-TheHash есть функция Invoke-SMBEnum, которая выполняет перечисление пользователей, групп, сетевых сессий и совместных ресурсов. В Windows эта функция работает отлично. Попробую использовать её в Linux.
Запускаю консоль PowerShell:
pwsh
Перехожу в папку с уже скаченными скриптами:
cd ./bin/Invoke-TheHash/
Импортирую файл с нужной функцией:
Import-Module .\Invoke-SMBEnum.ps1
Запускаю:
Invoke-SMBEnum -Target 192.168.0.53 -Action All -Username HackWare-mial\Администратор -Hash 5187b179ba87f3ad85fea3ed718e961f -verbose
И получаю ошибку «Cannot find path 'computername' because it does not exist.», она означает, что не получается найти путь computername (имя компьютера), т. к. путь не существует. Ошибка возникла в этой строке:
$auth_hostname = (Get-ChildItem -path env:computername).Value
Если попытаться выполнить отдельно команду из этой строки:
Get-ChildItem -path env:computername
то она вызовет эту же самую ошибку:
Get-ChildItem: Cannot find path 'computername' because it does not exist.
Можно предположить (лучше посмотреть в справке, но мне лень туда лезть), что env имеет отношение к переменным окружения, а computername — это имя переменной, которая содержит (как следует из названия) имя компьютера. Судя по всему, в Linux эта переменная окружения не существует.
Самое простое решение — прописать это имя вручную. Для этого открываю файл Invoke-SMBEnum.ps1 текстовым редактором, нахожу там строку
$auth_hostname = (Get-ChildItem -path env:computername).Value
И меняю её на такую строку:
$auth_hostname = 'hackware-mial'
То есть я просто прописал имя компьютера вместо получения его с помощью функции.
Важно помнить, что после импорта функция будет считываться не из файла, который я изменил, а из памяти. Поэтому чтобы PowerShell увидел сохранённые в файле изменения, нужно заново выполнить импорт файла — для этого пришлось закрыть (CTRL+d) и открыть заново PowerShell:
pwsh
Импортируем файл:
cd ./bin/Invoke-TheHash/ Import-Module .\Invoke-SMBEnum.ps1
И после этого вновь запускаю команду:
Invoke-SMBEnum -Target 192.168.0.53 -Action All -Username HackWare-mial\Администратор -Hash 5187b179ba87f3ad85fea3ed718e961f -verbose
В этот раз команда сработала.
Мораль:
- после внесения изменений в файл нужно заново его импортировать (возможно, даже перезайти в PowerShell)
- некоторые проблемы с запуском скриптов PowerShell в Linux достаточно просто решить самостоятельно
Задать вопрос по PowerShell
На этой странице я планирую добавлять ответы на часто возникающие вопросы и решения для частых проблем у новичков с PowerShell, поэтому если вам что-то ещё не понятно, то спрашивайте здесь в комментариях.
Смотрите также: Основы работы с PowerShell в Linux [Руководство для начинающих]
Связанные статьи:
- Как установить Python и PIP на Windows 10. Настройка Python в качестве модуля веб-сервера (57.6%)
- Как установить и использовать Ruby в Windows (57.6%)
- Как запустить PHP скрипт без веб-сервера (56.2%)
- Основы C++ (52.5%)
- Как быстро узнать и преобразовать кодировку (50%)
- Как узнать, поддерживает ли беспроводная карта инжект (инъекцию) в Kali Linux (RANDOM - 0.8%)