
Генерирует рандомизированные, проверенные линтером изменяемые профили C2 для Cobalt Strike, автоматизируя конфигурацию маячков HTTP/S, DNS, SMB и SSH с настраиваемой рандомизацией IOC.
C2concealer — это инструмент командной строки, который генерирует рандомизированные изменяемые профили C2 для использования в Cobalt Strike.
git clone https://github.com/RedSiege/C2concealer.git
cd C2concealer
python3 -m venv .venv
source .venv/bin/activate
pip3 install -e .
Обратитесь к инструкциям Docker
Usage:
$ C2concealer --hostname google.com --variant 3
Flags:
(optional)
--hostname
Имя хоста, используемое в настройках HTTP-клиента и сервера. По умолчанию — None.
--variant
Целое число, определяющее количество вариантов HTTP-клиента/сервера для генерации.
Рекомендуется от 1 до 5. Макс. 10.
root@kali:~# C2concealer --variant 1 --hostname google.com
[i] Searching for the c2lint tool on your system (part of Cobalt Strike). Might take 10-20 seconds.
[i] Found c2lint in the /opt/cobaltstrike/c2lint directory.
Choose an SSL option:
1. Self-signed SSL cert (just input a few details)
2. LetsEncrypt SSL cert (requies a temporary A record for the relevant domain to be pointed to this machine)
3. Existing keystore
4. No SSL
[?] Option [1/2/3/4]:
Совет: Всегда используйте SSL-сертификат. Желательно сертификат от LetsEncrypt или аналогичный. Совет: Варианты HTTP позволяют выбирать разные IOC для HTTP-трафика на разных маяках. Рекомендуется значение не менее 1.
Мы тщательно изучили документацию Cobalt Strike и определили диапазоны значений, которые имеют смысл для каждого атрибута профиля. Иногда эти данные настолько просты, как случайное целое число в некотором диапазоне, а в других случаях нам нужно выбрать случайное значение из словаря Python. В любом случае, мы начали создание инструмента с определения данных, которые будут составлять валидный профиль.
Затем мы разделили каждый раздел (или блок) изменяемого профиля в отдельный .py файл, который содержит логику для получения случайных подходящих значений для каждого атрибута и вывода форматированной строки для этого блока профиля. Мы объединяем все блоки профиля вместе, выполняем несколько быстрых проверок на согласованность, а затем прогоняем профиль через линтер Cobalt Strike (c2lint). На выходе получается профиль, который должен работать для ваших задач. Мы всегда рекомендуем тестировать профиль (включая инъекцию процессов и спавнинг) перед началом кампании.
Если вы изучаете код, мы рекомендуем начать с этих двух файлов: /C2concealer/main.py и /C2concealer/profile.py. После ознакомления с комментариями посмотрите отдельные генераторы блоков профиля в папке: /C2concealer/components.
Это критически важно. Это open-source инструмент. Вендоры могут легко написать сигнатуры для генерируемых им профилей. Хотя запуск инструмента дает отличное начало для создания изменяемого профиля Cobalt Strike, мы рекомендуем углубиться в следующие области для настройки данных, используемых для заполнения генерируемых профилей:
/C2concealer/data/
Кроме того, вы можете настраивать различные атрибуты на протяжении всего процесса генерации профиля. Например, в файле: /C2concealer/components/stageblock.py вы можете изменить диапазон, из которого берется значение размера образа PE (около строк 73-74). Пожалуйста, просмотрите все файлы в каталоге components.
Если вы дошли до этого места, значит, мы знаем, что вы получите большую пользу от этого инструмента. Мы рекомендуем рассматривать этот инструмент как скелетный код для автоматической генерации профилей. Теперь вам предстоит обдумать, какие значения имеют смысл для каждого атрибута в ваших кампаниях, и обновить источники данных.
Хотя мы рассмотрели множество возможных опций языка профилей Malleable C2, есть много опций, которые мы не устанавливаем. Мы настоятельно рекомендуем вам обратиться к документации Malleable Command and Control и изменить свой профиль.
Следующие опции не установлены или установлены статически C2concealer, и вам следует рассмотреть их изменение.
http-config Block| Отсутствующая опция | Примечания |
|---|---|
set block_useragents | Блокировать шаблоны UA, не относящиеся к маякам |
set allow_useragents | Разрешить шаблоны UA (CS 4.3+) |
stage Blockprocess-inject Blockpost-ex Block| Отсутствующая опция | Примечания |
|---|---|
set pipename | Именованный канал для задач post-ex |
dns-beacon Block| Отсутствующая опция | Примечания |
|---|---|
set ns_response | Обработка NS: drop/idle/zero. По умолчанию drop, если не задано. |
| Отсутствующее преобразование | Примечания |
|---|---|
lznt1 | Сжатие — нет ни в одной цепочке кодирования |
Большое спасибо Raphael Mudge за постоянное улучшение набора функций изменяемых профилей и документации для их изучения. Также огромная благодарность @killswitch-GUI за его скрипт, автоматизирующий генерацию сертификатов LetsEncrypt для командных серверов CS. Наконец, два поста в блогах, которые сделали жизнь намного проще: пост @bluescreenofjeff (https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/) и пост Joe Vest (https://posts.specterops.io/a-deep-dive-into-cobalt-strike-malleable-c2-6660e33b0e0b).
Версия 1.0
Версия 1.1
| Отсутствующая опция | Примечания |
|---|
set allocator | Жёстко закодирован VirtualAlloc; отсутствует рандомизация HeapAlloc, MapViewOfFile |
set magic_mz_x86 / magic_mz_x64 | Подмена заголовка MZ |
set magic_pe | Подмена маркера PE |
set rich_header | Подмена метаданных компилятора |
set module_x86 / module_x64 | Замена модуля |
set copy_pe_header | — |
set data_store_size | — |
set eaf_bypass | Обход проверки EAT |
set syscall_method | None/Direct/Indirect (CS 4.8+) |
set rdll_loader | PrependLoader/StompLoader |
set rdll_use_syscalls | — |
set rdll_use_driploading | — |
set rdll_dripload_delay | — |
transform-obfuscate block | Опции base64, lznt1, rc4, xor полностью отсутствуют |
append in transform-x86/x64 | Используются только prepend и strrep |
| Отсутствующая опция | Примечания |
|---|
set allocator | Жёстко закодирован VirtualAllocEx; отсутствует рандомизация NtMapViewOfSection |
set use_driploading | — |
set dripload_delay | — |
append in transform-x86/x64 | Используется только prepend |
Execute: NtQueueApcThread | Не в блоке execute |
Execute: NtQueueApcThread-s | Не в блоке execute |
Execute: ObfSetThreadContext | Не в блоке execute |
Execute: SetThreadContext | Не в блоке execute |
| Подмена функции Execute | Синтаксис module!function+0x## не поддерживается |
set dns_stager_prepend| Добавить данные перед полезной нагрузкой стейджера |
rc4 "key"| Шифрование — нет ни в одной цепочке кодирования |
xor "key" | XOR — нет ни в одной цепочке кодирования |
uri-append | Завершающее выражение — не реализовано |