
Доказательство концепции 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. Однако обратите внимание, что это означает потерю возможности отлаживать ваш код.