
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, которая будет встроена в файл. Это позволяет удалённо получать файл, получать к нему доступ и выполнять его программно.