
InfraGuard es un Proxy y Gestor de Redirección de Comando y Control que protege tu Infraestructura de Red Team contra la atribución de amenazas.
Rastreador de infraestructura de equipo rojo y redireccionador C2 — una alternativa moderna a RedWarden.
InfraGuard se sitúa entre Internet y tu teamserver C2, validando cada solicitud entrante contra tu perfil C2 maleable y bloqueando todo lo que no cumpla. Los escáneres, bots y sondas del equipo azul son redirigidos a un sitio señuelo, mientras que el tráfico legítimo de beacons pasa a tu teamserver.


ssl_fingerprint, HAProxy JA3 nativo) o protocolo asyncio personalizado; modo de lista blanca opcional para aplicar JA3 de beacon.htaccess y robots.txt existentesmythic_file hace proxy de /direct/download/{uuid} de Mythic en URLs limpias; UUID fijo (alias de URL) o modo proxy (UUID desde la ruta); control de acceso proporcionado completamente por la pila de filtros de InfraGuardon_event, configuración por plugin, filtrado de eventos (only_blocked, min_score, include/exclude de dominio).env cargado automáticamente; la sintaxis ${VAR} funciona en todos los valores y claves de configuraciónConsulte la Página Wiki para la instalación
infraguard --version Muestra la versión
infraguard --help Muestra la ayuda
infraguard run -c config.yaml Inicia el proxy inverso
infraguard run -c config.yaml --port 8443 Sobrescribe el puerto de escucha
infraguard run -c config.yaml --host 0.0.0.0 Sobrescribe la dirección de enlace
infraguard dashboard -c config.yaml Inicia el panel web
infraguard dashboard -c config.yaml --port 9090 Sobrescribe el puerto del panel
infraguard tui Inicia la TUI con pantalla de inicio de sesión
infraguard tui --url http://host:8080 --token TOK Conexión automática al panel
infraguard tui -c config.yaml Lee URL/token de la configuración
infraguard command-post -c command-post.yaml Inicia el panel multiinstancia
infraguard command-post --instance name:url:token Añade instancia mediante CLI (repetible)
infraguard profile parse <file> Analiza y muestra un perfil C2
infraguard profile parse <file> --format json Salida como JSON
infraguard profile parse <file> --type brute_ratel Forza el tipo de perfil
infraguard profile convert <file> -o out.json Convierte el perfil a JSON
# Valores --type admitidos: auto, cobalt_strike, mythic, brute_ratel, sliver, havoc, nighthawk, poshc2
# Auto-detección: .profile = CS, .toml = Havoc, .yaml = PoshC2, .json = auto-detect por claves
infraguard ingest <files...> Ingiere reglas de .htaccess/robots.txt
infraguard ingest <files...> --format blocklist Salida como lista de bloqueo IP
infraguard ingest <files...> --format json Salida como JSON
infraguard ingest <files...> -o banned_ips.txt Escribe la lista de bloqueo en un archivo
infraguard generate nginx -c config.yaml Genera configuración de Nginx
infraguard generate caddy -c config.yaml Genera Caddyfile
infraguard generate apache -c config.yaml Genera VirtualHost de Apache
infraguard init -o config.yaml Genera configuración inicial
infraguard validate -c config.yaml Valida el archivo de configuración
El comando generate acepta flags adicionales para personalización del operador:
Cuando se ejecutan múltiples instancias de InfraGuard en diferentes VPS o proveedores de nube, el Puesto de mando agrega estadísticas, solicitudes y eventos en vivo de todos los nodos en un solo panel.
┌─────────────────────────────┐
│ Panel del Puesto de mando │
│ http://localhost:9090 │
└──────────┬──────────────────┘
│ búsqueda paralela
┌─────┼──────┬──────────┐
▼ ▼ ▼ ▼
IG-1 IG-2 IG-3 ... IG-N

