ScareCrow

Post-Exploitation v5.1 · 27.04.2023 не обновлялся >2 лет

Фреймворк для исследования генерации и подписи полезной нагрузки — изучает, как средства защиты Windows реагируют на разные способы доставки и запуска. Проект архивирован автором, но остаётся справочным материалом по теме.

v5.1
27.04.2023 current

Установка
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
go build ScareCrow.go
показать оригинал переведено ИИ

ЭТОТ РЕПОЗИТОРИЙ АРХИВИРОВАН

Чтобы просмотреть последнюю версию ScareCrow или отправить отчёт об ошибке, обратитесь к https://github.com/Tylous/ScareCrow.



ScareCrow

Дополнительная информация

Если вы хотите узнать больше о методах, используемых в этом фреймворке, пожалуйста, ознакомьтесь с Частью 1 и Частью 2.

Описание

ScareCrow — это фреймворк для создания полезной нагрузки, который загружает (не инжектирует) DLL в легитимный процесс Windows (обходя контроль списков разрешенных приложений). После загрузки загрузчика DLL в память он использует технику для удаления хуков EDR из системных DLL, работающих в памяти процесса. Это работает, потому что мы знаем, что хуки EDR устанавливаются при создании процесса.

ScareCrow может нацелиться на эти DLL и манипулировать ими в памяти с помощью функции API VirtualProtect, которая изменяет разрешения на участок памяти процесса на другое значение, а именно с Execute–Read на Read-Write-Execute.

ScareCrow использует один из двух методов для удаления хуков:

Диск

При выполнении ScareCrow копирует байты системных DLL, хранящихся на диске в C:\Windows\System32\. Эти DLL хранятся на диске «чистыми» от хуков EDR, так как система использует их для загрузки неизменённой копии в новый процесс при его создании. Поскольку EDR устанавливает хуки только в памяти, файлы остаются неизменёнными. ScareCrow не копирует весь файл DLL, а сосредотачивается только на секции .text DLL. Эта секция содержит исполняемый ассемблерный код, и таким образом ScareCrow снижает вероятность обнаружения, так как повторное чтение целых файлов может вызвать обнаружение EDR, что указывает на модификацию системного ресурса. Затем данные копируются в нужную область памяти с использованием смещения каждой функции. У каждой функции есть смещение, которое обозначает точное количество байт от базового адреса, где они находятся, что указывает на расположение функции в стеке.

Для этого ScareCrow изменяет разрешения на область памяти секции .text с помощью VirtualProtect. Несмотря на то, что это системная DLL, так как она загружена в наш процесс (которым мы управляем), мы можем изменить разрешения памяти без необходимости повышенных привилегий.

Непрямые системные вызовы

ScareCrow загружает шеллкод в память, сначала расшифровывая его. Шеллкод шифруется одним из трёх методов шифрования (описанных ниже). После расшифровки и загрузки шеллкод выполняется. В зависимости от заданных опций загрузчика ScareCrow настраивает различные экспортируемые функции для DLL. Загруженная DLL также не содержит стандартную функцию DLLMain, которая обычно требуется для работы всех DLL. DLL всё равно будет выполняться без проблем, так как процесс, в который она загружается, будет искать эти экспортируемые функции и не будет обращать внимания на отсутствие DLLMain.

Пример бинарного файла

После

KnownDLLs

KnownDLLs — это список DLL, которые загружаются Windows во время запуска системы. Поскольку эти DLL считаются необходимыми для работы операционной системы, они кэшируются, чтобы сократить время загрузки и улучшить производительность при запуске приложений. В KnownDLLs входят такие DLL, как kernel32.dll, kernelbase.dll и ntdll.dll.

Используя эти KnownDLLs, ScareCrow отображает копию DLL из \KnownDlls\<имя_dll> с помощью комбинации NtOpenSection и NtMapViewOfSection для загрузки её в память процесса. ScareCrow не загружает всю DLL, а только секцию .text (так как она содержит все системные вызовы). Затем ScareCrow использует непрямые системные вызовы для вызова NtProtectVirtualMemory и изменения разрешений секции памяти .text DLL, чтобы позволить ScareCrow перезаписать хуки EDR перед восстановлением разрешений.

Более подробную информацию можно прочитать в подробной статье от modexp.

После удаления хуков ScareCrow использует пользовательские системные вызовы для загрузки и выполнения shellcode в памяти. ScareCrow делает это даже после удаления хуков EDR, чтобы избежать обнаружения инструментами сбора телеметрии на основе хуков, работающими не в пользовательском режиме, такими как Event Tracing for Windows (ETW) или другими механизмами ведения журнала событий. Эти пользовательские системные вызовы также используются для выполнения вызова VirtualProtect, чтобы удалить хуки, установленные EDR, описанные выше, и избежать обнаружения средствами защиты от вмешательства EDR. Это достигается путём вызова пользовательской версии системного вызова VirtualProtect — NtProtectVirtualMemory. ScareCrow использует Golang для генерации этих загрузчиков, а затем ассемблер — для пользовательских функций системных вызовов.

