Настраиваем PowerShell в Linux и Windows
overlamer1PowerShell - это инструмент для автоматизации и настройки платформы, который работает в различных операционных системах. PowerShell - это гораздо больше, чем скриптовый язык программирования; PowerShell содержит функции для управления локальными и удаленными компьютерами. В зависимости от установленного программного обеспечения (в основном административного и серверного программного обеспечения) количество функций 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 в свой дистрибутив, а также установочные файлы вы найдёте здесь:
- https://github.com/PowerShell/PowerShell
- https://docs.microsoft.com/ru-ru/powershell/scripting/install/installing-powershell-core-on-linux
Установка PowerShell в Kali Linux
PowerShell добавлен в стандартные репозитории Kali Linux, поэтому установка очень простая:
sudo apt install powershell
Установка PowerShell в Arch Linux, BlackArch
git clone https://aur.archlinux.org/powershell.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
Запуск скрипта с помощью 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 для 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

В этот раз команда сработала.