
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 Red Team et redirecteur C2 — une alternative moderne à RedWarden.
InfraGuard se positionne 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 transite vers votre serveur d'équipe.


mythic_file proxie le /direct/download/{uuid} de Mythic à des URL propres ; mode UUID fixe ou proxy ; contrôle d'accès assuré par la pile de filtres d'InfraGuard/metrics exposant les compteurs de requêtes, les histogrammes de latence des upstreams, l'état du disjoncteur, la fraîcheur des flux et les connexions activeson_event, configuration par plugin et filtrage des événements.env.htaccess et robots.txt existants.env chargé automatiquement ; la syntaxe ${VAR} fonctionne dans toutes les valeurs et clés de configurationConsultez la Page Wiki pour l'installation
infraguard --version Show version infraguard --help Show help
infraguard run -c config.yaml Start the reverse proxy infraguard run -c config.yaml --port 8443 Override listen port infraguard run -c config.yaml --host 0.0.0.0 Override bind address
infraguard dashboard -c config.yaml Start the web dashboard infraguard dashboard -c config.yaml --port 9090 Override dashboard port
infraguard tui Launch TUI with login screen infraguard tui --url http://host:8080 --token TOK Auto-connect to dashboard infraguard tui -c config.yaml Read URL/token from config
infraguard command-post -c command-post.yaml Start multi-instance dashboard infraguard command-post --instance name:url:token Add instance via CLI (repeatable)
infraguard profile parse Parse and display a C2 profile infraguard profile parse --format json Output as JSON infraguard profile parse --type brute_ratel Force profile type infraguard profile convert -o out.json Convert profile to JSON
infraguard ingest <files...> Ingest .htaccess/robots.txt rules infraguard ingest <files...> --format blocklist Output as IP blocklist infraguard ingest <files...> --format json Output as JSON infraguard ingest <files...> -o banned_ips.txt Write blocklist to file
infraguard generate nginx -c config.yaml Generate Nginx config infraguard generate caddy -c config.yaml Generate Caddyfile infraguard generate apache -c config.yaml Generate Apache VirtualHost
infraguard init -o config.yaml Generate starter config infraguard validate -c config.yaml Validate config file
### Options du générateur
La commande `generate` accepte des drapeaux supplémentaires pour la personnalisation de l'opérateur :
| Drapeau | Description |
|---|---|
| `--listen-port PORT` | Remplacer le port d'écoute (défaut : depuis la configuration) |
| `--ssl-cert PATH` | Remplacer le chemin du certificat SSL |
| `--ssl-key PATH` | Remplacer le chemin de la clé SSL |
| `--redirect-url URL` | Remplacer 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/refus 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) |
## Poste de commande (Tableau de bord multi-instances)
Lors de l'exécution de plusieurs instances InfraGuard sur différents VPS ou fournisseurs cloud, le Poste de commande agrège les statistiques, les requêtes et les événements en direct de tous les nœuds dans un tableau de bord unique.```
┌─────────────────────────────┐
│ Command Post Dashboard │
│ http://localhost:9090 │
└──────────┬──────────────────┘
│ parallel fetch
┌─────┼──────┬──────────┐
▼ ▼ ▼ ▼
IG-1 IG-2 IG-3 ... IG-N

