
InfraGuard est un proxy de redirection et gestionnaire Command & Control qui protège votre infrastructure Red Team contre l'attribution des menaces.
Traqueur d'infrastructure d'équipe rouge et redirecteur C2 -- une alternative moderne à RedWarden.
InfraGuard se place entre Internet et votre serveur d'équipe C2, validant chaque requête entrante par rapport à votre profil C2 malleable et bloquant tout ce qui ne s'y conforme pas. Les scanners, bots et sondes de l'équipe bleue sont redirigés vers un site leurre tandis que le trafic légitime des beacons passe jusqu'à votre serveur d'équipe.


.htaccess et robots.txt existantsmythic_file proxy le /direct/download/{uuid} de Mythic sur des URLs propres ; mode UUID fixe (alias d'URL) ou mode proxy (UUID depuis le chemin) ; contrôle d'accès entièrement assuré par la pile de filtrage d'InfraGuardon_event, configuration par plugin, filtrage d'événements (only_blocked, min_score, inclusion/exclusion de domaine).env chargé automatiquement ; la syntaxe ${VAR} fonctionne dans toutes les valeurs et clés de configurationConsultez la Page Wiki pour l'installation
infraguard --version Afficher la version
infraguard --help Afficher l'aide
infraguard run -c config.yaml Démarrer le proxy inverse
infraguard run -c config.yaml --port 8443 Surcharger le port d'écoute
infraguard run -c config.yaml --host 0.0.0.0 Surcharger l'adresse de liaison
infraguard dashboard -c config.yaml Démarrer le tableau de bord web
infraguard dashboard -c config.yaml --port 9090 Surcharger le port du tableau de bord
infraguard tui Lancer la TUI avec écran de connexion
infraguard tui --url http://host:8080 --token TOK Connexion automatique au tableau de bord
infraguard tui -c config.yaml Lire l'URL/le jeton depuis la config
infraguard command-post -c command-post.yaml Démarrer le tableau de bord multi-instances
infraguard command-post --instance name:url:token Ajouter une instance via CLI (répétable)
infraguard profile parse <file> Analyser et afficher un profil C2
infraguard profile parse <file> --format json Sortie au format JSON
infraguard profile parse <file> --type brute_ratel Forcer le type de profil
infraguard profile convert <file> -o out.json Convertir le profil en JSON
# Valeurs --type supportées : auto, cobalt_strike, mythic, brute_ratel, sliver, havoc, nighthawk, poshc2
# Auto-détection : .profile = CS, .toml = Havoc, .yaml = PoshC2, .json = auto-détection par clés
infraguard ingest <files...> Ingérer les règles .htaccess/robots.txt
infraguard ingest <files...> --format blocklist Sortie sous forme de liste de blocage IP
infraguard ingest <files...> --format json Sortie au format JSON
infraguard ingest <files...> -o banned_ips.txt Écrire la liste de blocage dans un fichier
infraguard generate nginx -c config.yaml Générer la configuration Nginx
infraguard generate caddy -c config.yaml Générer le fichier Caddyfile
infraguard generate apache -c config.yaml Générer le VirtualHost Apache
infraguard init -o config.yaml Générer une configuration de démarrage
infraguard validate -c config.yaml Valider le fichier de configuration
La commande generate accepte des options supplémentaires pour la personnalisation de l'opérateur :
Lorsque plusieurs instances InfraGuard sont exécutées sur différents VPS ou fournisseurs cloud, le Command Post agrège les statistiques, les requêtes et les événements en direct de tous les nœuds en un seul tableau de bord.
┌─────────────────────────────┐
│ Command Post Dashboard │
│ http://localhost:9090 │
└──────────┬──────────────────┘
│ extraction parallèle
┌─────┼──────┬──────────┐
▼ ▼ ▼ ▼
IG-1 IG-2 IG-3 ... IG-N

# Via fichier de configuration
infraguard command-post -c config/command-post.yaml
# Via arguments CLI
infraguard command-post \
--instance "prod:https://ig1.example.com:8080:TOKEN1" \
--instance "staging:https://ig2.example.com:8080:TOKEN2" \
--port 9090
# Via Docker
docker compose --profile command-post up -d command-post
Créez 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
# Modifiez .env avec votre domaine, serveur d'équipe et jeton
docker compose up -d
Ceci démarre deux services :
# Définissez dans .env :
# INFRAGUARD_LETSENCRYPT=true
# INFRAGUARD_DOMAIN=cdn.example.com
# [email protected]
# Obtenez le certificat initial
docker compose --profile letsencrypt up certbot
# Démarrez le proxy (il utilisera le certificat LE)
docker compose up -d proxy dashboard
# Démarrez le renouvellement automatique (vérifie toutes les 12 heures)
docker compose --profile letsencrypt up -d certbot-renew
Prérequis pour Let's Encrypt :
INFRAGUARD_DOMAIN doit résoudre sur l'IP publique de cet hôteINFRAGUARD_DOMAIN_EMAIL doit être une adresse e-mail valide# Téléchargez les trois bases GeoLite2 (Ville, ASN, Pays)
docker compose --profile geoip up geoip-update
# Démarrez ensuite normalement - les bases sont montées dans /app/geoip/
docker compose up -d proxy dashboard
# Démarrez PwnDrop en même temps que le proxy
docker compose --profile pwndrop up -d pwndrop
# Accédez à l'interface d'administration PwnDrop sur https://localhost:8443
# InfraGuard y accède en interne via http://pwndrop:80
Configurez ensuite des routes de contenu dans votre configuration pour rediriger les chemins de payload vers PwnDrop :
domains:
cdn.example.com:
content_routes:
- path: "/downloads/*"
backend:
type: "pwndrop"
target: "http://pwndrop:80"
auth_token: "${PWNDROP_TOKEN}"
# Exécutez plusieurs nœuds redirecteurs
docker compose up -d --scale proxy-node=3
Décommentez le service proxy-node dans docker-compose.yml pour l'activer.
infraguard/
__init__.py Initialisation du paquet
__main__.py Point d'entrée python -m infraguard
main.py CLI Click
config/ Chargement de config YAML, support .env, validation Pydantic
core/ Moteur proxy ASGI (app, proxy, routeur, TLS, actions de drop, livraison de contenu)
profiles/ Analyseurs de profils C2 (Cobalt Strike, Mythic, Brute Ratel, Sliver, Havoc, Nighthawk, PoshC2)
pipeline/ Filtres de validation des requêtes (JA3, IP, bot, en-tête, DNS, géo, profil, rejeu, énumération, sandbox)
intel/ Renseignement IP (listes de blocage, GeoIP, rDNS, flux, ingestion de règles)
tracking/ Persistance SQLite (journalisation des requêtes, statistiques, registre des nœuds)
plugins/ Système de plugins (protocole, chargeur, intégrés)
ui/
api/ API REST + WebSocket (Starlette)
web/ Tableau de bord SPA (HTML/JS/CSS)
tui/ Interface terminal (Textual) avec écran de connexion
command_post/ Tableau de bord d'agrégation multi-instances
listeners/ Écouteurs de protocole (HTTP, DNS, MQTT, WebSocket)
backends/ Générateurs de configuration (Nginx, Caddy, Apache)
models/ Types partagés et modèles d'événements
Si vous souhaitez contribuer au projet, veuillez créer une nouvelle branche avec le nom de la version et spécifier le même nom de version dans la pull request. Ex. : branche=v1.2.3 | [v1.2.3] Élément ajouté.
Licence BSD 2 clauses. Voir LICENSE pour les détails.
Copyright (c) 2026, Whispergate
| Option | Description |
|---|
--listen-port PORT | Surcharger le port d'écoute (défaut : depuis la config) |
--ssl-cert PATH | Surcharger le chemin du certificat SSL |
--ssl-key PATH | Surcharger le chemin de la clé SSL |
--redirect-url URL | Surcharger l'URL de redirection pour les requêtes bloquées |
--default-action redirect|404 | Action pour les requêtes non correspondantes |
--no-ip-filter | Omettre les blocs d'autorisation/interdiction IP |
--no-header-check | Omettre les règles de validation des en-têtes |
--alias DOMAIN:ALIAS | Ajouter un alias de nom de serveur (répétable) |
--header NAME:VALUE | Ajouter un en-tête de réponse personnalisé (répétable) |
| Point d'accès | Méthode | Description |
|---|
/api/instances | GET | Lister toutes les instances avec leur état de santé |
/api/stats | GET | Statistiques fusionnées de toutes les instances |
/api/requests | GET | Journal des requêtes entrelacées de toutes les instances |
/api/intel/whitelist | POST | Ajouter une IP à la liste blanche sur toutes les instances |
/api/intel/blocklist | POST | Bloquer une IP sur toutes les instances |
/api/intel/blocklist | DELETE | Débloquer une IP sur toutes les instances |
/ws/events | WS | Événements en direct multiplexés de toutes les instances |
| Volume | Objectif |
|---|
./config | Fichiers de configuration (montés en lecture seule) |
./examples | Profils C2 (montés en lecture seule) |
./rules | Listes de blocage ingérées et fichiers sources de règles (montés en lecture seule) |
./data | Base de données SQLite (persistée) |
certs | Certificats TLS (partagés entre le proxy et certbot) |
geoip | Bases GeoLite2 (remplies par le service geoip-update) |
pwndrop-data | Fichiers téléchargés et base de données de PwnDrop |
| Fonctionnalité | RedWarden | InfraGuard |
|---|
| Architecture | Fichier unique ~99KB | Paquet modulaire |
| Analyse de profil | Machine à états regex | Analyseur structuré avec support complet de bloc/transformation |
| Support C2 | Cobalt Strike uniquement | Cobalt Strike, Mythic, Brute Ratel C4, Sliver, Havoc, Nighthawk, PoshC2 |
| Protocoles | HTTP uniquement | HTTP, DNS, MQTT, WebSocket |
| Modèle de filtrage | Binaire succès/échec | Basé sur des scores (seuil 0.0-1.0), chaîne de 10 filtres |
| Empreinte TLS | Aucune | Blocage JA3 (Masscan, ZGrab2, Shodan, curl, Python requests, Nmap) |
| Détection de sandbox | Aucune | Navigateur sans tête / Safe Links / sandbox UA et score d'en-tête |
| Détection d'énumération | Aucune | Énumération de chemins + suivi DNS NXDOMAIN avec blocage automatique |
| Détection de compromission | Aucune | Surveillance des logs CT, réputation du domaine (URLhaus/OpenPhish/GSB), détection d'analystes inter-domaines |
| Livraison de payload | Aucune | PwnDrop, stockage de fichiers Mythic, système de fichiers, proxy HTTP avec livraison conditionnelle |
| Protection de payload | Aucune | Jetons à usage unique, limitation de débit par route, gardes de livraison (clé d'environnement) |
| Protection antiphishing | Aucune | Validation de jeton de campagne (liste statique ou signée HMAC) |
| Interface opérateur | Aucune | Tableau de bord web + interface terminal + poste de commandement multi-instances |
| Génération de configuration | Aucune | Nginx, Caddy, Apache avec personnalisation complète |
| Ingestion de règles | Aucune | Analyseur .htaccess + robots.txt |
| Flux de renseignement sur les menaces | Aucun | Mise à jour automatique depuis 5 sources publiques |
| Système de plugins | Interface basique à 4 méthodes | Piloté par les événements avec hooks on_event + configuration par plugin |
| Intégration SIEM | Aucune | Elasticsearch, Wazuh, Syslog (CEF/JSON) |
| Alertes webhook | Aucune | Discord, Slack, webhook générique (les alertes de compromission passent par les mêmes plugins) |
| Renseignement sur les listes blanches | Aucun | Enrichissement automatique des CIDR avec ASN/organisation/pays au démarrage |
| Anti-rejeu | Hash SQLite | SQLite persistant avec cache L1 en mémoire, survit aux redémarrages |
| Actions de drop | redirect, reset, proxy | redirect, reset, proxy, tarpit |
| Gestion TLS | Manuelle uniquement | Auto-signé automatique + intégration Let's Encrypt |
| Déploiement en périphérie | Aucun | Workers Cloudflare + proxies AWS Lambda avec domaine fronting |
| Déploiement | Manuel | Docker Compose avec vérifications de santé |
| Journalisation | Sortie colorée personnalisée | JSON structuré (structlog) |
| Async | Callbacks Tornado | Async/await natif (ASGI + uvicorn) |