Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!
BokuLoader — Доказательство концепции Cobalt Strike Reflective Loader, целью которого является воссоздание, интеграция и улучшение функций обхода защиты Cobalt Strike! | Kitploit
Доказательство концепции Cobalt Strike Reflective Loader, целью которого является воссоздание, интеграция и улучшение функций обхода защиты Cobalt Strike!
Встроенный рефлективный загрузчик Cobalt Strike является надежным и поддерживает все функции обхода PE, предоставляемые Cobalt Strike. Основной недостаток использования пользовательского UDRL заключается в том, что функции обхода PE могут поддерживаться или не поддерживаться "из коробки".
Цель публичного проекта BokuLoader — помочь red-командам создать собственный внутренний UDRL для Cobalt Strike. Проект направлен на поддержку всех значимых функций обхода PE Cobalt Strike. Некоторые функции обхода используют интеграцию CS, другие были полностью переработаны, а некоторые не поддерживаются.
Перед использованием этого проекта в любой форме вы должны проверить, что функции обхода работают как задумано. Между кодом на C и скриптом Aggressor компиляция с разными версиями операционных систем, компиляторов и Java может давать разные результаты.
Функции обхода
Специфичные для BokuLoader функции обхода
Спуфинг стека вызовов рефлективного загрузчика с помощью синтетических фреймов.
Код рефлективного загрузчика на ASM/C.
Косвенные системные вызовы NT через техники HellsGate и HalosGate.
Все изменения защиты памяти для всех вариантов выделения выполняются с помощью косвенного системного вызова NtProtectVirtualMemory.
obfuscate "true" с пользовательской реализацией скрипта Aggressor для UDRL.
NOHEADERCOPY
Загрузчик не будет копировать заголовки сырого beacon DLL в виртуальный beacon DLL. Первые 0x1000 байт будут нулевыми.
XGetProcAddress для разрешения символов
Не использует Kernel32.GetProcAddress.
xLoadLibrary для разрешения базового адреса DLL и загрузки DLL
Для загруженных DLL получает базовый адрес из TEB->PEB->PEB_LDR_DATA->InMemoryOrderModuleList.
Не использует Kernel32.LoadLibraryA.
Шифр Цезаря для обфускации строк.
Размер UDRL 100k.
Имена импортируемых DLL и строки имен записей импорта затираются в виртуальном beacon DLL.
Beacon'ы HTTP/S поддерживаются через реализацию 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
экранированная шестнадцатеричная строка
Модификация скрипта 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 — это оригинальный объектный файл рефлективного загрузчика.
Генерация 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
Вызов Kernel32.LoadLibraryExA для отображения DLL с диска.
Третий аргумент Kernel32.LoadLibraryExA — DONT_RESOLVE_DLL_REFERENCES (0x00000001).
система не вызывает DllMain.
Не разрешает адреса в записи PEB LDR, как подробно описано здесь у MDSec.
Обнаруживается сканированием памяти процесса с помощью pe-sieve.
Выделение в куче
Исполняемая память RX или RWX будет существовать в куче, если не используется sleepmask kit.
Аллокатор отображения
Вызов Kernel32.CreateFileMappingA и Kernel32.MapViewOfFile для выделения памяти для виртуального beacon DLL.
Обнаружение Sleepmask
Если используется sleepmask kit, существуют методы обнаружения этого независимого выделения памяти, как подробно описано MDSec.
Косвенные системные вызовы
BokuLoader вызывает следующие системные вызовы NT для настройки памяти загружаемого исполняемого beacon: NtAllocateVirtualMemory, NtProtectVirtualMemory.
Они вызываются косвенно из исполняемой памяти BokuLoader.
Установка перехватчиков пользовательского режима в ntdll.dll не обнаружит эти системные вызовы.
Возможна регистрация обратных вызовов ядра с помощью драйвера ядра для отслеживания вышеуказанных системных вызовов и обнаружения их использования.
Сам BokuLoader будет содержать инструкции ассемблера mov eax, r11d; mov r11, r10; mov r10, rcx; jmp r11 в своей исполняемой памяти.
Заголовок виртуального beacon DLL
Первые 0x1000 байт виртуального beacon DLL равны нулям.
Исходный код доступен
Исходный код BokuLoader предоставлен в репозитории и может быть использован для создания сигнатур памяти.
Если у вас есть дополнительные рекомендации по обнаружению, пожалуйста, внесите свой вклад, отправив pull request.