Proof-of-concept User-Defined Reflective Loader (UDRL), который призван воссоздать, интегрировать и усовершенствовать функции обхода обнаружения Cobalt Strike!
Встроенный в Cobalt Strike Reflective Loader отличается надёжностью и поддерживает все функции обхода Malleable PE, которые предлагает Cobalt Strike. Главный недостаток использования собственного UDRL в том, что функции обхода Malleable PE могут поддерживаться из коробки, а могут и не поддерживаться.
Цель публичного проекта BokuLoader — помочь red team-ам создавать собственные внутренние UDRL для Cobalt Strike. Проект стремится поддерживать все значимые функции обхода Malleable PE в CS. Некоторые функции обхода используют интеграцию с CS, другие были полностью воссозданы, а некоторые не поддерживаются.
Перед использованием этого проекта в любом виде вы должны должным образом протестировать, что функции обхода работают как задумано. Из-за связки C-кода и Aggressor-скрипта компиляция с разными версиями операционных систем, компиляторов и Java может давать разные результаты.
Функции обхода
Специфичные функции обхода BokuLoader
Спуфинг стека вызовов с помощью синтетических фреймов.
Собственный код Reflective Loader на ASM/C
Косвенные системные вызовы NT через техники HellsGate и HalosGate
Все изменения защиты памяти для всех вариантов выделения памяти выполняются через косвенный системный вызов NtProtectVirtualMemory
obfuscate "true" с собственной реализацией UDRL в Aggressor-скрипте.
NOHEADERCOPY
Загрузчик не копирует заголовки из raw beacon DLL в виртуальную beacon DLL. Первые 0x1000 байт будут обнулены.
XGetProcAddress для разрешения символов
Не использует Kernel32.GetProcAddress
xLoadLibrary для определения базового адреса DLL и загрузки DLL
Для загруженных DLL получает базовый адрес DLL из TEB->PEB->PEB_LDR_DATA->InMemoryOrderModuleList
Не использует Kernel32.LoadLibraryA
Шифр Цезаря для обфускации строк
Размер UDRL — 100 КБ
Имена импортируемых DLL и строки имён импортируемых функций затираются в виртуальной beacon DLL.
HTTP/S beacon'ы поддерживаются через реализацию BokuLoader. SMB/TCP для obfuscate true в настоящее время не поддерживается. Подробности в issue. Буду рад помощи, если сможете исправить :)
entry_point
RVA в виде десятичного числа
Поддерживается через реализацию BokuLoader
cleanup
true
Поддерживается через интеграцию с CS
userwx
true/false
Поддерживается через реализацию BokuLoader
sleep_mask
(true/false) или (Sleepmask Kit+true)
Поддерживается. При использовании значения по умолчанию "sleepmask true" (без sleepmask kit) устанавливайте "userwx true". При использовании sleepmask kit с поддержкой RX-памяти beacon.text (src47/Ekko) устанавливайте "sleepmask true" && "userwx false".
magic_mz_x64
строка из 4 символов
Поддерживается через интеграцию с CS
magic_pe
строка из 2 символов
Поддерживается через интеграцию с CS
transform-x64 prepend
экранированная hex-строка
Модификация Aggressor-скрипта BokuLoader.cna
transform-x64 strrep
строка строка
Модификация Aggressor-скрипта BokuLoader.cna
stomppe
true/false
Не поддерживается. BokuLoader не копирует заголовки beacon DLL. Первые 0x1000 байт виртуальной beacon DLL — 0x00
Скомпилируйте объектный файл BokuLoader с помощью make
Запустите ваш Team Server Cobalt Strike
В Cobalt Strike импортируйте Aggressor-скрипт BokuLoader.cna
Сгенерируйте x64 beacon (Attacks -> Packages -> Windows Executable (S))
С помощью Script Console убедитесь, что BokuLoader был внедрён в сборку beacon
Вариант x86 не поддерживается. Бинарник x86 — это исходный объектный файл Reflective Loader.
Генерация RAW beacon'ов работает из коробки. При использовании Artifact Kit для загрузчика beacon переменная stagesize должна быть больше значения по умолчанию.
BokuLoader заменяет некоторые часто обнаруживаемые строки новыми захардкоженными значениями. Эти строки можно использовать для создания сигнатур BokuLoader:
Исходная строка Cobalt Strike
Строка BokuLoader Cobalt Strike
ReflectiveLoader
BokuLoader
Microsoft Base Cryptographic Provider v1.0
12367321236742382543232341241261363163151d
(admin)
(tomin)
beacon
bacons
Аллокаторы памяти
Затирание модуля DLL (DLL Module Stomping)
Для отображения DLL с диска вызывается Kernel32.LoadLibraryExA
Третий аргумент Kernel32.LoadLibraryExA — DONT_RESOLVE_DLL_REFERENCES (0x00000001)
система не вызывает DllMain
Адреса в записи LDR PEB не разрешаются, как подробно описано MDSec здесь
Может быть обнаружен сканированием памяти процесса инструментом pe-sieve
Выделение памяти в куче
Если sleepmask kit не используется, в куче будет присутствовать исполняемая память RX или RWX.
Аллокатор через отображение (Mapped Allocator)
Для выделения памяти под виртуальную beacon DLL вызываются Kernel32.CreateFileMappingA и Kernel32.MapViewOfFile.
Обнаружение Sleepmask
Если используется sleepmask kit, существуют методы обнаружения этого независимого выделения памяти, как подробно описано MDSec здесь
Косвенные системные вызовы
BokuLoader вызывает следующие системные вызовы NT для подготовки памяти загружаемого исполняемого beacon: NtAllocateVirtualMemory, NtProtectVirtualMemory
Они вызываются косвенно из исполняемой памяти BokuLoader.
Установка пользовательских хуков в ntdll.dll не позволит обнаружить эти системные вызовы.
Возможно зарегистрировать kernel-callback'и с помощью драйвера ядра для мониторинга указанных выше системных вызовов и обнаружения их использования.
Сам BokuLoader будет содержать ассемблерные инструкции mov eax, r11d; mov r11, r10; mov r10, rcx; jmp r11 в своей исполняемой памяти.
Заголовок виртуальной beacon DLL
Первые 0x1000 байт виртуальной beacon DLL равны нулю.
Доступен исходный код
Исходный код BokuLoader предоставлен в репозитории и может использоваться для создания сигнатур памяти.
Если у вас есть дополнительные рекомендации по обнаружению, пожалуйста, не стесняйтесь внести свой вклад, отправив pull request.