
InfraGuard is a Command & Control Redirection Proxy and Manager which protects your Red Team Infrastructure against threat attribution
Трекер инфраструктуры красной команды и редиректор C2 — современная альтернатива RedWarden.
InfraGuard располагается между интернетом и вашим C2-сервером, проверяя каждый входящий запрос на соответствие вашему malleable C2-профилю и блокируя всё, что не соответствует. Сканеры, боты и зонды синей команды перенаправляются на сайт-приманку, в то время как легитимный трафик beacon проходит к вашему серверу.


ssl_fingerprint, родной JA3 HAProxy) или собственный протокол asyncio; опциональный режим белого списка принудительно разрешает только JA3 beacon.htaccess и robots.txtmythic_file проксирует /direct/download/{uuid} Mythic по чистым URL; фиксированный UUID (алиас URL) или прокси-режим (UUID из пути); контроль доступа полностью обеспечивается стеком фильтров InfraGuardon_event, настраиваемой конфигурацией плагинов, фильтрацией событий (только заблокированные, min_score, включение/исключение доменов).env; синтаксис ${VAR} работает во всех значениях и ключах конфигурацииОбратитесь к Wiki-странице для установки
infraguard --version Показать версию
infraguard --help Показать справку
infraguard run -c config.yaml Запустить обратный прокси
infraguard run -c config.yaml --port 8443 Переопределить порт прослушивания
infraguard run -c config.yaml --host 0.0.0.0 Переопределить адрес привязки
infraguard dashboard -c config.yaml Запустить веб-панель управления
infraguard dashboard -c config.yaml --port 9090 Переопределить порт панели
infraguard tui Запустить TUI с экраном входа
infraguard tui --url http://host:8080 --token TOK Автоподключение к панели
infraguard tui -c config.yaml Читать URL/токен из конфига
infraguard command-post -c command-post.yaml Запустить мульти-экземплярную панель
infraguard command-post --instance name:url:token Добавить экземпляр через CLI (повторяемо)
infraguard profile parse <file> Разобрать и показать C2-профиль
infraguard profile parse <file> --format json Вывести в JSON
infraguard profile parse <file> --type brute_ratel Принудительно указать тип профиля
infraguard profile convert <file> -o out.json Конвертировать профиль в JSON
# Поддерживаемые --type значения: auto, cobalt_strike, mythic, brute_ratel, sliver, havoc, nighthawk, poshc2
# Автоопределение: .profile = CS, .toml = Havoc, .yaml = PoshC2, .json = авто по ключам
infraguard ingest <files...> Импортировать правила .htaccess/robots.txt
infraguard ingest <files...> --format blocklist Вывести как IP-чёрный список
infraguard ingest <files...> --format json Вывести как JSON
infraguard ingest <files...> -o banned_ips.txt Записать чёрный список в файл
infraguard generate nginx -c config.yaml Сгенерировать конфиг Nginx
infraguard generate caddy -c config.yaml Сгенерировать Caddyfile
infraguard generate apache -c config.yaml Сгенерировать Apache VirtualHost
infraguard init -o config.yaml Сгенерировать стартовый конфиг
infraguard validate -c config.yaml Проверить конфигурационный файл
Команда generate принимает дополнительные флаги для настройки оператора:
При запуске нескольких экземпляров InfraGuard на разных VPS или облачных провайдерах Командный пост агрегирует статистику, запросы и живые события от всех узлов в единую панель.
┌─────────────────────────────┐
│ Command Post Dashboard │
│ http://localhost:9090 │
└──────────┬──────────────────┘
│ parallel fetch
┌─────┼──────┬──────────┐
▼ ▼ ▼ ▼
IG-1 IG-2 IG-3 ... IG-N