infraguard command-post -c config/command-post.yaml
infraguard command-post
--instance "prod:https://ig1.example.com:8080:TOKEN1"
--instance "staging:https://ig2.example.com:8080:TOKEN2"
--port 9090
docker compose --profile command-post up -d command-post
### Configuration
Créez `config/command-post.yaml` :```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
docker compose up -d
Ceci démarre deux services :
- **proxy** -- le redirecteur sur les ports 443 et 80
- **dashboard** -- l'interface web sur le port 8080
### Avec Let's Encrypt```bash
# Set in .env:
# INFRAGUARD_LETSENCRYPT=true
# INFRAGUARD_DOMAIN=cdn.example.com
# [email protected]
# Obtain the initial certificate
docker compose --profile letsencrypt up certbot
# Start the proxy (will use the LE cert)
docker compose up -d proxy dashboard
# Start auto-renewal (checks every 12 hours)
docker compose --profile letsencrypt up -d certbot-renew
Exigences pour Let's Encrypt :
INFRAGUARD_DOMAIN doit résoudre vers l'IP publique de cet hôteINFRAGUARD_DOMAIN_EMAIL doit être une adresse e-mail validedocker compose --profile geoip up geoip-update
docker compose up -d proxy dashboard
### Avec PwnDrop (livraison de la charge utile)```bash
# Start PwnDrop alongside the proxy
docker compose --profile pwndrop up -d pwndrop
# Access PwnDrop admin UI at https://localhost:8443
# InfraGuard reaches it internally at http://pwndrop:80
Alors configurez les routes de contenu dans votre config pour rediriger les chemins de payload vers PwnDrop :```yaml domains: cdn.example.com: content_routes: - path: "/downloads/*" backend: type: "pwndrop" target: "http://pwndrop:80" auth_token: "${PWNDROP_TOKEN}"
### Avec Ollama (génération de profils assistée par IA)```bash
# Start the Ollama service
docker compose --profile ollama up -d ollama
# Pull the default model (~5 GB)
docker compose --profile ollama exec ollama ollama pull qwen3:8b
# The dashboard's AI chat panel will connect automatically
Le tableau de bord dispose de la variable d'environnement INFRAGUARD_OLLAMA_URL préconfigurée dans docker-compose.yml. Lorsqu'Ollama est en cours d'exécution, l'interrupteur de l'assistant IA apparaît dans la page des leurres et des profils du tableau de bord.
docker compose up -d --scale proxy-node=3
Décommentez le service `proxy-node` dans `docker-compose.yml` pour l'activer.
### Volumes
| Volume | Objectif |
|---|---|
| `./config` | Fichiers de configuration (montés en lecture seule) |
| `./examples` | Profils C2 (montés en lecture seule) |
| `./rules` | Listes bloquées ingérées et fichiers sources de règles (montés en lecture seule) |
| `./data` | Base de données SQLite et profils générés (persistés) |
| `certs` | Certificats TLS (partagés entre le proxy et certbot) |
| `geoip` | Bases de données GeoLite2 (remplies par le service `geoip-update`) |
| `pwndrop-data` | Fichiers téléversés et base de données PwnDrop |
| `ollama-data` | Poids du modèle et configuration Ollama |
## Architecture```
infraguard/
__init__.py Package init
__main__.py python -m infraguard entry
main.py Click CLI
config/ YAML config loading, .env support, Pydantic validation
core/ ASGI proxy engine (app, proxy, router, TLS, drop actions, content delivery)
profiles/ C2 profile parsers and generators (8 types)
pipeline/ Request validation filters (JA3, IP, bot, header, DNS, geo, profile, replay, enumeration, sandbox)
intel/ IP intelligence (blocklists, GeoIP, rDNS, feeds, rule ingestion)
tracking/ SQLite persistence (request logging, stats, node registry)
plugins/ Plugin system (protocol, loader, builtins)
ui/
api/ REST API + WebSocket (Starlette)
web/ SPA dashboard (HTML/JS/CSS)
tui/ Terminal UI (Textual) with login screen
command_post/ Multi-instance aggregation dashboard
listeners/ Protocol listeners (HTTP, DNS, MQTT, WebSocket)
backends/ Config generators (Nginx, Caddy, Apache)
models/ Shared types and event models
Si vous souhaitez contribuer au projet, veuillez créer une nouvelle branche avec le nom de la version et préciser le même nom de version dans la demande de tirage. Par exemple : branche=v1.2.3 | [v1.2.3] Ajout de l'élément blah.
Licence BSD à 2 clauses. Voir LICENSE pour plus de détails.
Copyright (c) 2026, Whispergate
| Point de terminaison | Méthode | Description |
|---|
/api/instances | GET | Liste toutes les instances avec leur état de santé |
/api/stats | GET | Statistiques fusionnées de toutes les instances |
/api/requests | GET | Journal de requêtes entrelacé de toutes les instances |
/api/intel/whitelist | POST | Ajoute une IP à la liste blanche sur toutes les instances |
/api/intel/blocklist | POST | Bloque une IP sur toutes les instances |
/api/intel/blocklist | DELETE | Débloque une IP sur toutes les instances |
/ws/events | WS | Événements en direct multiplexés de toutes les instances |
| Fonctionnalité | RedWarden | InfraGuard |
|---|
| Architecture | Fichier unique d'environ 99 Ko | Paquet modulaire |
| Analyse des profils | Machine à états par expressions régulières | Analyseur structuré avec prise en charge complète des blocs/transformations |
| Support C2 | Cobalt Strike uniquement | Cobalt Strike, Mythic, Brute Ratel C4, Sliver, Havoc, Nighthawk, PoshC2 |
| Gestion des profils | Édition manuelle des fichiers | Assistant de tableau de bord avec génération, importation, permutation à chaud et assistance IA |
| Protocoles | HTTP uniquement | HTTP, DNS, MQTT, WebSocket |
| Modèle de filtrage | Binaire passe/échoue | Basé sur un score (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 / notation des UA et en-têtes de sandbox |
| Détection d'énumération | Aucune | Énumération de chemins + suivi DNS NXDOMAIN avec blocage automatique |
| Détection de brûlage | Aucune | Surveillance des journaux CT, réputation de domaine, détection d'analystes inter-domaines, notation de confiance |
| Résilience de l'infrastructure | Aucune | Disjoncteur, basculement de protocole, interrupteur homme mort, rotation de l'infrastructure |
| Livraison de charges utiles | Aucune | PwnDrop, stockage de fichiers Mythic, système de fichiers, proxy HTTP avec livraison conditionnelle |
| Protection des charges utiles | Aucune | Jetons à usage unique, limitation de débit par route, gardes de livraison |
| Protection contre le hameçonnage | Aucune | Validation des jetons de campagne (liste statique ou signée HMAC) |
| Interface opérateur | Aucune | Tableau de bord web + interface terminal + poste de commandement multi-instances |
| Observabilité | Aucune | Métriques Prometheus, rapports d'engagement, journalisation structurée |
| 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 à partir de 5 sources publiques |
| Système de plugins | Interface de base à 4 méthodes | Piloté par événements avec hooks on_event + configuration par plugin |
| Intégration SIEM | Aucune | Elasticsearch, Wazuh, Syslog (CEF/JSON) |
| Alertes webhook | Aucunes | Discord, Slack, webhook générique |
| Renseignement sur les listes blanches | Aucun | Enrichissement automatique des CIDR avec ASN/organisation/pays au démarrage |
| Anti-rejeu | Hachage SQLite | SQLite persistant avec cache L1 en mémoire, survit aux redémarrages |
| Actions de blocage | redirection, réinitialisation, proxy | redirection, réinitialisation, proxy, piège lent |
| Gestion TLS | Manuelle uniquement | Auto-signé automatique + intégration Let's Encrypt |
| Déploiement en périphérie | Aucun | Proxies périphériques Cloudflare Worker + AWS Lambda avec domain fronting |
| Sécurité de la configuration | Aucune | Chiffrement age et SOPS, contrôles de validation, gestion des clés API |
| Déploiement | Manuel | Docker Compose avec contrôles de santé |
| Asynchrone | Callbacks Tornado | async/await natif (ASGI + uvicorn) |