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

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

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

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

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

Категории

Все категории
Loading categories
secret_handshake — Прототип C2-канала вредоносного ПО с использованием сертификатов x509 поверх mTLS | Kitploit
Инструменты/GitHubGitHub/jconwell/secret_handshake
Обход IDS/IPSЭксфильтрация данныхКомандование и УправлениеRed Teaming
GitHubjconwell/secret_handshake

secret_handshake

Прототип C2-канала вредоносного ПО с использованием сертификатов x509 поверх mTLS

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

Популярное

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

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

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

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

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

Secret Handshake - канал C2 для вредоносного ПО с использованием x509-сертификатов через mTLS

Мотивация

Прежде всего, зачем я публикую это в открытом доступе?

MITRE ATT&CK упоминает только украденные или самоподписанные сертификаты, а NDR-системы (насколько мне известно) уделяют очень мало внимания содержимому x509-сертификатов, кроме того, кто является выпускающим УЦ. В целом x509-сертификаты считаются доверенными и беспрепятственно проходят через наши межсетевые экраны. Но по сути это просто файлы, которые, как и любые другие, могут легко содержать вредоносные полезные нагрузки. Мы доверяем им и игнорируем их, потому что они являются ключевым компонентом процесса шифрования, который мы начали воспринимать как должное. Основная цель этого проекта — повысить осведомлённость о классе индикаторов безопасности, которым мы привыкли доверять, и осветить методы, которые можно использовать для обнаружения вредоносного использования таких сертификатов.

Предыстория

Мне всегда было интересно, использовали ли злоумышленники x509-сертификаты как часть своей C2-коммуникации, не для шифрования сетевого трафика, а для того, чтобы непосредственно встраивать C2-коммуникацию в x509-сертификат. После пяти лет поисков чего-то подобного в дикой природе я наконец решил просто написать это сам, чтобы проверить, возможно ли это... возможно.

Каждое зашифрованное сообщение, отправляемое через HTTPS/TLS, становится возможным благодаря передаче x509-сертификата. При установлении TLS-рукопожатия (рисунок ниже) на четвёртом шаге сервер отправляет свой x509-сертификат клиенту. Клиент проверяет сертификат, сравнивает алгоритмы шифрования, поддерживаемые сервером, и выбирает алгоритм для всего дальнейшего обмена.

Рисунок 1

Как показано на этой диаграмме, это лишь однонаправленная передача x509-сертификата от сервера клиенту. Это плохо подходит для C2-коммуникации, поскольку у клиента нет возможности ответить серверу. В лучшем случае это можно использовать только как механизм однонаправленной передачи данных (см. раздел «Предшествующие разработки» ниже).

Но существует и другой тип TLS-сессии, называемый взаимной TLS-аутентификацией (mTLS), при котором и клиент, и сервер обмениваются x509-сертификатами для аутентификации друг друга.

Рисунок 2

Как показано на рисунке выше, при взаимной аутентификации x509-сертификат сервера отправляется клиенту для аутентификации, а затем x509-сертификат клиента отправляется серверу для аутентификации. Этот обмен артефактами представляет собой возможность создания двустороннего канала связи для C2-серверов.

Создание двустороннего канала связи через x509-сертификаты

Поскольку серверный и клиентский сертификаты обмениваются базовой SSL-библиотекой, у клиента нет возможности извлечь сообщение из сертификата сервера, выполнить команду и сгенерировать ответный сертификат в рамках одного mTLS-соединения. Это означает, что C2-канал должен быть спроектирован так, чтобы обмен запросом и ответом происходил через два разных взаимных TLS-соединения, примерно как в псевдо-полудуплексном режиме передачи.

Рисунок 3

Процесс запроса/ответа состоит из следующих шагов:

  • Шаг 1: и клиент, и C2-сервер генерируют свои соответствующие сертификаты. Сертификат клиента содержит универсальное «beacon»-сообщение, а сертификат сервера содержит команду, которую сервер хочет выполнить на клиенте. Если для клиента нет команды, сервер генерирует универсальный «sleep»-сертификат, сообщающий клиенту, как долго спать перед следующим beacon-запросом.
  • Шаг 2: и клиент, и C2-сервер настраивают сетевой сокет с сертификатами, созданными на шаге 1.
  • Шаг 3: клиент устанавливает соединение с сервером.
  • Шаг 4: серверный и клиентский сертификаты обмениваются во время mTLS-рукопожатия.
  • Шаг 5: и сервер, и клиент закрывают свои соответствующие сокеты.
  • Шаг 6: клиент извлекает команду для выполнения из сертификата сервера. Поскольку сертификат клиента содержит лишь универсальное «beacon»-сообщение, сервер отбрасывает его.
  • Шаг 7: клиент выполняет команду и собирает её выходные данные.
  • Шаг 8: и клиент, и C2-сервер генерируют свои соответствующие сертификаты. Сертификат клиента содержит вывод только что выполненной команды, а сервер генерирует универсальный «sleep»-сертификат, сообщающий клиенту, как долго спать перед следующим beacon-запросом.
  • Шаг 9: и клиент, и C2-сервер настраивают сетевой сокет с сертификатами, созданными на шаге 8.
  • Шаг 10: клиент устанавливает соединение с сервером.
  • Шаг 11: серверный и клиентский сертификаты обмениваются во время mTLS-рукопожатия.
  • Шаг 12: и сервер, и клиент закрывают свои соответствующие сокеты.
  • Шаг 13: клиент извлекает длительность сна из сертификата сервера, а сервер извлекает вывод команды из сертификата клиента.
  • Шаг 14: клиент спит в течение интервала, указанного сервером.

