
Extiende tu reconocimiento con el poder de la nube

ReconSwarm es un framework modular de automatización de reconocimiento diseñado para pruebas de seguridad distribuidas. Aprovisiona infraestructura en la nube, ejecuta pipelines de reconocimiento en paralelo y recopila resultados con una configuración mínima.
ReconSwarm es adecuado para cazadores de recompensas, testers de penetración, ingenieros DevSecOps e investigadores de seguridad que necesitan flujos de trabajo de reconocimiento escalables y automatizados sin gestión manual de infraestructura.

ReconSwarm sigue una arquitectura modular con una clara separación de responsabilidades entre el aprovisionamiento en la nube, el control remoto del sistema, la ejecución del pipeline y la gestión de la configuración.
ReconSwarm utiliza un patrón de unión discriminada para los aprovisionadores de nube. El campo provisioner.type determina qué configuración de proveedor está activa:
provisioner:
type: yandex_cloud # Campo discriminador
yandex_cloud: # Activo cuando type: yandex_cloud
iam_token: "${YC_TOKEN}"
# key_path: "./sa_auth_key.json"
folder_id: "${YC_FOLDER_ID}"
# ... configuraciones específicas del proveedor
Se pueden integrar proveedores de nube adicionales implementando la interfaz Provisioner y agregando un nuevo tipo a la fábrica.
Las etapas son componentes extensibles que ejecutan operaciones en las máquinas virtuales worker:
Todos los campos de las etapas admiten renderizado de plantillas. Se pueden agregar nuevos tipos de etapas para extender la funcionalidad.
El servidor de ReconSwarm es completamente stateless — todo el estado se persiste en etcd:
Esta arquitectura permite:
| Capacidad | Descripción |
|---|---|
| Escalado horizontal |
Configuración de Alta Disponibilidad:
┌─────────────┐
│ Cliente │
└──────┬──────┘
│
┌──────▼──────┐
│Balanceador │
│ de Carga │
└──────┬──────┘
┌────────────┼────────────┐
│ │ │
┌──────▼──────┐ ┌───▼───┐ ┌──────▼──────┐
│ Servidor 1 │ │ Serv2 │ │ Servidor 3 │
└──────┬──────┘ └───┬───┘ └──────┬──────┘
│ │ │
└────────────┼────────────┘
│
┌──────▼──────┐
│ etcd cluster│
└─────────────┘
Todos los servidores comparten el mismo clúster etcd y pueden manejar cualquier solicitud. Si un servidor falla en medio de un pipeline, otro servidor puede continuar la ejecución después de leer el estado desde etcd.
Nota: La implementación actual ejecuta los pipelines en memoria después de cargarlos desde etcd. La recuperación completa ante fallos con reanudación del pipeline está planificada para versiones futuras.
git clone <repository>
cd reconswarm
go mod download
task build
ReconSwarm separa la configuración del servidor de la configuración del pipeline:
| Tipo de Configuración | Archivo | Descripción |
|---|---|---|
| Servidor | reconswarm.yaml | Proveedor de nube, etcd, configuración del pool de workers. |
| Pipeline | Archivo YAML separado | Objetivos y etapas, se pasa mediante la bandera -f. |
La configuración del servidor se almacena en reconswarm.yaml (configurable mediante la variable de entorno CONFIG_PATH). Todos los valores de cadena admiten expansión de variables de entorno utilizando la sintaxis ${VAR} o $VAR.
# Configuración del servidor
server:
port: 50051
# Conexión a etcd para gestión de estado
etcd:
endpoints:
- "localhost:2379"
dial_timeout: 5 # segundos
username: "" # opcional, soporta ${ETCD_USER}
password: "" # opcional, soporta ${ETCD_PASSWORD}
# Aprovisionador de nube (unión discriminada)
provisioner:
type: yandex_cloud # Selector de proveedor
# Configuración de Yandex Cloud (activa cuando type: yandex_cloud)
yandex_cloud:
iam_token: "${YC_TOKEN}"
# key_path: "./sa_auth_key.json"
folder_id: "${YC_FOLDER_ID}"
default_zone: "ru-central1-b"
default_image: "fd8b1cmhmncn7lt4tqn4"
default_username: "root"
default_cores: 2
default_memory: 2 # GB
default_disk_size: 20 # GB
# Configuración del pool de workers
workers:
max_workers: 5
setup_commands:
- "apt update"
- "apt install -y docker.io"
La configuración del pipeline se almacena en un archivo YAML separado y se pasa mediante la bandera -f. Se admiten tanto el formato envuelto como el no envuelto:
Formato envuelto (recomendado):
# pipeline.yaml
pipeline:
targets:
- value: "example.com"
type: crtsh
- value: ["sub1.example.com", "sub2.example.com"]
type: list
stages:
- name: "Ejecutar escáner"
type: exec
steps:
- "nmap -sC -sV -iL {{.Targets.filepath}} -oN /opt/recon/scan.txt"
- name: "Recopilar resultados"
type: sync
src: "/opt/recon/scan.txt"
dest: "./results/{{.Worker.Name}}.txt"
Formato no envuelto (también compatible):
# pipeline.yaml
targets:
- value: "example.com"
type: crtsh
stages:
- name: "Ejecutar escáner"
type: exec
steps:
- "nmap -iL {{.Targets.filepath}} -oN /opt/recon/scan.txt"
Los valores de configuración admiten sustitución de variables de entorno en dos formatos:
${VAR} — Nombre completo de la variable entre llaves.$VAR — Nombre simple de la variable.Si una variable de entorno no está definida, se utilizará la cadena literal (incluyendo ${VAR} o $VAR).
Para la integración con Yandex Cloud, use el script de configuración proporcionado:
Instalar Yandex Cloud CLI (si aún no está instalado):
# Siga la documentación oficial de Yandex Cloud para la instalación de la CLI
Configurar Yandex Cloud CLI:
yc config profile create <nombre-perfil>
yc config set cloud-id <su-cloud-id>
yc config set folder-id <su-folder-id>
Exportar credenciales:
source ./secrets-setup.sh
Este script exporta:
YC_TOKEN — Token IAM para autenticación.YC_FOLDER_ID — ID de la carpeta para la gestión de recursos.YC_CLOUD_ID — ID de la nube (si es necesario).Referencia en la configuración:
provisioner:
type: yandex_cloud
yandex_cloud:
iam_token: "${YC_TOKEN}"
# key_path: "./sa_auth_key.json"
folder_id: "${YC_FOLDER_ID}"
El script secrets-setup.sh genera automáticamente un nuevo token IAM cada vez que se ejecuta, garantizando una autenticación segura sin codificar las credenciales.
Crear una Cuenta de Servicio:
Configurar el Entorno:
export GCP_PROJECT_ID="su-project-id"
export GCP_CREDENTIALS_PATH="/ruta/a/key.json"
Referencia en la configuración:
provisioner:
type: gcp
gcp:
project_id: "${GCP_PROJECT_ID}"
credentials_path: "${GCP_CREDENTIALS_PATH}"
default_zone: "us-central1-a"
Crear un Usuario IAM:
Configurar el Entorno:
export AWS_ACCESS_KEY_ID="su-access-key"
export AWS_SECRET_ACCESS_KEY="su-secret-key"
Referencia en la configuración:
provisioner:
type: aws
aws:
region: "us-east-1"
access_key_id: "${AWS_ACCESS_KEY_ID}"
secret_access_key: "${AWS_SECRET_ACCESS_KEY}"
default_zone: "us-east-1a"
Generar un Token:
Configurar el Entorno:
export DO_TOKEN="su-token"
Referencia en la configuración:
provisioner:
type: digitalocean
digitalocean:
token: "${DO_TOKEN}"
default_region: "nyc1"
Enumeración de crt.sh:
targets:
- value: "example.com"
type: crtsh
Lista manual:
targets:
- value: ["sub1.example.com", "sub2.example.com"]
type: list
Todos los campos de configuración de las etapas admiten sintaxis de plantillas Go para la generación dinámica de valores. Las variables de plantilla se renderizan en el momento de la ejecución con datos de contexto proporcionados automáticamente.
Contexto de la Plantilla
Los siguientes datos están disponibles en todas las plantillas de etapa:
| Variable | Descripción |
|---|---|
{{.Targets.filepath}} | Ruta absoluta al archivo de objetivos en la VM remota. |
{{.Targets.list}} | Array de cadenas de objetivos para acceso programático. |
{{.Worker.Name}} | Identificador único de la instancia de VM worker. |
Etapa exec — Ejecuta comandos de shell con soporte de plantillas:
stages:
- name: "Ejecutar herramienta"
type: exec
steps:
- "docker run --rm -v /opt/recon:/data scanner:latest {{.Targets.filepath}}"
- "cat /opt/recon/results.json"
Todos los comandos en el array steps se renderizan mediante plantillas antes de la ejecución.
Etapa sync — Copia archivos o directorios desde remoto a local usando SFTP. Detecta automáticamente si la ruta es un archivo o directorio:
stages:
- name: "Recopilar resultados"
type: sync
src: "/opt/recon/results.json"
dest: "./results/{{.Worker.Name}}.json"
# Sincronizar directorio completo recursivamente
- name: "Recopilar todos los resultados"
type: sync
src: "/opt/recon"
dest: "./results/{{.Worker.Name}}"
Tanto src (ruta remota) como dest (ruta local) admiten renderizado de plantillas para rutas de archivo dinámicas. La etapa sync detecta automáticamente si la ruta de origen es un archivo o directorio y lo maneja en consecuencia.
Inicie el servidor gRPC para aceptar envíos de pipelines:
reconswarm server
El servidor lee la configuración de reconswarm.yaml y escucha en el puerto configurado (por defecto: 50051).
Envíe un pipeline a un servidor en ejecución:
reconswarm run -f examples/pipelines/nuclei.yaml
Opciones:
-f, --pipeline — Ruta al archivo YAML del pipeline (obligatorio).-s, --server — Dirección del servidor (por defecto: localhost:50051).reconswarm status <pipeline-id>
Ejecute un pipeline directamente sin el servidor gRPC (útil para pruebas):
reconswarm manual -f examples/pipelines/nuclei.yaml
Este comando:
reconswarm.yaml.workers.max_workers.La desasignación automática de infraestructura garantiza una autonomía completa: todos los recursos en la nube se aprovisionan, utilizan y destruyen sin intervención manual, permitiendo flujos de trabajo de reconocimiento totalmente automatizados.
Para ejemplos completos de pipelines, consulte el directorio examples/pipelines.
Enumeración y escaneo básico de subdominios:
# pipeline.yaml
pipeline:
targets:
- value: "example.com"
type: crtsh
stages:
- name: "Escaneo de objetivos"
type: exec
steps:
- "nmap -sC -sV -iL {{.Targets.filepath}} -oN /opt/recon/nmap-{{.Worker.Name}}.txt"
- name: "Recopilar resultados"
type: sync
src: "/opt/recon/nmap-{{.Worker.Name}}.txt"
dest: "./results/nmap-{{.Worker.Name}}.txt"
Ejecutar con:
reconswarm manual -f pipeline.yaml
# o enviar al servidor:
reconswarm run -f pipeline.yaml
Múltiples objetivos con escaneo basado en Docker:
pipeline:
targets:
- value: "example.com"
type: crtsh
- value: ["api.example.com", "www.example.com"]
type: list
stages:
- name: "Ejecutar escaneo de nuclei"
type: exec
steps:
- "docker run --rm -v /opt/recon:/data projectdiscovery/nuclei:latest -l {{.Targets.filepath}} -json -o /opt/recon/nuclei-{{.Worker.Name}}.json"
- name: "Copiar resultados de nuclei"
type: sync
src: "/opt/recon/nuclei-{{.Worker.Name}}.json"
dest: "./results/nuclei-{{.Worker.Name}}.json"
Cadena de herramientas personalizada con múltiples etapas:
Configuración del servidor (reconswarm.yaml):
workers:
max_workers: 5
setup_commands:
- "apt update"
- "apt install -y git golang"
- "git clone https://github.com/projectdiscovery/subfinder.git"
- "cd subfinder && go build"
Configuración del pipeline (pipeline.yaml):
pipeline:
targets:
- value: "example.com"
type: crtsh
stages:
- name: "Enumeración adicional"
type: exec
steps:
- "cd subfinder && ./subfinder -dL {{.Targets.filepath}} -o /opt/recon/subfinder-{{.Worker.Name}}.txt"
- name: "Fusionar objetivos"
type: exec
steps:
- "cat {{.Targets.filepath}} /opt/recon/subfinder-{{.Worker.Name}}.txt | sort -u > /opt/recon/all-targets-{{.Worker.Name}}.txt"
- name: "Escaneo de objetivos fusionados"
type: exec
steps:
- "nmap -sC -sV -iL /opt/recon/all-targets-{{.Worker.Name}}.txt -oN /opt/recon/scan-{{.Worker.Name}}.txt"
- name: "Recopilar todos los resultados"
type: sync
src: "/opt/recon"
dest: "./results/{{.Worker.Name}}"
Nota: La etapa sync detecta automáticamente que /opt/recon es un directorio y copia recursivamente todos los archivos y subdirectorios al destino local.
Enumeración de subdominios:
reconswarm crtsh-dump example.com
Obtiene y filtra subdominios resolubles de crt.sh para un dominio dado.
Comando de depuración (para probar el aprovisionamiento de VMs):
reconswarm debug
Compile y pruebe usando Task:
task build # Compilar binario
task test # Ejecutar pruebas
task lint # Ejecutar linter
task vet # Ejecutar go vet
task ci # Ejecutar todas las comprobaciones de CI
notify — Enviar notificaciones o alertas (webhooks, correo electrónico, Slack)conditional — Ejecutar etapas según resultados de etapas anterioresparallel — Ejecutar múltiples operaciones concurrentemente en el mismo workerretry — Reintentar automáticamente operaciones fallidas con retroceso configurabletimeout — Establecer tiempos de espera de ejecución por etapavalidate — Validar resultados o condiciones antes de continuarLicencia MIT. Consulte el archivo LICENSE para más detalles.
| Ejecutar múltiples instancias del servidor detrás de un balanceador de carga. |
| Reinicios sin tiempo de inactividad | Reiniciar el servidor sin perder el estado del pipeline. |
| Recuperación ante fallos | Una nueva instancia del servidor retoma donde se quedó la anterior. |
| Inspección de estado | Consultar etcd directamente para depuración y monitoreo. |