Во время создания загрузчика ScareCrow использует библиотеку для слияния с фоновыми процессами после того, как бейкон свяжется с сервером. Эта библиотека выполняет две задачи:

Файлы, подписанные сертификатами подписи кода, часто подвергаются меньшему контролю, что упрощает их выполнение без проверки, так как файлы, подписанные доверенным именем, обычно вызывают меньше подозрений, чем другие. У большинства антивирусных продуктов нет времени на проверку и валидацию этих сертификатов (хотя некоторые теперь это делают, но обычно распространённые имена вендоров включаются в белый список). ScareCrow создаёт такие сертификаты с помощью версии инструмента limelighter на Go для создания файла pfx12. Этот пакет принимает введённое пользователем доменное имя и создаёт сертификат подписи кода для этого домена. При необходимости можно также использовать собственный сертификат подписи кода, если он у вас есть, с помощью соответствующей опции командной строки.

  • ScareCrow также позволяет взять полную цепочку сертификатов и все атрибуты из легитимного сертификата подписи кода из файла и скопировать их в другой файл. Это включает дату подписи, контрподписи и другие измеримые атрибуты. Эта опция может использовать файлы DLL или .exe для копирования с помощью опции командной строки clone, а также пути к файлу, из которого нужно скопировать сертификат.

Соображения по OpSec:

  При подписывании загрузчика сертификатом microsoft.com его использование против продуктов WINDOWS DEFENDER ATP может быть менее эффективным, так как они могут проверить сертификат, так как он принадлежит им. Если вы используете загрузчик против продукта Windows, возможно, стоит использовать другой домен.
  • Подделка атрибутов загрузчика: Это достигается с помощью файлов syso, которые представляют собой форму встроенных ресурсных файлов. При компиляции вместе с нашим загрузчиком они изменяют части атрибутов нашего скомпилированного кода. Перед генерацией файла syso ScareCrow создаёт случайное имя файла (на основе типа загрузчика). После выбора это имя файла будет сопоставлено с соответствующими атрибутами для этого имени, чтобы гарантировать назначение правильных значений.

Пример атрибутов файла

С помощью этих файлов и кода на Go ScareCrow кросс-компилирует их в DLL с использованием опции c-shared library. После компиляции 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 для обфусцирования всех загрузчиков. Примечание: Некоторые зависимости плохо работают при компиляции на 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 в целевую систему. Если не выбран ни один вариант загрузчика, ScareCrow просто скомпилирует стандартный DLL-файл, который можно использовать с помощью rundll32, regsvr32 или других техник, использующих DLL. ScareCrow использует три различных типа загрузчиков для загрузки shellcode в память: * Панель управления — генерирует апплет панели управления (например, «Программы и компоненты» или «Автозапуск»). Компилируя загрузчик с определёнными экспортируемыми функциями DLL в сочетании с расширением файла .cpl, он создаст процесс панели управления (rundll32.exe), и загрузчик будет загружен в память. * WScript — создаёт процесс WScript, который использует манифест и техникой регистрации без COM для загрузки (не инжекции) DLL-загрузчика в собственный процесс, бок о бок. Это позволяет избежать регистрации DLL в памяти, так как манифест сообщает процессу, какую, где и какую версию DLL загружать. * Excel — генерирует XLL-файл, который представляет собой DLL-файл на основе Excel; при загрузке в Excel он выполняет загрузчик. Будет создан скрытый процесс Excel, что заставит загрузить XLL-файл. * Msiexec — создаёт скрытый процесс MSIExec, который загрузит DLL в память и выполнит shellcode.

ScareCrow также может генерировать бинарные полезные нагрузки при необходимости с помощью опции командной строки -Loader. Эти бинарные файлы не используют техник бок о бок загрузки, но служат дополнительным способом выполнения shellcode в зависимости от ситуации.


Консоль

ScareCrow использует технику, при которой сначала создаётся процесс, а затем он перемещается в фоновый режим. Это делает две вещи: во-первых, помогает скрыть процесс, а во-вторых, позволяет избежать обнаружения любыми продуктами EDR. Немедленное создание процесса в фоновом режиме может быть очень подозрительным и указывать на злонамеренность. ScareCrow делает это, вызывая функции Windows GetConsoleWindow и ShowWindow после создания процесса и загрузки хуков EDR, а затем изменяет атрибуты окна на скрытые. ScareCrow использует эти API вместо традиционного -ldflags -H=windowsgui, так как это сильно сигнатурируется и классифицируется в большинстве продуктов безопасности как индикатор компрометации.

Если выбрана опция командной строки -console, ScareCrow не будет скрывать процесс в фоновом режиме. Вместо этого ScareCrow добавит несколько отладочных сообщений, показывающих, что делает загрузчик.


Методы выполнения

ScareCrow использует различные шаблоны для выполнения shellcode. Чтобы выбрать шаблон, используйте опцию командной строки -Exec. Эти шаблоны включают:

  • RtlCopy
  • NtQueueApcThreadEx
  • VirtualAlloc
  • ProcessInjection

Инжекция процесса

