
Доказательство концепции UDRL для Cobalt Strike, созданный с помощью Crystal Palace, который объединяет технику потоковой передачи страниц Рафаэля Маджа с модульным шлюзом вызовов (Draugr).
Загрузчик Eden — это PoC UDRL для Cobalt Strike, созданный с помощью Crystal Palace, который объединяет технику потоковой передачи страниц Рафаэля Маджа (Raphael Mudge) из page streaming technique с модульным шлюзом вызовов (в настоящее время PIC-версия Sleepmask-VS Draugr callgate BOF).
Цель загрузчика Eden состоит в том, чтобы:
Для получения дополнительной информации о загрузчике Eden см. соответствующий блог.
Примечание: Назначение Eden — продемонстрировать идею использования Crystal Palace для объединения различных 'единиц выполнения' (т.е. возможностей) для создания пользовательских загрузчиков. Он не предназначен для того, чтобы быть полноценным 'обходным' загрузчиком, и поэтому в нем по замыслу отсутствует ряд базовых функций OPSEC. Например, он использует память RWX и не отслеживает/маскирует кучу Beacon'а (и поэтому он уязвим для YARA-сигнатур, таких как эта).
Примечание: В этом кратком руководстве предполагается, что вы загрузили/собрали Crystal Palace и выполнили следующие шаги для настройки среды разработки.
stage {
set sleep_mask "false";
}
WSL в корне репозитория и соберите загрузчик Eden: make clean; make.crystalpalace.jar в каталог вашего клиента Cobalt Strike.eden.cna в клиент Cobalt Strike.[14:55:55] [*] Generating Payload: HTTP -- Type: HTTP -- Arch: x64 -- Exit Function: Thread -- System Call: None -- HTTP Library: wininet
[14:55:56] [EDEN] Parsing C:\Users\wb\Desktop\eden\eden.spec...
[14:55:56] [EDEN] Applying eden ldr spec...
[14:55:56] [EDEN] Payload Size: 387060 bytes
[14:55:56] [*] Using user modified reflective DLL! DLLName=resources/beacon.x64.rl0k.dll Arch=x64
Примечание: Eden поддерживает HTTP(S), DNS и Pivot Beacons.
Одним из ограничений Crystal Palace на момент выпуска является то, что в настоящее время он поддерживает только объектные файлы, собранные с помощью mingw. Если вы попытаетесь использовать COFF, собранный с помощью MSVC или Clang, обычно возникнут ошибки перемещения. Это может быть неприятно, так как mingw не поддерживает напрямую файлы pdb, и поэтому отладка при написании сложных Windows-методов может быть затруднительной. Однако вы можете добавить опцию -g в ваш Makefile, чтобы встроить отладочную информацию в исполняемые сборки. Это позволяет проходить по вашему коду в WinDbg. Для получения дополнительной информации об этом процессе рекомендуется прочитать следующий блог от Rastamouse.
Этот репозиторий использует описанный выше подход для сборки отладочной версии Draugr (draugr.x64.exe) и кода потоковой передачи страниц (guardexec.x64.exe) по умолчанию. Отладочная сборка Draugr не имеет зависимостей и собирается сразу, однако если вы хотите пошагово пройти/отладить код потоковой передачи страниц/перехвата IAT, вам необходимо выполнить следующие шаги:
1. Экспорт Beacon без загрузчика:
debug/export_beacon_with_no_ldr.cna в ваш клиент CS и экспортируйте бесстадийный сырой x64 (HTTP) Beacon в каталог /eden/debug/. Это экспортирует DLL Beacon без отражающего загрузчика, который мы можем использовать для имитации точки входа guardexec.$ xxd -i ./beacon_x64.bin > debug_beacon.h2. Экспорт заглушки PIC Draugr из Crystal Palace:
$ ./piclink /<path>/eden/debug/draugr.spec x64 /<path>/eden/debug/draugr.bin. Это заставит Crystal Palace выдать только заглушку PIC Draugr, которую мы можем использовать для имитации точки входа guardexec.$ xxd -i ./draugr.bin > debug_druagr.h3. Начало отладки в WinDbg
make clean;makeWinDbg и выберите запуск исполняемого файла (/eden/bin/draugr.exe или /eden/bin/guardexec.exe)Open source file и выберите соответствующий файл .c (например, guardexec.c при отладке кода потоковой передачи страниц).Примечание: Не существует отладочного исполняемого файла для загрузчика, так как нет очевидного способа заставить Crystal Palace экспортировать отладочные полезные нагрузки для таких вещей, как зашифрованные DLL и их ключи. Поэтому становится нетривиальной задачей передать имитированные 'зашифрованные' буферы PIC.
Загрузчик Eden в первую очередь предназначен для демонстрации возможностей Crystal Palace путем объединения различных 'возможностей' для создания нового загрузчика. Эту идею можно развить гораздо дальше, чем в этом репозитории (например, 'статический' PIC-загрузчик, полностью настраиваемый с помощью COFF-модулей (защитные ограждения, шлюзы вызовов, маскировка сна и т.д.)).
Загрузчик Eden явно использует PIC-версию Draugr, чтобы он мог подделывать каждый вызов жизненного цикла Beacon (т.е. вызовы VirtualAlloc/LoadLibrary, используемые во время процесса отражающей загрузки). В некоторых случаях это может быть излишним (например, EDR не волнуют неподкреплённые вызовы LoadLibrary и т.д.), и в этом случае это можно изменить, чтобы использовать PICO (== 'BOF') эквивалент Draugr, который намного проще.
Загрузчик Eden намеренно пытается сохранить 'шлюз вызовов' отдельным от загрузчика. Это сделано для модульности, так как идея заключается в том, что вы можете заменять BOFы BeaconGate/шлюзов вызовов. Следовательно, код шлюза вызовов Draugr полностью самодостаточен в своем собственном объектном файле. Заменив его другой 'возможностью', вы можете кардинально изменить TTP Eden.
Загрузчик Eden намеренно не использует более новые функции Crystal Palace. Например, mergelib можно использовать с общей библиотекой Crystal Palace, LibTCG. Однако обратите внимание, что это означает потерю возможности отлаживать ваш код.
Техника потоковой передачи страниц может повлиять на производительность Beacon для некоторых команд (например, по умолчанию внедрение процесса может занимать ~1 минуту(!) при настройке 4 видимых страниц). Вы можете увеличить #define MAXVISIBLE в guardexec.h, чтобы решить большинство проблем (значение по умолчанию для Eden равно 6). Как общая информация, потоковая передача страниц может вызывать проблемы с методами внедрения процессов (особенно если они зависят от времени).
https://aff-wg.org/2025/03/13/the-security-conversation/
Загрузчик Eden построен с использованием Crystal Palace (https://tradecraftgarden.org/crystalpalace.html) и использует следующие проекты:
И наконец, благодарность @rastamouse, чьи блог-посты о Crystal Palace помогли в разработке.