
ScareCrow — фреймворк для создания полезных нагрузок, разработанный для обхода EDR.
Чтобы просмотреть последнюю версию ScareCrow или отправить проблему, обратитесь к https://github.com/Tylous/ScareCrow.
Если вы хотите узнать больше о методах, используемых в этом фреймворке, пожалуйста, ознакомьтесь с Частью 1 и Частью 2
ScareCrow — это фреймворк для создания полезной нагрузки (payload) для боковой загрузки (side loading) (не внедрения) в легитимный процесс Windows (обход контроля белых списков приложений). После загрузки DLL-загрузчика в память он использует метод для удаления хуков EDR из системных DLL, выполняющихся в памяти процесса. Это работает, потому что мы знаем, что хуки EDR размещаются при создании процесса.
ScareCrow может нацеливаться на эти DLL и манипулировать ими в памяти с помощью API-функции VirtualProtect, которая изменяет разрешения участка памяти процесса на другое значение, в частности с Выполнение-Чтение на Чтение-Запись-Выполнение.
ScareCrow использует один из двух методов для снятия хуков.
При выполнении ScareCrow копирует байты системных DLL, хранящихся на диске в C:\Windows\System32\. Эти DLL хранятся на диске «чистыми» от хуков EDR, поскольку используются системой для загрузки неизменной копии в новый процесс при его создании. Поскольку EDR перехватывают только эти процессы в памяти, они остаются неизменными. ScareCrow не копирует весь DLL-файл целиком, а сосредотачивается только на секции .text DLL. Эта секция DLL содержит исполняемый код на ассемблере, и, делая это, ScareCrow помогает снизить вероятность обнаружения, поскольку повторное чтение целых файлов может привести к тому, что EDR обнаружит изменение системного ресурса. Затем данные копируются в нужную область памяти, используя смещение каждой функции. Каждая функция имеет смещение, которое обозначает точное количество байтов от базового адреса, где она находится, определяя местоположение функции в стеке.
Для этого ScareCrow изменяет разрешения области памяти .text с помощью VirtualProtect. Несмотря на то, что это системная DLL, поскольку она загружена в наш процесс (который мы контролируем), мы можем изменить разрешения памяти без необходимости повышенных привилегий.
ScareCrow загружает шелл-код в память, сначала расшифровывая его, который зашифрован одним из трёх методов шифрования (описанных ниже). После расшифровки и загрузки шелл-код выполняется. В зависимости от указанных параметров загрузчика, ScareCrow настроит различные экспортные функции для DLL. Загружаемая DLL также не содержит стандартную функцию DLLMain, которая обычно требуется всем DLL для работы. DLL будет выполняться без проблем, потому что процесс, в который мы загружаемся, будет искать эти экспортные функции и не будет беспокоиться о наличии DLLMain.
После
KnownDLLs — это список DLL, загружаемых Windows во время запуска системы. Поскольку эти DLL считаются важными для работы операционной системы, они кэшируются, чтобы сократить время загрузки и повысить производительность при запуске приложений. KnownDLLs включает такие DLL, как kernel32.dll, kernelbase.dll и ntdll.dll.
Используя эти KnownDLLs, ScareCrow отображает копию DLL из \KnownDlls\<dllname>, используя комбинацию NtOpenSection и NtMapViewOfSection, чтобы загрузить её в память процесса. ScareCrow не загружает всю DLL, а только секцию .text DLL (так как она содержит все системные вызовы). Затем ScareCrow использует непрямые системные вызовы для вызова NtProtectVirtualMemory и изменения разрешений секции памяти .text DLL, чтобы разрешить ScareCrow перезаписать хуки EDR, прежде чем восстановить разрешения.
Для получения дополнительной информации вы можете прочитать подробную статью от modexp.
После удаления хуков ScareCrow использует пользовательские системные вызовы для загрузки и выполнения шелл-кода в памяти. ScareCrow делает это даже после удаления хуков EDR, чтобы избежать обнаружения инструментами сбора телеметрии, не основанными на пользовательском пространстве и хуках, такими как Event Tracing for Windows (ETW) или другими механизмами регистрации событий. Эти пользовательские системные вызовы также используются для выполнения вызова VirtualProtect для удаления хуков, размещённых EDR, как описано выше, чтобы избежать обнаружения анти-поддельными средствами EDR. Это делается путём вызова пользовательской версии системного вызова VirtualProtect, NtProtectVirtualMemory. ScareCrow использует Golang для создания этих загрузчиков, а затем ассемблер для этих пользовательских функций системных вызовов.
В процессе создания загрузчика ScareCrow использует библиотеку для маскировки под фон после того, как бекон (beacon) связывается с домом. Эта библиотека делает две вещи:
Файлы, подписанные сертификатами подписи кода, часто подвергаются меньшей проверке, что упрощает их выполнение без проблем, поскольку файлы, подписанные доверенным именем, часто вызывают меньше подозрений, чем другие. Большинство антивирусных продуктов не имеют времени на проверку и верификацию этих сертификатов (сейчас некоторые это делают, но обычно распространённые имена поставщиков включены в белый список). ScareCrow создаёт эти сертификаты, используя Go-пакетную версию инструмента limelighter для создания файла pfx12. Этот пакет принимает введённое пользователем доменное имя для создания сертификата подписи кода для этого домена. При необходимости вы также можете использовать свой собственный сертификат подписи кода, если он у вас есть, используя параметр командной строки valid.
clone вместе с путём к файлу, из которого вы хотите скопировать сертификат. При подписании загрузчика с использованием microsoft.com их использование против продуктов WINDOWS DEFENDER ATP может быть не столь эффективным, поскольку они могут проверить сертификат, так как он принадлежит им. Если вы используете загрузчик против продукта Windows, возможно, используйте другой домен.
С этими файлами и кодом Go ScareCrow кросскомпилирует их в DLL, используя опцию библиотеки c-shared. После компиляции DLL она обфусцируется в строку сломанного base64, которая будет встроена в файл. Это позволяет удалённо получать файл, получать к нему доступ и выполнять его программно.
Хотя ScareCrow имеет обширный список атрибутов файлов, существуют обстоятельства, когда требуется пользовательский (возможно, специфичный для среды) набор атрибутов. Для этого ScareCrow позволяет вводить JSON-файл, содержащий атрибуты. Используя параметр командной строки -configfile, ScareCrow будет использовать эти атрибуты и имя файла вместо существующих в ScareCrow. Файл main.json содержит пример шаблона того, какой должна быть структура JSON для правильной работы. Обратите внимание, что то, что вы используете в качестве "InternalName", будет именем файла.
ScareCrow теперь требует golang 1.19.1 или более новую версию для компиляции загрузчиков. Если у вас более старая версия, используйте версию 1.19.1 или новее.
Смотрите новые версии: https://golang.org/dl/.
Первый шаг, как всегда, — клонировать репозиторий. Перед компиляцией ScareCrow вам нужно установить зависимости.
Для их установки выполните следующие команды:``` go get github.com/fatih/color go get github.com/yeka/zip go get github.com/josephspurrier/goversioninfo go get github.com/Binject/debug/pe go get github.com/awgh/rawreader
Убедитесь, что на вашей ОС установлены следующие компоненты:```
openssl
osslsigncode
mingw-w64
Затем соберите его``` go build ScareCrow.go
Кроме того, ScareCrow использует [Garble](https://github.com/burrowers/garble) для обфускации всех загрузчиков.
Примечание: Некоторые зависимости плохо работают в Windows при компиляции, поэтому рекомендуется компилировать загрузчики на OSX или Linux.
## Помощь```
./ScareCrow -h
_________ _________
/ _____/ ____ _____ _______ ____ \_ ___ \_______ ______ _ __
\_____ \_/ ___\\__ \\_ __ \_/ __ \/ \ \/\_ __ \/ _ \ \/ \/ /
/ \ \___ / __ \| | \/\ ___/\ \____| | \( <_> ) /
/_______ /\___ >____ /__| \___ >\______ /|__| \____/ \/\_/
\/ \/ \/ \/ \/
(@Tyl0us)
“Fear, you must understand is more than a mere obstacle.
Fear is a TEACHER. the first one you ever had.”
Usage of ./ScareCrow:
-Evasion string
Sets the type of EDR unhooking technique:
[*] Disk - Retrives a clean version of the DLLs ".text" field from files stored on disk.
[*] KnownDLL - Retrives a clean version of the DLLs ".text" field from the KnownDLLs directory in the object namespace.
[*] None - The Loader that WILL NOT removing the EDR hooks in system DLLs and only use custom syscalls. (default "Disk")
-Exec string
Set the template to execute the shellcode:
[*] RtlCopy - Using RtlCopy to move the shellcode into the allocated address in the current running process by making a Syscall.
[*] ProcessInjection - Process Injection Mode.
[*] NtQueueApcThreadEx - Executes the shellcode by creating an asynchronous procedure call (APC) to a target thread.
[*] VirtualAlloc - Allocates shellcode into the process using custom syscalls in the current running process (default "RtlCopy")
-I string
Path to the raw 64-bit shellcode.
-Loader string
Sets the type of process that will sideload the malicious payload:
[*] binary - Generates a binary based payload. (This type does not benefit from any sideloading)
[*] control - Loads a hidden control applet - the process name would be rundll32 if -O is specified a JScript loader will be generated.
[*] dll - Generates just a DLL file. Can be executed with commands such as rundll32 or regsvr32 with DllRegisterServer, DllGetClassObject as export functions.
[*] excel - Loads into a hidden Excel process using a JScript loader.
[*] msiexec - Loads into MSIexec process using a JScript loader.
[*] wscript - Loads into WScript process using a JScript loader. (default "binary")
-O string
Name of output file (e.g. loader.js or loader.hta). If Loader is set to dll or binary this option is not required.
-clone string
Path to the file containing the certificate you want to clone
-configfile string
The path to a json based configuration file to generate custom file attributes. This will not use the default ones.
-console
Only for Binary Payloads - Generates verbose console information when the payload is executed. This will disable the hidden window feature.
-delivery string
Generates a one-liner command to download and execute the payload remotely:
[*] bits - Generates a Bitsadmin one liner command to download, execute and remove the loader (Compatible with Binary, Control, Excel, and Wscript Loaders).
[*] hta - Generates a blank hta file containing the loader along with an MSHTA command to execute the loader remotely in the background (Compatible with Control and Excel Loaders).
[*] macro - Generates an office macro that will download and execute the loader remotely (Compatible with Control, Excel, and Wscript Loaders).
-domain string
The domain name to use for creating a fake code signing cert. (e.g. www.acme.com)
-encryptionmode string
Sets the type of encryption to encrypt the shellcode:
[*] AES - Enables AES 256 encryption.
[*] ELZMA - Enables ELZMA encryption.
[*] RC4 - Enables RC4 encryption. (default "ELZMA")
-export string
For DLL Loaders Only - Specify an Export function for a loader to have.
-injection string
Enables Process Injection Mode and specify the path to the process to create/inject into (use \ for the path).
-noamsi
Disables the AMSI patching that prevents AMSI BufferScanner.
-noetw
Disables the ETW patching that prevents ETW events from being generated.
-nosign
Disables file signing, making -domain/-valid/-password parameters not required.
-nosleep
Disables the sleep delay before the loader unhooks and executes the shellcode.
-obfu
Enables Garbles Literal flag replaces golang libray strings with more complex variants, resolving to the same value at run-time. This creates a larger loader and times longer to compile
-outpath string
The path to put the final Payload/Loader once it's compiled.
-password string
The password for code signing cert. Required when -valid is used.
-sandbox
Enables sandbox evasion using IsDomainJoined calls.
-url string
URL associated with the Delivery option to retrieve the payload. (e.g. https://acme.com/)
-valid string
The path to a valid code signing cert. Used instead -domain if a valid code signing cert is desired.
Определяет тип техники, используемой для загрузки shellcode в целевую систему. Если параметр Loader не выбран, ScareCrow просто скомпилирует стандартный DLL-файл, который можно использовать с rundll32, regsvr32 или другими техниками, использующими DLL. ScareCrow использует три различных типа загрузчиков для загрузки shellcode в память:
ScareCrow также может генерировать бинарные полезные нагрузки (payloads) при необходимости, используя параметр командной строки -Loader. Эти бинарники не получают преимуществ от техник параллельной загрузки, но служат дополнительным методом выполнения shellcode в зависимости от ситуации.
ScareCrow использует технику, при которой сначала создается процесс, а затем он перемещается в фон. Это дает два преимущества: во-первых, помогает скрыть процесс, а во-вторых, избежать обнаружения любым EDR-продуктом. Немедленный запуск процесса в фоне может быть очень подозрительным и являться индикатором вредоносной активности. ScareCrow делает это, вызывая функции Windows GetConsoleWindow и ShowWindow после создания процесса и загрузки хуков EDR, а затем изменяет атрибуты окна на скрытые. ScareCrow использует эти API вместо традиционного -ldflags -H=windowsgui, так как последнее широко сигнатурировано и классифицируется в большинстве продуктов безопасности как индикатор компрометации.
Если выбран параметр командной строки -console, ScareCrow не будет скрывать процесс в фоне. Вместо этого будут добавлены отладочные сообщения, показывающие, что делает загрузчик.
ScareCrow использует различные шаблоны для выполнения shellcode. Чтобы выбрать шаблон, используйте параметр командной строки -Exec. Эти шаблоны включают:
ScareCrow поддерживает атаки внедрения процессов. Чтобы избежать перехвата (hooking) или обнаружения как в процессе загрузчика, так и в процессе, в который выполняется внедрение, ScareCrow сначала снимает хуки с процесса загрузчика, как обычно, чтобы убедиться в отсутствии хуков. После завершения загрузчик запускает процесс, указанный в команде создания. После запуска загрузчик создает дескриптор процесса для получения списка загруженных DLL. Найдя DLL, он перечисляет базовые адреса каждой DLL в удаленном процессе. Используя функцию WriteProcessMemory, загрузчик записывает байты системных DLL, хранящихся на диске (поскольку они «чисты» от хуков EDR), без необходимости предварительного изменения прав доступа к памяти. ScareCrow использует WriteProcessMemory, потому что эта функция содержит особенность, используемую в основном при отладке: даже если участок памяти доступен только для чтения, при корректном вызове WriteProcessMemory он временно изменяет права на чтение-запись, обновляет участок памяти, а затем восстанавливает исходные права. После этого загрузчик может без проблем внедрить shellcode в запущенный процесс, так как в обоих процессах нет хуков EDR.
Эта опция может использоваться с любым вариантом загрузчика. Чтобы включить внедрение процесса, используйте параметр командной строки -injection вместе с полным путем к процессу, в который нужно внедриться. При указании пути в качестве аргумента важно заключить полный путь в "" или использовать двойные обратные слэши \\ для каждого каталога в пути.
ScareCrow поддерживает патч функций AMSI (Antimalware Scan Interface) и ETW, предотвращая генерацию любых событий процессом.
AMSI — это встроенный Windows API, позволяющий Windows Defender (или другим антивирусным продуктам) глубоко взаимодействовать с операционной системой Windows и обеспечивать расширенную защиту, особенно от атак на основе памяти. AMSI позволяет продуктам безопасности лучше обнаруживать вредоносные индикаторы и помогать остановить угрозы. Поскольку AMSI встроен в Windows, продуктам не нужно «хукать» AMSI, они просто загружают необходимую DLL для получения расширенного представления о процессе. Поэтому ScareCrow загружает DLL AMSI.dll и затем патчит её, чтобы результаты сканирующего интерфейса возвращались как чистые. Патч AMSI включен по умолчанию во всех загрузчиках; если вы не хотите патчить AMSI, используйте параметр командной строки -noamsi, чтобы отключить его в вашем загрузчике.
ETW использует встроенные системные вызовы для генерации телеметрии. Поскольку ETW также является встроенной функцией Windows, продуктам безопасности не нужно «хукать» системные вызовы ETW для получения информации. В результате, чтобы предотвратить ETW, ScareCrow патчит многочисленные системные вызовы ETW, обнуляя регистры и возвращая поток выполнения к следующей инструкции. Патч ETW теперь включен по умолчанию во всех загрузчиках; если вы не хотите патчить ETW, используйте параметр командной строки -noetw, чтобы отключить его в вашем загрузчике.
В настоящее время эти опции работают только для родительского процесса; если используется параметр командной строки -injection, основной процесс будет патчить AMSI и ETW, но внедренный процесс
Шифрование shellcode — это важный метод, используемый для защиты от обнаружения и анализа EDR и другими продуктами безопасности. ScareCrow включает несколько методов шифрования shellcode: AES, ELZMA и RC4.
AES (Advanced Encryption Standard) — это симметричный алгоритм шифрования, широко используемый для шифрования данных. ScareCrow использует размер ключа AES 256 бит для шифрования shellcode. Преимущество использования AES для шифрования shellcode заключается в том, что он обеспечивает надежное шифрование и широко поддерживается криптографическими библиотеками. Однако использование фиксированного размера блока может сделать его уязвимым для некоторых атак, таких как атака на дополнение (padding oracle attack).
ELZMA — это алгоритм сжатия и шифрования, часто используемый в вредоносном ПО для обфускации кода. Для шифрования shellcode с помощью ELZMA сначала shellcode сжимается с помощью алгоритма ELZMA. Затем сжатые данные шифруются с помощью случайного ключа. Зашифрованные данные и ключ встраиваются в код эксплойта. Преимущество использования ELZMA для шифрования shellcode заключается в том, что он обеспечивает как сжатие, так и шифрование в одном алгоритме. Это может помочь уменьшить размер кода эксплойта и сделать его более сложным для обнаружения.
RC4 — это симметричный алгоритм шифрования, часто используемый в вредоносном ПО для шифрования shellcode. Это поточный шифр, который может использовать ключи переменной длины и известен своей простотой и скоростью.
Использование параметра командной строки -obfu включает флаг Garble Literal во время компиляции. Это заменяет любые ссылки и строки библиотек Go на более сложные версии, которые во время выполнения разрешаются в то же самое значение. Этот процесс занимает больше времени, что приводит к увеличению размера GO-файла. После компиляции ScareCrow анализирует созданный файл, удаляя любые строковые IoC, связанные с Go.
Аргумент командной строки доставки позволяет сгенерировать команду или строку кода (в случае макроса) для удаленной загрузки файла с удаленного источника на хост жертвы. Эти методы доставки включают: