
OpSec-безопасное пространство выполнения PowerShell изнутри C# (также известный как SharpPick) с отключенными при запуске AMSI, Constrained Language Mode и Script Block Logging.
Пространство выполнения PowerShell из C# (техника SharpPick) с отключенными AMSI, ETW и Script Block Logging для вашего удовольствия.
В наши дни, когда PowerShell сильно инструментирован с помощью таких техник, как:
Продвинутые атакующие должны находить способы обхода этих усилий для проведения сложных имитационных упражнений adversarial-симуляций. Чтобы помочь в этом, был создан следующий проект.
Эта программа построена на основе обходов для конкретных техник, включенных в:
Которые, в свою очередь, основаны на следующих исследованиях:
Идея SharpPick, то есть запуск скриптов PowerShell из сборки C# с помощью Runspaces, также не нова и была впервые реализована Lee Christensen (@tifkin_) в его:
Также исходный код заимствует реализацию CustomPSHost от Lee.
Этот проект наследует от вышеупомянутых исследований и замечательного сообщества безопасности, чтобы предоставить почти эффективное окружение PowerShell с отключенными защитами при запуске.
Теперь легко компилируется с .NET 4.0, тогда как при компиляции с .NET Framework 4.7.1+ включается дополнительная функциональность, позволяющая выгружать DLL, составляющие артефакты обхода CLM, и пытаться удалить их после этого (честно говоря, работает с трудом).
Лучший результат достигается при компиляции Stracciatella с .NET 4.0.
Доступно несколько опций:
PS D:\> Stracciatella -h
:: Stracciatella - Пространство выполнения PowerShell с отключенными AMSI, ETW и Script Block Logging.
Mariusz Banach / mgeeky, '19-22 <[email protected]>
v0.7
Использование: stracciatella.exe [опции] [команда]
-s <путь>, --script <путь> - Путь к файлу, содержащему скрипт PowerShell для выполнения. Если опции не указаны, войдет в
псевдо-оболочку. Это также может быть HTTP(S) URL для загрузки и выполнения скрипта powershell.
-v, --verbose - Выводить подробную информацию
-n, --nocleanup - Не удалять остатки отключения CLM (DLL-файлы в TEMP и ключи реестра COM).
По умолчанию они всегда удаляются.
-C, --leaveclm - Не пытаться отключить CLM. Более скрытно. Позволит избежать оставления не удаленных артефактов отключения CLM.
-f, --force - Продолжить выполнение, даже если защиты PowerShell не были отключены.
По умолчанию мы выходим при сбое.
-c, --command - Выполняет указанные команды. Вы можете использовать -c или добавить команды после
параметров stracciatella: cmd> straciatella ipconfig /all
Если заданы и команда, и параметры скрипта, выполняется команда после запуска скрипта.
-x <ключ>, --xor <ключ> - Считать входные данные XOR-закодированными, где <ключ> - однобайтовый ключ в десятичном формате
(префикс 0x для шестнадцатеричного)
-p <имя>, --pipe <имя> - Читать команды powershell из указанного именованного канала. Команда должна начинаться с 4 байт
ее длины в little-endian (нотация Length-Value).
-t <миллисек>, --timeout <миллисек>
- Указывает таймаут для операции чтения из канала (в миллисекундах). По умолчанию: 60 сек. 0 - бесконечно.
-e, --cmdalsoencoded - Считать входную команду (указанную в '--command') также закодированной.
Декодирует входную команду после декодирования и выполнения входного скрипта.
По умолчанию мы декодируем только входной файл и считаем команду переданной в открытом виде.
Программа принимает команду и путь к файлу скрипта в качестве входных данных. Оба опциональны; если ничего не указано, будет запущена псевдо-оболочка. Команда и скрипт могут быть дополнительно закодированы с помощью однобайтового XOR (вывод будет в Base64) для улучшения OpSec-опыта.
Вот несколько примеров использования:
PS D:\> Stracciatella.exe -v
:: Stracciatella - Пространство выполнения PowerShell с отключенными AMSI, ETW и Script Block Logging.
Mariusz Banach / mgeeky, '19-22 <[email protected]>
v0.7
[.] Версия PowerShell: 5.1
[.] Языковой режим: FullLanguage
[+] Нет необходимости отключать Constrained Language Mode. Уже в FullLanguage.
[+] Script Block Logging отключен.
[+] AMSI отключен.
[+] ETW отключен.
Stracciatella D:\> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.18362.1
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.1
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
Сначала, чтобы подготовить закодированные операторы, можно использовать встроенный скрипт encoder.py, который используется следующим образом:
PS D:\> python encoder.py -h
usage: encoder.py [options] <command|file>
positional arguments:
command Задает команду или путь к файлу скрипта для кодирования
optional arguments:
-h, --help показать это справочное сообщение и выйти
-x KEY, --xor KEY Задает ключ XOR для команды/файла (один байт)
-o PATH, --output PATH
(необязательно) Выходной файл. Если не указан, выведет в stdout
PS D:\> python encoder.py -x 0x31 "Write-Host \"It works like a charm!\" ; $ExecutionContext.SessionState.LanguageMode"
ZkNYRVQceV5CRRETeEURRl5DWkIRXVhaVBFQEVJZUENcEBMRChEVdElUUkRFWF5fcl5fRVRJRR9iVEJCWF5fYkVQRVQffVBfVkRQVlR8XlVU
Затем передаем вывод encoder.py в качестве входных данных для закодированной команды Stracciatella:
PS D:\> Stracciatella.exe -v -x 0x31 -c "ZkNYRVQceV5CRRETeEURRl5DWkIRXVhaVBFQEVJZUENcEBMRChEVdElUUkRFWF5fcl5fRVRJRR9iVEJCWF5fYkVQRVQffVBfVkRQVlR8XlVU" .\Test2.ps1
:: Stracciatella - Пространство выполнения PowerShell с отключенными AMSI, ETW и Script Block Logging.
Mariusz Banach / mgeeky, '19-22 <[email protected]>
v0.7