
CobaltWhispers — это скрипт aggressor, который использует набор Beacon Object Files (BOF) для Cobalt Strike с целью выполнения инъекций в процессы, обеспечения персистентности и других задач, применяя прямые системные вызовы (SysWhispers2) для обхода EDR/AV.
Автор: @Cerbersec
CobaltWhispers — это агрессор-скрипт, использующий набор Beacon Object Files для Cobalt Strike с целью выполнения инъекций в процессы, закрепления в системе и других задач, применяя прямые системные вызовы для обхода EDR/AV.
CobaltWhispers работает на основе SysWhispers2 и InlineWhispers2
CobaltWhispers основан на StayKit, а также наработках Hasherezade и Forrest Orr.
CobaltWhispers был создан в рамках стажировки в Red Team компании NVISO Security. Соответствующие статьи в блоге можно найти здесь (process-injection) и здесь (kernel karnage).
Для компиляции CobaltWhispers требуются следующие инструменты:
apt install mingw-w64apt install makeДля работы каждого проекта необходимы 3 файла, сгенерированных SysWhispers2 / InlineWhispers2:
Эти файлы можно сгенерировать в соответствии с документацией InlineWhispers2, однако это не оптимальный способ, поскольку будет включено много неиспользуемого кода:
git clone https://github.com/Sh0ckFR/InlineWhispers2 && cd InlineWhispers2
cd SysWhispers2/ && python3 syswhispers.py --preset all -o syscalls_all && cd ..
python3 InlineWhispers2.py
Вместо этого используйте SysWhispers2 для генерации выходных файлов только для необходимых API, а затем вручную (или с помощью скрипта) передайте их в InlineWhispers2, который преобразует их в нужный формат. Дополнительную информацию см. в прилагаемом makefile, либо используйте прилагаемые файлы на свой страх и риск.
| Тип полезной нагрузки | Цель | Надёжность (0-5) | Требуются права администратора | Примечания |
|---|---|---|---|---|
| - | - | 5 | Нет | Наследует права родительского процесса |
Создаёт новый процесс в приостановленном состоянии с включённым Code Integrity Guard (CIG) для блокировки бинарных файлов, не подписанных Microsoft. Подменяет указанный родительский процесс. Возвращается PID.
Родительский процесс: имя процесса, который будет задан как родительский
Расположение исполняемого файла: полный путь к исполняемому файлу на диске, используемому для создания нового процесса
| Тип полезной нагрузки | Цель | Надёжность (0-5) | Требуются права администратора | Примечания |
|---|---|---|---|---|
| Shellcode/Raw | PID | 5 | Нет | - |
Внедряет полезную нагрузку в удалённый процесс с помощью NtCreateThreadEx
PID процесса: идентификатор удалённого процесса
Расположение полезной нагрузки: расположение полезной нагрузки в бинарном виде на диске (условно | необязательно)
Полезная нагрузка b64: исходный шеллкод в виде строки в кодировке base64 (условно | необязательно)
Listener: Listener для генерации полезной нагрузки (условно)
Для генерации Beacon-полезной нагрузки следует указать Listener. Если требуется ручная полезная нагрузка, её необходимо указать через путь к бинарному файлу на диске или в виде шеллкода в кодировке Base64.
| Тип полезной нагрузки | Цель | Надёжность (0-5) | Требуются права администратора | Примечания |
|---|---|---|---|---|
| Shellcode/Raw | PID | 2 | Нет | Возможен крах целевого процесса |
Внедряет полезную нагрузку в удалённый процесс с помощью NtQueueApcThread
PID процесса: идентификатор удалённого процесса
Потоки: количество потоков, в которые будет добавлен вызов APC
Расположение полезной нагрузки: расположение полезной нагрузки в бинарном виде на диске (условно | необязательно)
Полезная нагрузка b64: исходный шеллкод в виде строки в кодировке base64 (условно | необязательно)
Listener: Listener для генерации полезной нагрузки (условно)
Для генерации Beacon-полезной нагрузки следует указать Listener. Если требуется ручная полезная нагрузка, её необходимо указать через путь к бинарному файлу на диске или в виде шеллкода в кодировке Base64.
| Тип полезной нагрузки | Цель | Надёжность (0-5) | Требуются права администратора | Примечания |
|---|---|---|---|---|
| Shellcode/Raw | Процесс-заместитель | 5 | Нет | - |
Внедряет полезную нагрузку в процесс-заместитель с помощью NtMapViewOfSection
Родительский процесс: имя процесса, который будет задан как родительский
Расположение исполняемого файла: расположение исполняемого файла на диске, используемого для создания нового процесса
Расположение полезной нагрузки: расположение полезной нагрузки в бинарном виде на диске (условно | необязательно)
Полезная нагрузка b64: исходный шеллкод в виде строки в кодировке base64 (условно | необязательно)
Listener: Listener для генерации полезной нагрузки (условно)
Для генерации Beacon-полезной нагрузки следует указать Listener. Если требуется ручная полезная нагрузка, её необходимо указать через путь к бинарному файлу на диске или в виде шеллкода в кодировке Base64.
| Тип полезной нагрузки | Цель | Надёжность (0-5) | Требуются права администратора | Примечания |
|---|---|---|---|---|
| PE | Процесс-заместитель | 5 | Нет | Требуется полезная нагрузка в формате x64 PE |
Внедряет полезную нагрузку в процесс-заместитель с использованием транзакционных секций и отображаемых представлений. Обновляются удалённая точка входа и PEB, отсутствуют аномальные участки памяти и необычные права доступа к памяти. Дополнительную информацию см. здесь.
Родительский процесс: имя процесса, который будет задан как родительский
Расположение исполняемого файла: расположение исполняемого файла на диске, используемого для создания нового процесса
Расположение полезной нагрузки: расположение полезной нагрузки в формате x64 PE на диске (условно | необязательно)
Полезная нагрузка b64: полезная нагрузка в формате x64 PE в виде строки в кодировке base64 (условно | необязательно)
Listener: Listener для генерации полезной нагрузки (условно)
Для генерации Beacon-полезной нагрузки следует указать Listener. Если требуется ручная полезная нагрузка, её необходимо указать через путь к x64 PE на диске или в виде x64 PE в кодировке Base64.
В НАСТОЯЩЕЕ ВРЕМЯ НЕ РЕАЛИЗОВАНО
| Тип полезной нагрузки | Цель | Надёжность (0-5) | Требуются права администратора | Примечания |
|---|---|---|---|---|
| Position Independent Shellcode (PIC) | Процесс-заместитель | 5 | Да | Для открытия системных DLL с правами на запись требуются повышенные привилегии |
Внедряет полезную нагрузку в процесс-заместитель с использованием транзакционных секций в сочетании с DLL hollowing. Дополнительную информацию см. здесь.