Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
external_c2_framework — Python API для использования со спецификацией External C2 от Cobalt Strike | Kitploit
Инструменты/GitHubGitHub/und3rf10w/external_c2_framework
Фреймворки для пентестаФреймворки для эксплойтовПост-эксплуатацияКомандование и УправлениеRed TeamingРазработка Полезной Нагрузки
GitHubund3rf10w/external_c2_framework

external_c2_framework

Python API для использования со спецификацией External C2 от Cobalt Strike

Репозиторий
23996204 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

external_c2 framework

Python-фреймворк для создания и использования интерфейсов передачи данных между фреймворками, с особым акцентом на использование в качестве расширения для фреймворков управления командными центрами (Command and Control).

В настоящее время это предполагается только как реализация спецификации External C2 от Cobalt Strike, описанной в этом документе спецификации, но по мере развития проекта это может измениться.

Благодарности

Огромная благодарность xychix. Этот проект был бы вообще невозможен без его ценного вклада. По сути, этот проект является переработкой и расширением проекта External C2 от Outflank

Архитектура

Этот проект состоит из следующих основных частей:

  • Builder
  • Skeletons
  • Frameworks
  • Transports
  • Encoders
  • Manager (ещё не реализован)

Builder

Builder считывает файл конфигурации и использует настроенные параметры для генерации сборки путём замены маркеров внутри skeletons.

Builder можно использовать с помощью build_files.py. Пример конфигурации builder'а предоставлен как sample_builder_config.config.sample.

Skeletons

skeletons — это различные «скелеты» кода, которые builder динамически заполняет для генерации полностью рабочей сборки. skeletons содержат маркеры, которые будут заменены builder'ом на используемые значения. Существует три различных «типа» скелетов:

Маркеры скелетов

Маркер может быть размещён в любом файле внутри skeleton, и он будет заменён значением, указанным в конфигурации builder'а. Согласно лучшим практикам, маркеры никогда не должны использоваться для непосредственной записи переменных и должны использоваться только для установки значений. Если значение маркера необходимо использовать повторно, следует сохранить значение в переменной и ссылаться на него таким образом, вместо повторного использования того же маркера.

Формат маркера: ```[var:::identifier_for_the_marker]```

Строки будут записаны в скелет, обрамлённые одинарными кавычками, а числа будут записаны как есть.

В случае, если строка в конфигурации заключена в двойные кавычки, строка будет записана в файл в двойных кавычках, а обрамляющие одинарные кавычки будут удалены.

Эту зависимость можно продемонстрировать так:

#################
# Skeleton Code #
#################

# Skeleton contains the following line of code:
foo = ```[var:::bar]```

##############
# End Result #
##############

# Stored in config as:
#   foo = bar
# Written as:
foo = 'bar'

# Stored in config as:
#   foo = "bar"
# Written as:
foo = "bar"

# Stored in config as:
#   foo = 2
# Written as:
foo = 2

# Stored in config as:
#  foo = "2"
# Written as:
foo = "2"

Frameworks

Frameworks — это базовое приложение, которое определяет, какие данные используются transport и encoder, и как эти данные используются. То, что конкретный framework фактически делает, не имеет большого значения, если существует логика для импорта и использования encoder и transport. Большинство важных частей фреймворка (в первую очередь логика client) будут храниться в виде skeleton, а интерфейс для взаимодействия с серверной его частью будет храниться как базовый объект framework.

Как правило, фреймворк содержит server и client и использует encoders и transports для передачи данных между ними.

При создании framework следует учитывать несколько основных моментов:

  • framework отвечает за то, чтобы encoder был доступен transport для использования.
  • Если framework использует связь клиент-сервер, они должны быть соответствующим образом организованы.
  • Понимайте, что в большинстве случаев конечный пользователь никогда не будет напрямую взаимодействовать с client фреймворка, поэтому если вы хотите, чтобы что-то можно было перенастраивать на client, ему необходимо уметь делать это во время выполнения без прямого взаимодействия.
  • Не должно быть большой необходимости в создании skeleton для server, потому что конечный пользователь будет напрямую взаимодействовать с server фреймворка. Вместо этого следует как считывать параметры из конфигурации, так и давать конечному пользователю возможность изменять параметры (например, таймер блокировки или подробность вывода) во время выполнения.
  • Skeleton фреймворка будет обработан builder'ом, который перебирает каждый файл в нём, поэтому, если определённый аргумент должен быть настраиваемым во время сборки, это можно легко сделать.
  • server фреймворка должен иметь возможность взаимодействовать с общим framework_manager.

Сервер фреймворка

Сервер — это приложение, которое обеспечивает связь между client и c2 server. Логика сервера в основном статична. Логика сервера для фреймворка cobalt_strike, называемая в спецификации third-party Client Controller, показана ниже:

  1. Разобрать конфигурацию
  2. Импортировать указанный модуль кодирования
  3. Импортировать указанный модуль транспорта
  4. Установить соединение с c2-сервером
  5. Запросить стейджер у c2-сервера
  6. Закодировать стейджер с помощью модуля encoder
  7. Передать стейджер с помощью модуля transport
  8. Ожидать ответ метаданных от клиента, полученный через transport
  9. Декодировать метаданные с помощью модуля encoder
  10. Передать метаданные на c2-сервер.
  11. Получить новую задачу от c2-сервера.
  12. Закодировать новую задачу
  13. Передать новую задачу клиенту через transport
  14. Получить ответ от клиента, полученный через transport
  15. Декодировать ответ с помощью модуля encoder
  16. Передать ответ на c2-сервер.
  17. Повторять шаги 11–16

server должен поддерживать возможность работы с несколькими клиентами (ещё не реализовано) и иметь интерфейс для взаимодействия с framework_manager.

Клиент фреймворка

Клиент — это, по сути, полезная нагрузка (payload), которая запускается на конечной точке. Логика клиента для фреймворка cobalt_strike в основном статична и показана ниже:

  1. Выполнить все необходимые приготовления для использования transport
  2. Получить стейджер
  3. Внедрить стейджер и открыть дескриптор для beacon
  4. Получить метаданные от beacon
  5. Передать метаданные от beacon на C2-сервер через transport
  6. Следить за transport на предмет новых задач
  7. Передавать новые задачи в beacon
  8. Передавать ответы от beacon через transport
  9. Повторять шаги 6–8.

Клиент использует указанные encoder и transport для передачи данных между собой и соответствующим server.

Encoders

Encoders получают данные, а затем преобразуют их либо для подготовки к отправке через transport, либо декодируют данные, полученные через transport, обратно в исходную форму для интерпретации тем компонентом framework, который их использует.

Encoders должны рассчитывать на прямое взаимодействие с transport и обрабатывать данные независимо от фреймворка и компонента.

Transports

Transports выполняют роль отправки и получения данных через канал связи, а также взаимодействуют с encoder, чтобы гарантировать преобразование данных в необходимый формат. Transports должны получать данные от компонента фреймворка или через канал связи и иметь возможность передавать данные через канал связи. Transports отвечают за вызов encoder для кодирования или декодирования данных по мере необходимости.

Transports должны рассчитывать на прямое взаимодействие с компонентом framework и обрабатывать данные независимо от фреймворка и компонента.

Как использовать

  1. Сначала определите, какие модули транспорта и кодирования вы хотите использовать. В следующем примере мы будем использовать transport_imgur и encoder_lsbjpg.

  2. Затем создайте builder_config.config в соответствии с вашими потребностями; обратитесь к предоставленному примеру конфигурации и шаблону для понимания того, как это сделать.

Скачать инструмент