
Арсенал PowerShell для специалистов по безопасности
[!IMPORTANT]
Этот репозиторий теперь заархивирован. Хотя это было интересное путешествие, я думаю, что PSArmoury утратил свою полезность.
PowerShell Armoury предназначен для пентестеров, «вставьте-сюда-цвет»-тимеров и всех остальных, кто использует разнообразные PowerShell-инструменты во время своих заданий. Он позволяет загрузить и хранить все ваши любимые PowerShell-скрипты в одном обфусцированном файле.
Вам не нужно возиться с ручным обновлением Rubeus, PowerView и т.д. Просто создайте файл конфигурации один раз или используйте стандартный, включённый в инструмент. Отныне вам нужно лишь запустить «New-PSArmoury» перед следующим заданием. Кроме того, PSArmoury обфусцирует ваш код и содержит встроенный обход AMSI. Модульная конструкция должна упростить вам изменение кода обхода или обфускации в случае обнаружения.
Текущая версия PSArmoury отдаёт предпочтение модульной конструкции.
New-PSArmoury.ps1
PSArmoury.json
utilities
ConvertTo-Powershell.ps1
Invoke-Shuffle.ps1
modules
evasion.ps1
obfuscation.ps1
Код разделён на основной скрипт-генератор с именем New-PSArmoury.ps1, который вы и запускаете. Код для обхода, обфускации и деобфускации хранится в отдельных файлах .ps1 в каталоге modules. Эти отдельные файлы вызываются основным скриптом и должны упростить изменение конкретных функций (например, обхода AMSI).
Помимо каталога modules, существует также каталог utilities. Здесь вы найдёте отдельные скрипты, которые могут быть полезны в определённых сценариях.
Путь к каталогу modules по умолчанию — .\modules, где точка относится к текущему рабочему каталогу вашей оболочки. Вы можете изменить путь к каталогу modules, используя аргумент -ModulesDirectory команды New-PSArmoury.
Однако имена самих файлов скриптов жёстко закодированы в основном скрипте и всегда должны называться:
Давайте подробнее рассмотрим эти два файла.
Этот скрипт должен содержать код, предназначенный для обхода того, что вы намереваетесь обойти. По умолчанию он содержит широко известный обход AMSI (спасибо amsi.fail). Обратите внимание, что:
Этот скрипт должен содержать код, используемый для обфускации и деобфускации. Стандартный obfuscation.ps1 использует шифрование RC2. Примеры готовых к использованию:
Обратите внимание, что TEMPLATE_obfuscation_empty.ps1 на самом деле ничего не делает и служит шаблоном для создания собственной функции.
Если вы хотите использовать любой из них, просто переименуйте его в «obfuscation.ps1» и удалите файл по умолчанию.
Если вы хотите создать настраиваемую версию, имейте в виду следующие моменты, касающиеся обфускации:
И не забудьте учесть следующие моменты, касающиеся деобфускации:
Каталог utilities содержит полезные отдельные скрипты.
Файл конфигурации должен быть допустимым JSON, состоящим из одного массива с одним или несколькими объектами, где каждый объект интерпретируется как один источник скрипта. Каждый объект имеет следующие атрибуты:
Name (обязательный)
Имя по вашему выбору для идентификации скрипта, включённого в этот объект. Это просто для справки.
URL (обязательный)
Расположение для получения содержимого скрипта. Это может быть URL веб-ресурса (https://), локальный путь (C:) или сетевой ресурс (\...). URL передается в Net.Webclient или Get-Item PowerShell соответственно. Таким образом, практически любой формат, который один из них может обработать по умолчанию, должен работать.
Type (обязательный)
Это даёт подсказку о расположении скрипта для создателя арсенала. Существует три допустимых типа:
FileInclusionFilter (необязательный)
Будет обрабатываться только для объекта типа «GitHub». Сравнивается с полным именем файла с помощью оператора сравнения PowerShell «like», поэтому имейте в виду, что вам нужно включить подстановочные знаки самостоятельно. Не забудьте включить звёздочку (*), если хотите сопоставить часть имени файла. «*.ps1» означает все файлы, заканчивающиеся на «.ps1», а «.ps1» означает просто «.ps1».
Вы не обязаны включать фильтр, но если вы это сделаете, его нужно использовать. Пустой InclusionFilter означает отсутствие файлов.
FileExclusionFilter (необязательный)
Как и InclusionFilter, но, очевидно, наоборот. Исключение имеет приоритет.
Подробнее см. встроенную справку PowerShell (man -full New-PSArmoury).
-Path
Путь к вашему новому файлу арсенала. По умолчанию «.\MyArmoury.ps1».
-FromFile
Загружает ваши PowerShell-скрипты непосредственно из локальной папки или файла, и вам не нужно предоставлять файл конфигурации.
-Config
Путь к вашему JSON-файлу конфигурации. Ознакомьтесь с образцом, поставляемым с этим скриптом, для идей.
-ModulesDirectory
Путь к каталогу modules. По умолчанию «.\modules». Если используется ModulesDirectory, параметры EvasionPath и ObfuscationPath использовать нельзя.
-EvasionPath
Путь к скрипту обхода. Если используются EvasionPath и ObfuscationPath, параметр ModulesDirectory использовать нельзя.
-ObfuscationPath
Путь к скрипту обфускации. Если используются EvasionPath и ObfuscationPath, параметр ModulesDirectory использовать нельзя.
-ValidateOnly
Используйте вместе с «-Config», чтобы скрипт проверил базовый синтаксис вашего JSON-файла конфигурации без его выполнения.
-GithubCredentials
Передайте имя пользователя GitHub и токен доступа в виде объекта учётных данных, чтобы скрипт не запрашивал их. Полезно, если вы многократно создаёте арсенал для тестирования.
Используйте так:
$c = get-credential
New-PSArmoury -GithubCredentials $c
Вы должны указать действительное имя пользователя GitHub, а также личный токен доступа, чтобы скрипт мог правильно использовать API GitHub. Не используйте имя пользователя/пароль, так как это всё равно не сработает, если у вас включена MFA (а MFA следует включить). Кроме того, доступ к API с использованием имени пользователя/пароля устарел.
Следуйте этому руководству, чтобы создать личный токен доступа.
Обратите внимание: единственное разрешение, которое нам нужно для токена доступа, — это public_repo в разделе repo.
Это необходимо только для того, чтобы GitHub не блокировал нас, когда мы анализируем большие репозитории (например, PowerSploit) на предмет файлов .ps1 для включения.
Если вы хотите создать арсенал с настройками по умолчанию (обратите внимание: это не будет выполнять обфускацию, кроме base64-кодирования), просто выполните следующее.
. .\New-PSArmoury.ps1
New-PSArmoury
Это создаст файл .ps1 с именем «MyArmoury.ps1» в текущем рабочем каталоге, используя:
Вы можете загрузить арсенал в текущий сеанс, используя:
cat -raw .\MyArmoury.ps1 | iex
Загрузка арсенала выполняет следующие шаги:
После этого весь код PowerShell, который вы поместили в арсенал, будет доступен. Просто вызывайте командлеты как обычно, например:
Invoke-Rubeus -Command "kerberoast /stats"
Get-DomainGroupMember -Identity "Domain Admins" -Recurse
Если случится так, что вы не помните, что поместили в арсенал, просто загрузите его и вызовите инвентаризацию :-)
Get-PSArmoury
Запустите New-PSArmoury с параметрами -EvasionPath и -ObfuscationPath, как показано ниже:
New-PSArmoury -Config C:\myarmouryconfig.json -ObfuscationPath .\modules\TEMPLATE_obfuscation_byte_convert.ps1 -EvasionPath .\modules\evasion.ps1
Примечание: в этом случае будут добавлены все файлы .ps1 в папке, так как мы передаём путь к папке. Если мы передадим путь к одному файлу, будет обработан только этот файл.
New-PSArmoury -FromFile C:\myscriptfolder