
Python API для использования со спецификацией External C2 от Cobalt Strike
Фреймворк на Python для использования со спецификацией External C2 от Cobalt Strike, как описано в спецификации.
Основная цель дизайна — создать очень модульную реализацию спецификации external c2, которая обеспечивает достаточный уровень абстракции для простой реализации C2-каналов для Cobalt Strike. В идеале, всё, что нужно сделать пользователю — это создать модуль transport, модуль encoder и заполнить конфигурационный файл для реализации нового канала.
Вам потребуется выполнить несколько изменений в конфигурации перед тем, как всё заработает. Вам нужно:
builds/client/dbox/dbox_client.py измените token на сгенерированный на шаге 2.builds/server/utils/transports/transport_dbox.py сделайте те же изменения, что и на шаге 3.cd builds/client/dbox && ./compile_dll.shstart_externalc2.cna из вашего CS-клиента.cd builds/server/ && ./dbox_server.pyСсылка на видео-демонстрацию: https://www.youtube.com/watch?v=nTRHSh_uCcA
Этот проект состоит из трёх основных частей:
Builder динамически собирает развёртывания клиента и сервера на основе указанной конфигурации. В идеале клиент можно распространять в виде одного скомпилированного файла, такого как dll или exe.
Клиент — это, по сути, полезная нагрузка, которая выполняется на конечной точке, в спецификации она называется third-party client. Логика клиента в основном статична:
transporttransporttransport на предмет новых задачtransportКонфигурации, необходимые для транспортного и кодирующего механизмов, статически копируются в клиент. Логика функций для транспортного и кодирующего механизмов также статически копируется из соответствующих модулей.
Логика внедрения процесса определяется builder-ом.
Сервер — это приложение, которое выступает посредником между client и c2 server, в спецификации он называется third-party Client Controller. Логика сервера в основном статична, но поддерживает подробный и отладочный вывод для помощи в разработке:
encodertransporttransportencodertransporttransportencoderРешение о том, какие модули encoder и transport импортирует сервер, определяется значениями, хранящимися в config.py.
Импорт неиспользуемых модулей transport или encoder не выполняется.
В следующих таблицах описаны общие функции между модулями encoding и transport и клиентом. Общие функции — это, по сути, один и тот же код.
ОЧЕНЬ ВАЖНОЕ ПРИМЕЧАНИЕ: Данные, отправляемые в функции клиента sendData и recvData, должны быть сырыми данными, тогда как данные, отправляемые в функции транспортного модуля sendData и retrieveData, должны быть уже закодированы или декодированы по мере необходимости.
| Функция транспорта | Функция клиента | Описание |
|---|---|---|
| prepTransport |
| Функция кодировщика | Функция клиента | Описание |
|---|---|---|
| encode | encode | Определяет изменения, вносимые в необработанные данные для подготовки их к транспортировке |
| decode | decode | Определяет изменения, вносимые в необработанные данные, полученные от транспорта, для их передачи по назначению |
Сначала определите, какой транспортный и кодирующий модуль вы хотите использовать. Для следующего примера используем transport_gmail и encoder_b64url.
Затем измените server/config.py под свои нужды, убедившись, что ENCODER_MODULE и TRANSPORT_MODULE правильно настроены и указывают на нужные вам модули:
EXTERNAL_C2_ADDR = "127.0.0.1"
EXTERNAL_C2_PORT = "2222"
C2_PIPE_NAME = "foobar"
C2_BLOCK_TIME = 100
C2_ARCH = "x86"
IDLE_TIME = 5
ENCODER_MODULE = "encoder_b64url"
TRANSPORT_MODULE = "transport_gmail"
verbose = False
debug = False
Затем измените раздел конфигурации для выбранных вами модулей transport и encoder.
Убедитесь, что раздел конфигурации в client/mechanism/$mechanism_client.py соответствует всем конфигурациям, которые вы определили до сих пор.
На машине, где запускается сервер, выполните:
python server.py
Для более подробного вывода вы можете запустить:
python server.py -v
Для ещё более подробного вывода и дополнительной информации, полезной для отладки, вы можете запустить:
python server.py -d
Затем выполните клиент на целевой конечной точке.
Если всё сработало, в консоли Cobalt Strike зарегистрируется новый beacon, с которым вы можете взаимодействовать.
Зачем вы это написали?: Было не так много опубликованных реализаций спецификации, а из тех, что были опубликованы, некоторые либо написаны на незнакомом мне языке, либо не обладают необходимой модульностью и абстракцией.
Почему Python 2?: Мне лень, и на нём легко реализовывать новые транспортные и кодирующие каналы.
Ваш код — отстой: Это не вопрос.
Могу ли я отправить новый транспортный и/или кодирующий модуль?: Да, пожалуйста! Отправьте pull request, и я с удовольствием его рассмотрю.
Подобная абстракция и модульность будут реализованы и в клиентском компоненте, чтобы поддерживать различные методы внедрения процесса для полезной нагрузки beacon и другие функции, запланированные в дорожной карте.
В настоящее время отсутствует функциональность builder, которая предназначена для динамической сборки развёртываний клиента и сервера, но она находится в дорожной карте.
| prepTransport |
| Выполняет любые предварительные настройки, необходимые для использования транспортного механизма |
| sendData | sendData | Определяет, как данные отправляются через транспортный механизм |
| retrieveData | recvData | Определяет, как данные принимаются через транспортный механизм |