# Mediante archivo de configuración
infraguard command-post -c config/command-post.yaml
# Mediante argumentos CLI
infraguard command-post \
--instance "prod:https://ig1.example.com:8080:TOKEN1" \
--instance "staging:https://ig2.example.com:8080:TOKEN2" \
--port 9090
# Mediante Docker
docker compose --profile command-post up -d command-post
Crea 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
# Edita .env con tu dominio, teamserver y token
docker compose up -d
Esto inicia dos servicios:
# Establece en .env:
# INFRAGUARD_LETSENCRYPT=true
# INFRAGUARD_DOMAIN=cdn.example.com
# [email protected]
# Obtén el certificado inicial
docker compose --profile letsencrypt up certbot
# Inicia el proxy (usará el certificado LE)
docker compose up -d proxy dashboard
# Inicia la renovación automática (comprueba cada 12 horas)
docker compose --profile letsencrypt up -d certbot-renew
Requisitos para Let's Encrypt:
INFRAGUARD_DOMAIN debe resolverse a la IP pública de este hostINFRAGUARD_DOMAIN_EMAIL debe ser una dirección de correo electrónico válida# Descarga las tres bases de datos GeoLite2 (Ciudad, ASN, País)
docker compose --profile geoip up geoip-update
# Luego inicia normalmente: las bases de datos se montan en /app/geoip/
docker compose up -d proxy dashboard
# Inicia PwnDrop junto al proxy
docker compose --profile pwndrop up -d pwndrop
# Accede a la interfaz de administración de PwnDrop en https://localhost:8443
# InfraGuard se comunica internamente en http://pwndrop:80
Luego configura rutas de contenido en tu configuración para hacer proxy de rutas de payload a PwnDrop:
domains:
cdn.example.com:
content_routes:
- path: "/downloads/*"
backend:
type: "pwndrop"
target: "http://pwndrop:80"
auth_token: "${PWNDROP_TOKEN}"
# Ejecuta múltiples nodos redireccionadores
docker compose up -d --scale proxy-node=3
Descomenta el servicio proxy-node en docker-compose.yml para habilitarlo.
infraguard/
__init__.py Inicializador del paquete
__main__.py Entrada python -m infraguard
main.py CLI de Click
config/ Carga de configuración YAML, soporte .env, validación Pydantic
core/ Motor proxy ASGI (app, proxy, router, TLS, acciones de caída, entrega de contenido)
profiles/ Analizadores de perfiles C2 (Cobalt Strike, Mythic, Brute Ratel, Sliver, Havoc, Nighthawk, PoshC2)
pipeline/ Filtros de validación de solicitudes (JA3, IP, bot, cabecera, DNS, geo, perfil, reproducción, enumeración, sandbox)
intel/ Inteligencia IP (listas de bloqueo, GeoIP, rDNS, fuentes, ingesta de reglas)
tracking/ Persistencia SQLite (registro de solicitudes, estadísticas, registro de nodos)
plugins/ Sistema de plugins (protocolo, cargador, integrados)
ui/
api/ API REST + WebSocket (Starlette)
web/ Panel SPA (HTML/JS/CSS)
tui/ Interfaz de terminal (Textual) con pantalla de inicio de sesión
command_post/ Panel de agregación multiinstancia
listeners/ Listeners de protocolo (HTTP, DNS, MQTT, WebSocket)
backends/ Generadores de configuración (Nginx, Caddy, Apache)
models/ Tipos compartidos y modelos de eventos
Si deseas contribuir al proyecto, crea una nueva rama con el nombre de la versión y especifica el mismo nombre de versión en el pull request. Ej: rama=v1.2.3 | [v1.2.3] Añadido elemento blah.
Licencia BSD de 2 cláusulas. Consulta LICENSE para más detalles.
Copyright (c) 2026, Whispergate
| Flag | Descripción |
|---|
--listen-port PORT | Sobrescribe el puerto de escucha (por defecto: de la configuración) |
--ssl-cert PATH | Sobrescribe la ruta del certificado SSL |
--ssl-key PATH | Sobrescribe la ruta de la clave SSL |
--redirect-url URL | Sobrescribe la URL de redirección para solicitudes bloqueadas |
--default-action redirect|404 | Acción para solicitudes que no coinciden |
--no-ip-filter | Omite bloques de permitir/denegar IP |
--no-header-check | Omite reglas de validación de cabeceras |
--alias DOMAIN:ALIAS | Añade alias de nombre de servidor (repetible) |
--header NAME:VALUE | Añade cabecera de respuesta personalizada (repetible) |
| Endpoint | Método | Descripción |
|---|
/api/instances | GET | Lista todas las instancias con estado de salud |
/api/stats | GET | Estadísticas fusionadas de todas las instancias |
/api/requests | GET | Registro de solicitudes intercaladas de todas las instancias |
/api/intel/whitelist | POST | Incluye una IP en la lista blanca en todas las instancias |
/api/intel/blocklist | POST | Bloquea una IP en todas las instancias |
/api/intel/blocklist | DELETE | Desbloquea una IP en todas las instancias |
/ws/events | WS | Eventos en vivo multiplexados de todas las instancias |
| Volumen | Propósito |
|---|
./config | Archivos de configuración (montados solo lectura) |
./examples | Perfiles C2 (montados solo lectura) |
./rules | Listas de bloqueo ingeridas y archivos fuente de reglas (montados solo lectura) |
./data | Base de datos SQLite (persistida) |
certs | Certificados TLS (compartidos entre proxy y certbot) |
geoip | Bases de datos GeoLite2 (pobladas por el servicio geoip-update) |
pwndrop-data | Archivos subidos a PwnDrop y base de datos |
| Característica | RedWarden | InfraGuard |
|---|
| Arquitectura | Archivo único ~99KB | Paquete modular |
| Análisis de perfiles | Máquina de estados con regex | Analizador estructurado con soporte completo de bloqueo/transformación |
| Soporte C2 | Solo Cobalt Strike | Cobalt Strike, Mythic, Brute Ratel C4, Sliver, Havoc, Nighthawk, PoshC2 |
| Protocolos | Solo HTTP | HTTP, DNS, MQTT, WebSocket |
| Modelo de filtrado | Aprobado/rechazado binario | Basado en puntuación (umbral 0.0-1.0), cadena de 10 filtros |
| Identificación por huellas TLS | Ninguna | Bloqueo JA3 (Masscan, ZGrab2, Shodan, curl, Python requests, Nmap) |
| Detección de sandbox | Ninguna | Navegador sin cabeza / Safe Links / sandbox UA y puntuación de cabeceras |
| Detección de enumeración | Ninguna | Enumeración de rutas + seguimiento NXDOMAIN de DNS con bloqueo automático |
| Detección de quema | Ninguna | Monitoreo de registros CT, reputación de dominio (URLhaus/OpenPhish/GSB), detección de analistas entre dominios |
| Entrega de payloads | Ninguna | PwnDrop, almacén de archivos de Mythic, sistema de archivos, proxy HTTP con entrega condicional |
| Protección de payloads | Ninguna | Tokens de un solo uso, limitación de tasa por ruta, guardias de entrega (clave de entorno) |
| Protección contra phishing | Ninguna | Validación de tokens de campaña (lista estática o firmados con HMAC) |
| Interfaz de operador | Ninguna | Panel web + interfaz de terminal + puesto de mando multiinstancia |
| Generación de configuración | Ninguna | Nginx, Caddy, Apache con personalización completa |
| Ingesta de reglas | Ninguna | Analizador de .htaccess + robots.txt |
| Fuentes de inteligencia de amenazas | Ninguna | Autoactualización desde 5 fuentes públicas |
| Sistema de plugins | Interfaz básica de 4 métodos | Dirigido por eventos con hooks on_event + configuración por plugin |
| Integración SIEM | Ninguna | Elasticsearch, Wazuh, Syslog (CEF/JSON) |
| Alertas por webhook | Ninguna | Discord, Slack, webhook genérico (las alertas de quema se enrutan a través de los mismos plugins) |
| Inteligencia de lista blanca | Ninguna | Autoenriquecimiento de CIDR con ASN/org/país al inicio |
| Antirrepetición | Hash SQLite | SQLite persistente con caché L1 en memoria, sobrevive a reinicios |
| Acciones de caída | redirigir, reiniciar, proxy | redirigir, reiniciar, proxy, tarpit |
| Gestión TLS | Solo manual | Autofirmado automático + integración con Let's Encrypt |
| Despliegue perimetral | Ninguna | Proxies perimetrales Cloudflare Worker + AWS Lambda con domain fronting |
| Despliegue | Manual | Docker Compose con comprobaciones de salud |
| Registro | Salida personalizada con colores | JSON estructurado (structlog) |
| Asíncrono | Callbacks de Tornado | Nativo async/await (ASGI + uvicorn) |