ScareCrow поддерживает атаки с инжекцией процесса. Чтобы избежать перехвата или обнаружения как в процессе загрузчика, так и в самом инжектируемом процессе, ScareCrow сначала отключает хуки в процессе загрузчика, чтобы убедиться, что в нём нет хуков. После завершения загрузчик создаст процесс, указанный в команде создания. После создания загрузчик получит дескриптор процесса, чтобы получить список загруженных DLL. Найдя DLL, он перечислит базовые адреса каждой DLL в удалённом процессе. С помощью функции WriteProcessMemory загрузчик запишет байты системных DLL, хранящихся на диске (так как они «чистые» от хуков EDR), без необходимости предварительно изменять права доступа к памяти. ScareCrow использует WriteProcessMemory, потому что эта функция содержит возможность, используемую в отладке: даже если участок памяти доступен только для чтения, при правильном вызове WriteProcessMemory она временно изменит права доступа на чтение-запись, обновит участок памяти, а затем восстановит исходные права. После этого загрузчик может инжектировать shellcode в созданный процесс без проблем, так как в обоих процессах нет хуков EDR.

Эту опцию можно использовать с любым из вариантов загрузчика. Чтобы включить инжекцию процесса, используйте опцию командной строки -injection вместе с полным путём к процессу, в который вы хотите выполнить инжекцию. При указании пути в качестве аргумента важно либо окружить полный путь кавычками "", либо использовать двойные \ для каждой директории в пути.


Обход AMSI и ETW

ScareCrow содержит возможность исправления AMSI (Antimalware Scan Interface) и функций ETW, предотвращая генерацию любых событий процессом.

AMSI — это собственный API Windows, который позволяет Защитнику Windows (или другим антивирусным продуктам) глубоко интегрироваться в операционную систему 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

AES (Advanced Encryption Standard) — это симметричный алгоритм шифрования, широко используемый для защиты данных. ScareCrow использует AES с длиной ключа 256 бит для шифрования shellcode. Преимущество использования AES для шифрования shellcode заключается в том, что он обеспечивает надёжное шифрование и широко поддерживается криптографическими библиотеками. Однако использование фиксированного размера блока может сделать его уязвимым к определённым атакам, например, к атаке с использованием оракула заполнения.

ELZMA

ELZMA — это алгоритм сжатия и шифрования, часто используемый в вредоносном ПО для обфускации кода. Чтобы зашифровать shellcode с помощью ELZMA, сначала shellcode сжимается с использованием алгоритма ELZMA. Затем сжатые данные шифруются с использованием случайного ключа. Зашифрованные данные и ключ встраиваются в эксплойт. Преимущество использования ELZMA для шифрования shellcode заключается в том, что он обеспечивает как сжатие, так и шифрование в одном алгоритме. Это может помочь уменьшить размер кода эксплойта и сделать его более сложным для обнаружения.

RC4

RC4 — это симметричный алгоритм шифрования, часто используемый в вредоносном ПО для шифрования shellcode. Это потоковый шифр, который может использовать ключи переменной длины и известен своей простотой и скоростью.


Обфускация

Использование опции командной строки -obfu включает флаг Garbles Literal во время процесса компиляции. Это заменяет любые ссылки на библиотеки Go и строки на более сложные версии, которые разрешаются в те же значения во время выполнения. Этот процесс занимает больше времени, что приводит к увеличению размера файла GO. После компиляции файла ScareCrow анализирует newly созданный файл, удаляя все строковые IOC на основе Go.


Доставка

Аргумент командной строки delivery позволяет сгенерировать команду или строку кода (в случае макроса), чтобы удалённо загрузить файл из внешнего источника на хост жертвы. Эти методы доставки включают: * Bits — это сгенерирует команду bitsadmin, которая удалённо загружает загрузчик, выполняет его и удаляет. Эта команда доставки совместима с загрузчиками Binary, Control, Excel и Wscript. * HTA — это сгенерирует пустой HTA-файл, содержащий загрузчик. Эта опция также предоставит командную строку, которая удалённо выполнит HTA. Эта команда доставки совместима с загрузчиками Control и Excel. * Macro — это сгенерирует макрос Office, который можно вставить в документ Excel или Word. При выполнении этого макроса загрузчик будет загружен из удалённого источника, выполнен, а затем удалён. Эта команда доставки совместима с загрузчиками Control, Excel и Wscript. (Обратите внимание, что этот метод может занять больше времени, чем таймер по умолчанию, в зависимости от доступных ресурсов на конечной точке жертвы)


Планы на будущее


  • Некоторые более старые версии ОС Windows (например, Windows 7 или Windows 8.1) имеют проблемы с перезагрузкой системных DLL, поэтому в инструмент встроена проверка версии для обеспечения стабильности.
  • Исправление ETW и AMSI в внедрённых процессах.

Благодарности

  • Особая благодарность josephspurrier за его репозиторий.
  • Особая благодарность mvdan за разработку Garble.
  • Особая благодарность mvdan за разработку Binject.
  • Особая благодарность modexp за подробную статью.
Войдите, чтобы оставить комментарий