Предшествующие разработки

После того как у меня это заработало, я был весьма горд собой за свою креативность и всё такое.

Затем я наткнулся на доклад с BSides 2018 года Джейсона Ривза, который написал дроппер вредоносного ПО с использованием x509-сертификатов через TLS. Год спустя Джейсон опубликовал эту статью, описывающую полноценный двусторонний канал связи с использованием mTLS.

Инструкции по запуску

Для mTLS требуется, чтобы сертификаты и клиента, и сервера были подписаны одним и тем же CA-сертификатом, поэтому первым шагом необходимо сгенерировать собственную пару из закрытого ключа и сертификата УЦ.

Создайте закрытый ключ корневого УЦ:

openssl genrsa -des3 -out hmCA.key 2048

Примечание: парольная фраза не позволит никому, кто получит ваш закрытый ключ, сгенерировать собственный корневой сертификат.

Создайте сертификат корневого УЦ:

openssl req -x509 -new -nodes -key hmCA.key -sha256 -days 1825 -out hmCA.pem

Скопируйте сгенерированные файлы ключа и сертификата в папку certs/ca_certs. В проекте есть демонстрационная пара ключ/сертификат, так что при желании этот шаг можно пропустить.

Запустите клиент:

python client.py

Запустите сервер:

python server.py

Обнаружение

Я никогда не хочу публиковать что-то потенциально вредоносное, не описав также, как обнаружить это в ваших сетевых журналах.

Можно подумать, что обнаружить такой тип TLS-паттерна легко, но это не так просто. Один из главных признаков этого C2-канала — полудуплексный стиль связи: для завершения полного цикла запрос/ответ между сервером и клиентом требуется два потока взаимной аутентификации. Это будет повторяться многократно, поскольку сервер отправляет клиенту разные команды.

Это означает, что вам следует искать:

  • Несколько mTLS-сессий между одним и тем же исходным и целевым IP-адресом, вероятно, на одном порту, хотя несложно настроить так, чтобы каждая mTLS-сессия использовала разные порты.
  • Поскольку паттерн запрос-ответ требует двух mTLS-сессий на команду сервера, ищите 2 mTLS-сессии, идущие достаточно близко друг к другу, с более длинной паузой перед следующей парой mTLS-сессий.
  • Ищите время сна и джиттер между парами mTLS-сессий так же, как вы бы искали их для любого другого C2-канала.
  • Хэши сертификатов должны различаться для каждой mTLS-сессии, поскольку для каждой сессии генерируются новые сертификаты.
  • Сертификаты не будут выпущены доверенными центрами сертификации.
  • Размеры x509-сертификатов в байтах также будут варьироваться от сессии к сессии. Небольшие серверные сертификаты должны указывать на отправку команд клиенту, но более крупные сертификаты, скорее всего, указывают на загрузку вредоносного бинарного файла. Клиентские сертификаты, вероятно, будут сильнее различаться по размеру, чем серверные командные сертификаты, поскольку они содержат вывод команд. Большие клиентские сертификаты могут указывать на эксфильтрацию данных.
  • Если за короткий промежуток времени между одними и теми же исходными и целевыми IP-адресами происходит несколько mTLS-сессий, проверьте, не отправляются ли иногда сертификаты с одинаковым хэшем. Это может указывать на повторное использование сертификатов команд/ответов, например клиентского сертификата «beacon» или серверного сертификата «sleep».

Это выглядит как железобетонный набор правил обнаружения, но, как я уже говорил, всё не так просто. Оказывается, существует ряд корпоративных сервисов, у которых тоже похожий паттерн mTLS-трафика, в том числе:

  • Tanium
  • Microsoft System Center Configuration Manager (SCCM)
  • Microsoft Monitoring Agent
  • Azure Hybrid Runbook Worker
  • Palo Alto Networks
  • TrustedSource
  • Cohesity Helios
  • EMC's Global Security Organization
  • Alert Logic

Некоторые из них, похоже, являются службами управления активами/устройствами, поэтому теоретически они должны отправлять один и тот же набор сертификатов при каждом проходе по всем своим устройствам. Можно проверить, существуют ли наборы из нескольких mTLS-сессий, повторяющихся каждые N часов, а затем посмотреть, совпадают ли хэши сертификатов между двумя разными наборами mTLS-сессий, или совпадают в основном. Также стоит обратить внимание на то, чтобы клиентские сертификаты различались для каждой mTLS-сессии, но серверный сертификат оставался одним и тем же во всех сессиях.

Возможные меры противодействия

SSL-инспекция — один из способов потенциально заблокировать такой тип канала C2-связи, поскольку сервер SSL-инспекции не будет иметь вредоносный CA-сертификат, необходимый для аутентификации клиентского сертификата.

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