Набор техник для создания payload-ов, используемых red team для проверки эффективности EDR/AV-решений в рамках авторизованного тестирования на проникновение (suspended process, direct syscalls).
Фреймворк для генерации payload-ов, обходящих антивирусную защиту. Veil-Evasion создаёт исполняемые файлы для Windows с шифрованием shellcode …
SET — комплексный фреймворк для атак социальной инженерии. Включает Spear-Phishing, веб-атаки (credential harvesting, tabnabbing), создание вредоносных …
C2-фреймворк на Rust для Linux x86_64 и Windows x86_64. Реализует staged-доставку: стейджер (Mikazuki) выходит на связь …
Набор скриптов для поиска путей повышения привилегий. LinPEAS — для Linux/macOS, WinPEAS — для Windows. Автоматически …
go build Freeze.go
Чтобы просмотреть последнюю версию Freeze или сообщить о проблеме, обратитесь к https://github.com/Tylous/Freeze.
Если вы хотите узнать больше о методах, используемых в этом фреймворке, ознакомьтесь с блоком SourceZero
Freeze — это инструмент для создания полезной нагрузки, используемый для обхода средств защиты EDR с целью выполнения шелл-кода скрытным образом. Freeze применяет несколько техник не только для удаления хуков EDR в пользовательском режиме, но и для выполнения шелл-кода таким образом, чтобы обойти другие средства мониторинга конечных точек.
При создании процесса первой загружается библиотека Ntdll.dll. Это происходит до загрузки каких-либо DLL EDR. Это означает, что существует небольшая задержка, прежде чем EDR сможет загрузиться и начать внедрять хуки и модифицировать ассемблерные инструкции системных DLL. Анализируя системные вызовы Windows в Ntdll.dll, можно увидеть, что на данный момент ничего не зацеплено. Если создать процесс в приостановленном состоянии (замороженный во времени), можно заметить, что не загружены никакие другие DLL, кроме Ntdll.dll. Также видно, что не загружены DLL EDR, что означает, что системные вызовы в Ntdll.dll не модифицированы.

Чтобы использовать этот чистый приостановленный процесс для удаления хуков из загрузчика Freeze, нам нужен способ программно находить и считывать память чистого приостановленного процесса. Здесь на помощь приходит рандомизация адресного пространства (ASLR). ASLR — это механизм безопасности, предотвращающий уязвимости, связанные с повреждением памяти стека. ASLR рандомизирует адресное пространство внутри процесса, чтобы гарантировать уникальность всех объектов, отображённых в память, стека, кучи и самого исполняемого файла. Теперь самое интересное: хотя ASLR работает, он не применяется к позиционно-независимому коду, такому как DLL. Что происходит с DLL (особенно известными системными DLL), так это то, что адресное пространство рандомизируется один раз при загрузке системы. Это означает, что нам не нужно перечислять информацию о удалённом процессе, чтобы найти базовый адрес его ntdll.dll, поскольку он одинаков во всех процессах, включая тот, который мы контролируем. Поскольку адрес каждой DLL одинаков при каждой загрузке системы, мы можем получить эту информацию из нашего собственного процесса и никогда не придётся перечислять приостановленный процесс для поиска адреса.