# Через конфигурационный файл
infraguard command-post -c config/command-post.yaml
# Через аргументы CLI
infraguard command-post \
--instance "prod:https://ig1.example.com:8080:TOKEN1" \
--instance "staging:https://ig2.example.com:8080:TOKEN2" \
--port 9090
# Через Docker
docker compose --profile command-post up -d command-post
Создайте config/command-post.yaml:
instances:
- name: "prod-cs"
url: "https://ig1.example.com:8080"
token: "${IG_PROD_TOKEN}"
- name: "prod-mythic"
url: "https://ig2.example.com:8080"
token: "${IG_MYTHIC_TOKEN}"
- name: "staging"
url: "https://ig3.example.com:8080"
token: "${IG_STAGING_TOKEN}"
port: 9090
# auth_token: "${COMMAND_POST_TOKEN}"
cp .env.example .env
# Отредактируйте .env с вашим доменом, сервером и токеном
docker compose up -d
Это запускает два сервиса:
# Установите в .env:
# INFRAGUARD_LETSENCRYPT=true
# INFRAGUARD_DOMAIN=cdn.example.com
# [email protected]
# Получите начальный сертификат
docker compose --profile letsencrypt up certbot
# Запустите прокси (будет использовать сертификат LE)
docker compose up -d proxy dashboard
# Запустите автообновление (проверка каждые 12 часов)
docker compose --profile letsencrypt up -d certbot-renew
Требования для Let's Encrypt:
INFRAGUARD_DOMAIN должен резолвиться на публичный IP этого хостаINFRAGUARD_DOMAIN_EMAIL должен быть действительным адресом электронной почты# Скачайте все три базы GeoLite2 (City, ASN, Country)
docker compose --profile geoip up geoip-update
# Запустите обычным образом — базы монтируются в /app/geoip/
docker compose up -d proxy dashboard
# Запустите PwnDrop вместе с прокси
docker compose --profile pwndrop up -d pwndrop
# Доступ к админке PwnDrop по адресу https://localhost:8443
# InfraGuard обращается к нему внутри контейнера по http://pwndrop:80
Затем настройте маршруты контента в вашем конфиге для проксирования путей полезных нагрузок на PwnDrop:
domains:
cdn.example.com:
content_routes:
- path: "/downloads/*"
backend:
type: "pwndrop"
target: "http://pwndrop:80"
auth_token: "${PWNDROP_TOKEN}"
# Запуск нескольких редиректоров
docker compose up -d --scale proxy-node=3
Раскомментируйте сервис proxy-node в docker-compose.yml для включения.
infraguard/
__init__.py Инициализация пакета
__main__.py Точка входа python -m infraguard
main.py Click CLI
config/ Загрузка YAML-конфига, поддержка .env, валидация Pydantic
core/ Ядро ASGI-прокси (приложение, прокси, роутер, TLS, действия сброса, доставка контента)
profiles/ Парсеры C2-профилей (Cobalt Strike, Mythic, Brute Ratel, Sliver, Havoc, Nighthawk, PoshC2)
pipeline/ Фильтры валидации запросов (JA3, IP, бот, заголовки, DNS, гео, профиль, повтор, перебор, песочница)
intel/ IP-разведка (чёрные списки, GeoIP, rDNS, потоки, импорт правил)
tracking/ Сохранение в SQLite (логирование запросов, статистика, реестр узлов)
plugins/ Система плагинов (протокол, загрузчик, встроенные)
ui/
api/ REST API + WebSocket (Starlette)
web/ SPA-панель (HTML/JS/CSS)
tui/ Терминальный интерфейс (Textual) с экраном входа
command_post/ Мульти-экземплярная панель агрегации
listeners/ Слушатели протоколов (HTTP, DNS, MQTT, WebSocket)
backends/ Генераторы конфигов (Nginx, Caddy, Apache)
models/ Общие типы и модели событий
Если вы хотите внести вклад в проект, создайте новую ветку с именем версии и укажите то же имя версии в pull request. Например: branch=v1.2.3 | [v1.2.3] Добавлен такой-то элемент.
Лицензия BSD 2-Clause. Подробности см. в LICENSE.
Copyright (c) 2026, Whispergate
| Флаг | Описание |
|---|
--listen-port PORT | Переопределить порт прослушивания (по умолчанию: из конфига) |
--ssl-cert PATH | Переопределить путь к SSL-сертификату |
--ssl-key PATH | Переопределить путь к SSL-ключу |
--redirect-url URL | Переопределить URL перенаправления для заблокированных запросов |
--default-action redirect|404 | Действие для несоответствующих запросов |
--no-ip-filter | Пропустить блоки разрешений/запретов IP |
--no-header-check | Пропустить правила проверки заголовков |
--alias DOMAIN:ALIAS | Добавить алиас имени сервера (повторяемо) |
--header NAME:VALUE | Добавить пользовательский заголовок ответа (повторяемо) |
| Конечная точка | Метод | Описание |
|---|
/api/instances | GET | Список всех экземпляров со статусом здоровья |
/api/stats | GET | Объединённая статистика со всех экземпляров |
/api/requests | GET | Перемежаемый лог запросов со всех экземпляров |
/api/intel/whitelist | POST | Добавить IP в белый список на всех экземплярах |
/api/intel/blocklist | POST | Заблокировать IP на всех экземплярах |
/api/intel/blocklist | DELETE | Разблокировать IP на всех экземплярах |
/ws/events | WS | Мультиплексированные живые события со всех экземпляров |
| Том | Назначение |
|---|
./config | Файлы конфигурации (монтируются только для чтения) |
./examples | C2-профили (монтируются только для чтения) |
./rules | Импортированные чёрные списки и файлы правил (монтируются только для чтения) |
./data | База данных SQLite (сохраняется) |
certs | TLS-сертификаты (общие между прокси и certbot) |
geoip | Базы GeoLite2 (заполняются сервисом geoip-update) |
pwndrop-data | Загруженные файлы и база данных PwnDrop |
| Возможность | RedWarden | InfraGuard |
|---|
| Архитектура | Один файл ~99KB | Модульный пакет |
| Разбор профилей | Регулярное выражение (конечный автомат) | Структурированный парсер с полной поддержкой блоков и трансформаций |
| Поддержка C2 | Только Cobalt Strike | Cobalt Strike, Mythic, Brute Ratel C4, Sliver, Havoc, Nighthawk, PoshC2 |
| Протоколы | Только HTTP | HTTP, DNS, MQTT, WebSocket |
| Модель фильтрации | Двоичный проход/непроход | Оценочная (порог 0.0–1.0), цепочка из 10 фильтров |
| Фингерпринтинг TLS | Нет | Блокировка JA3 (Masscan, ZGrab2, Shodan, curl, Python requests, Nmap) |
| Обнаружение песочниц | Нет | Оценка по заголовкам и UA безголовых браузеров / Safe Links / песочниц |
| Обнаружение перебора | Нет | Отслеживание перебора путей + DNS NXDOMAIN с авто-блокировкой |
| Обнаружение компрометации (Burn detection) | Нет | Мониторинг CT-логов, репутация домена (URLhaus/OpenPhish/GSB), обнаружение аналитика по нескольким доменам |
| Доставка полезных нагрузок | Нет | PwnDrop, файловое хранилище Mythic, файловая система, HTTP-прокси с условной доставкой |
| Защита полезных нагрузок | Нет | Одноразовые токены, ограничение скорости на маршрут, охранники доставки (привязка к окружению) |
| Защита фишинга | Нет | Валидация токенов кампании (статический список или HMAC-подпись) |
| Интерфейс оператора | Нет | Веб-панель + Терминальный интерфейс + Мульти-экземплярный Командный пост |
| Генерация конфигов | Нет | Nginx, Caddy, Apache с полной настройкой |
| Импорт правил | Нет | Парсер .htaccess + robots.txt |
| Потоки угроз | Нет | Автообновление из 5 публичных источников |
| Система плагинов | Простой 4-методный интерфейс | Событийно-ориентированная с хуками on_event + конфигурация плагинов |
| Интеграция с SIEM | Нет | Elasticsearch, Wazuh, Syslog (CEF/JSON) |
| Вебхук-оповещения | Нет | Discord, Slack, общий вебхук (тревоги о компрометации проходят через те же плагины) |
| Интеллект белого списка | Нет | Автообогащение CIDR данными ASN/организация/страна при запуске |
| Анти-повтор | Хеш SQLite | Постоянный SQLite с кэшем L1 в памяти, переживает перезапуски |
| Действия при сбросе | redirect, reset, proxy | redirect, reset, proxy, tarpit |
| Управление TLS | Только вручную | Авто самоподписанный + интеграция Let's Encrypt |
| Пограничное развёртывание | Нет | Cloudflare Worker + AWS Lambda с фронтом домена |
| Развёртывание | Вручную | Docker Compose с проверками здоровья |
| Логирование | Пользовательский цветной вывод | Структурированные JSON-логи (structlog) |
| Асинхронность | Tornado callbacks | Родной async/await (ASGI + uvicorn) |