Обладая этой информацией, мы можем использовать API-функцию ReadProcessMemory для чтения памяти процесса. Этот вызов API обычно ассоциируется с чтением LSASS в рамках атак, связанных с получением учётных данных; однако сам по себе он не является вредоносным, особенно если мы просто читаем произвольный участок памяти. ReadProcessMemory будет помечен как подозрительный только в том случае, если вы читаете то, что не должны (например, содержимое LSASS). Продукты EDR никогда не должны помечать сам факт вызова ReadProcessMemory, так как у этой функции есть легитимные операционные применения, и это привело бы к большому количеству ложных срабатываний.
Мы можем пойти дальше и читать только секцию Ntdll.dll, где хранятся все системные вызовы — её секцию .text, вместо чтения всей DLL.
Объединив эти элементы, мы можем программно получить копию секции .text Ntdll.dll, чтобы перезаписать нашу существующую зацепленную секцию .text перед выполнением шелл-кода.
ETW использует встроенные системные вызовы для генерации этой телеметрии. Поскольку ETW также является встроенной функцией Windows, средствам безопасности не нужно "хукать" системные вызовы ETW для доступа к информации. В результате, чтобы предотвратить работу ETW, Freeze патчит многочисленные системные вызовы ETW, очищая регистры и возвращая поток выполнения к следующей инструкции. Патчинг ETW теперь включён по умолчанию во всех загрузчиках.
___________
\_ _____/______ ____ ____ ________ ____
| __) \_ __ \_/ __ \_/ __ \\___ // __ \
| \ | | \/\ ___/\ ___/ / /\ ___/
\___ / |__| \___ >\___ >_____ \\___ >
\/ \/ \/ \/ \/
(@Tyl0us)
Soon they will learn that revenge is a dish... best served COLD...
Usage of ./Freeze:
-I string
Path to the raw 64-bit shellcode.
-O string
Name of output file (e.g. loader.exe or loader.dll). Depending on what file extension defined will determine if Freeze makes a dll or exe.
-console
Only for Binary Payloads - Generates verbose console information when the payload is executed. This will disable the hidden window feature.
-encrypt
Encrypts the shellcode using AES 256 encryption
-export string
For DLL Loaders Only - Specify a specific Export function for a loader to have.
-process string
The name of process to spawn. This process has to exist in C:\Windows\System32\. Example 'notepad.exe' (default "notepad.exe")
-sandbox
Enables sandbox evasion by checking:
Is Endpoint joined to a domain?
Does the Endpoint have more than 2 CPUs?
Does the Endpoint have more than 4 gigs of RAM?
-sha256
Provides the SHA256 value of the loaders (This is useful for tracking)
Так как восстанавливается только Ntdll.dll, все последующие вызовы для выполнения шелл-кода должны находиться в Ntdll.dll. Используя Go (хотя это можно сделать и на других языках, но в Go это довольно просто реализовать), мы можем определить и вызвать необходимые NT-системные вызовы для выделения памяти, записи и защиты шелл-кода, эффективно пропуская стандартные вызовы, расположенные в kernel32.dll и Kernelbase.dll, так как они всё ещё могут быть перехвачены.



Freeze был разработан на языке Golang.
Для установки Freeze выполните следующие команды или используйте скомпилированный бинарный файл:
go build Freeze.go
___________
\_ _____/______ ____ ____ ________ ____
| __) \_ __ \_/ __ \_/ __ \\___ // __ \
| \ | | \/\ ___/\ ___/ / /\ ___/
\___ / |__| \___ >\___ >_____ \\___ >
\/ \/ \/ \/ \/
(@Tyl0us)
Soon they will learn that revenge is a dish... best served COLD...
Usage of ./Freeze:
-I string
Path to the raw 64-bit shellcode.
-O string
Name of output file (e.g. loader.exe or loader.dll). Depending on what file extension defined will determine if Freeze makes a dll or exe.
-console
Only for Binary Payloads - Generates verbose console information when the payload is executed. This will disable the hidden window feature.
-encrypt
Encrypts the shellcode using AES 256 encryption
-export string
For DLL Loaders Only - Specify a specific Export function for a loader to have.
-process string
The name of process to spawn. This process has to exist in C:\Windows\System32\. Example 'notepad.exe' (default "notepad.exe")
-sandbox
Enables sandbox evasion by checking:
Is Endpoint joined to a domain?
Does the Endpoint have more than 2 CPUs?
Does the Endpoint have more than 4 gigs of RAM?
-sha256
Provides the SHA256 value of the loaders (This is useful for tracking)
Freeze может генерировать как .exe, так и .dll файл. Чтобы указать это, убедитесь, что параметр командной строки -O заканчивается на .exe для бинарных файлов или .dll для DLL. Другие типы файлов в настоящее время не поддерживаются. В случае DLL-файлов Freeze также может добавлять дополнительные экспортируемые функции. Для этого используйте параметр -export с указанием имени экспортируемой функции.
Freeze использует технику, при которой сначала создаётся процесс, а затем он перемещается в фоновый режим. Это решает две задачи: во-первых, помогает скрыть процесс, а во-вторых, позволяет избежать обнаружения EDR-продуктами. Сразу запускать процесс в фоновом режиме может быть подозрительно и служить индикатором вредоносной активности. Freeze делает это, вызывая функции Windows GetConsoleWindow и ShowWindow после создания процесса и загрузки перехватов EDR, а затем изменяет атрибуты окна на скрытые. Freeze использует эти API вместо традиционного -ldflags -H=windowsgui, так как это сильно сигнатурировано и классифицируется большинством защитных продуктов как индикатор компрометации.
Если выбран параметр командной строки -console, Freeze не будет скрывать процесс в фоновом режиме. Вместо этого Freeze добавит несколько отладочных сообщений, показывающих, что делает загрузчик.