
Расширьте свою разведку с помощью облачных мощностей

ReconSwarm — это модульная среда автоматизации разведки, предназначенная для распределённого тестирования безопасности. Она предоставляет облачную инфраструктуру, выполняет параллельные конвейеры разведки и собирает результаты с минимальными затратами на настройку.
ReconSwarm подходит для охотников за багами (bug bounty), пентестеров, DevSecOps-инженеров и исследователей безопасности, которым нужны масштабируемые автоматизированные рабочие процессы разведки без ручного управления инфраструктурой.

ReconSwarm следует модульной архитектуре с чётким разделением ответственности между предоставлением облачных ресурсов, удалённым управлением системой, выполнением конвейера и управлением конфигурацией.
ReconSwarm использует шаблон дискриминируемого объединения для облачных провижинеров. Поле provisioner.type определяет, какая конфигурация провайдера активна:
provisioner:
type: yandex_cloud # Discriminator field
yandex_cloud: # Active when type: yandex_cloud
iam_token: "${YC_TOKEN}"
# key_path: "./sa_auth_key.json"
folder_id: "${YC_FOLDER_ID}"
# ... provider-specific settings
Дополнительные облачные провайдеры можно интегрировать, реализовав интерфейс Provisioner и добавив новый тип в фабрику.
Стадии — это расширяемые компоненты, выполняющие операции на виртуальных машинах воркеров:
Все поля стадий поддерживают рендеринг шаблонов. Для расширения функциональности можно добавлять новые типы стадий.
Сервер ReconSwarm полностью не хранит состояние (stateless) — всё состояние сохраняется в etcd:
Эта архитектура обеспечивает:
| Возможность | Описание |
|---|---|
| Горизонтальное масштабирование |
Настройка высокой доступности:
┌─────────────┐
│ Client │
└──────┬──────┘
│
┌──────▼──────┐
│Load Balancer│
└──────┬──────┘
┌────────────┼────────────┐
│ │ │
┌──────▼──────┐ ┌───▼───┐ ┌──────▼──────┐
│ Server 1 │ │Server2│ │ Server 3 │
└──────┬──────┘ └───┬───┘ └──────┬──────┘
│ │ │
└────────────┼────────────┘
│
┌──────▼──────┐
│ etcd cluster│
└─────────────┘
Все серверы используют один и тот же кластер etcd и могут обрабатывать любой запрос. Если сервер упадёт в середине конвейера, другой сервер сможет продолжить выполнение после чтения состояния из etcd.
Примечание: В текущей реализации конвейеры выполняются в памяти после загрузки из etcd. Полное восстановление после сбоя с возобновлением конвейера запланировано в будущих релизах.
git clone <repository>
cd reconswarm
go mod download
task build
ReconSwarm разделяет конфигурацию сервера и конфигурацию конвейера:
| Тип конфигурации | Файл | Описание |
|---|---|---|
| Сервер | reconswarm.yaml | Настройки облачного провайдера, etcd, пула воркеров |
| Конвейер | Отдельный YAML-файл | Цели и стадии, передаётся через флаг -f |
Конфигурация сервера хранится в reconswarm.yaml (настраивается через переменную окружения CONFIG_PATH). Все строковые значения поддерживают подстановку переменных окружения в синтаксисе ${VAR} или $VAR.
# Server settings
server:
port: 50051
# Etcd connection for state management
etcd:
endpoints:
- "localhost:2379"
dial_timeout: 5 # seconds
username: "" # optional, supports ${ETCD_USER}
password: "" # optional, supports ${ETCD_PASSWORD}
# Cloud provisioner (discriminated union)
provisioner:
type: yandex_cloud # Provider selector
# Yandex Cloud configuration (active when 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
# Worker pool settings
workers:
max_workers: 5
setup_commands:
- "apt update"
- "apt install -y docker.io"
Конфигурация конвейера хранится в отдельном YAML-файле и передаётся через флаг -f. Поддерживаются оба формата — с обёрткой и без:
Формат с обёрткой (рекомендуется):
# pipeline.yaml
pipeline:
targets:
- value: "example.com"
type: crtsh
- value: ["sub1.example.com", "sub2.example.com"]
type: list
stages:
- name: "Run scanner"
type: exec
steps:
- "nmap -sC -sV -iL {{.Targets.filepath}} -oN /opt/recon/scan.txt"
- name: "Collect results"
type: sync
src: "/opt/recon/scan.txt"
dest: "./results/{{.Worker.Name}}.txt"
Формат без обёртки (тоже поддерживается):
# pipeline.yaml
targets:
- value: "example.com"
type: crtsh
stages:
- name: "Run scanner"
type: exec
steps:
- "nmap -iL {{.Targets.filepath}} -oN /opt/recon/scan.txt"
Значения конфигурации поддерживают подстановку переменных окружения в двух форматах:
${VAR} — полное имя переменной в фигурных скобках$VAR — простое имя переменнойЕсли переменная окружения не установлена, будет использована буквальная строка (включая ${VAR} или $VAR).
Для интеграции с Yandex Cloud используйте предоставленный скрипт настройки:
Установите Yandex Cloud CLI (если ещё не установлен):
# Follow official Yandex Cloud documentation for CLI installation
Настройте Yandex Cloud CLI:
yc config profile create <profile-name>
yc config set cloud-id <your-cloud-id>
yc config set folder-id <your-folder-id>
Экспортируйте учётные данные:
source ./secrets-setup.sh
Этот скрипт экспортирует:
YC_TOKEN — IAM-токен для аутентификацииYC_FOLDER_ID — идентификатор каталога для управления ресурсамиYC_CLOUD_ID — идентификатор облака (при необходимости)Укажите в конфигурации:
provisioner:
type: yandex_cloud
yandex_cloud:
iam_token: "${YC_TOKEN}"
# key_path: "./sa_auth_key.json"
folder_id: "${YC_FOLDER_ID}"
Скрипт secrets-setup.sh автоматически генерирует свежий IAM-токен при каждом запуске, обеспечивая безопасную аутентификацию без захардкоженных учётных данных.
Создайте сервисный аккаунт:
Настройте окружение:
export GCP_PROJECT_ID="your-project-id"
export GCP_CREDENTIALS_PATH="/path/to/key.json"
Укажите в конфигурации:
provisioner:
type: gcp
gcp:
project_id: "${GCP_PROJECT_ID}"
credentials_path: "${GCP_CREDENTIALS_PATH}"
default_zone: "us-central1-a"
Создайте IAM-пользователя:
Настройте окружение:
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
Укажите в конфигурации:
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"
Сгенерируйте токен:
Настройте окружение:
export DO_TOKEN="your-token"
Укажите в конфигурации:
provisioner:
type: digitalocean
digitalocean:
token: "${DO_TOKEN}"
default_region: "nyc1"
Перечисление через crt.sh:
targets:
- value: "example.com"
type: crtsh
Ручной список:
targets:
- value: ["sub1.example.com", "sub2.example.com"]
type: list
Все поля конфигурации стадий поддерживают синтаксис Go-шаблонов для динамической генерации значений. Переменные шаблонов рендерятся во время выполнения с автоматически предоставляемыми данными контекста.
Контекст шаблона
В шаблонах всех стадий доступны следующие данные:
| Переменная | Описание |
|---|---|
{{.Targets.filepath}} | Абсолютный путь к файлу целей на удалённой ВМ |
{{.Targets.list}} | Массив строк целей для программного доступа |
{{.Worker.Name}} | Уникальный идентификатор экземпляра ВМ воркера |
Стадия exec — выполняет shell-команды с поддержкой шаблонов:
stages:
- name: "Run tool"
type: exec
steps:
- "docker run --rm -v /opt/recon:/data scanner:latest {{.Targets.filepath}}"
- "cat /opt/recon/results.json"
Все команды в массиве steps перед выполнением проходят рендеринг шаблонов.
Стадия sync — копирует файлы или каталоги с удалённой машины на локальную через SFTP. Автоматически определяет, является ли путь файлом или каталогом:
stages:
- name: "Collect results"
type: sync
src: "/opt/recon/results.json"
dest: "./results/{{.Worker.Name}}.json"
# Sync entire directory recursively
- name: "Collect all results"
type: sync
src: "/opt/recon"
dest: "./results/{{.Worker.Name}}"
И src (удалённый путь), и dest (локальный путь) поддерживают рендеринг шаблонов для динамических путей к файлам. Стадия sync автоматически определяет, является ли исходный путь файлом или каталогом, и обрабатывает его соответствующим образом.
Запустите gRPC-сервер для приёма конвейеров:
reconswarm server
Сервер читает конфигурацию из reconswarm.yaml и слушает настроенный порт (по умолчанию: 50051).
Отправьте конвейер на запущенный сервер:
reconswarm run -f examples/pipelines/nuclei.yaml
Параметры:
-f, --pipeline — путь к YAML-файлу конвейера (обязательно)-s, --server — адрес сервера (по умолчанию: localhost:50051)reconswarm status <pipeline-id>
Выполните конвейер напрямую без gRPC-сервера (полезно для тестирования):
reconswarm manual -f examples/pipelines/nuclei.yaml
Эта команда:
reconswarm.yamlworkers.max_workersАвтоматическое освобождение инфраструктуры обеспечивает полную автономность — все облачные ресурсы предоставляются, используются и уничтожаются без ручного вмешательства, что позволяет полностью автоматизировать рабочие процессы разведки.
Полные примеры конвейеров см. в каталоге examples/pipelines.
Базовое перечисление поддоменов и сканирование:
# pipeline.yaml
pipeline:
targets:
- value: "example.com"
type: crtsh
stages:
- name: "Scan targets"
type: exec
steps:
- "nmap -sC -sV -iL {{.Targets.filepath}} -oN /opt/recon/nmap-{{.Worker.Name}}.txt"
- name: "Collect results"
type: sync
src: "/opt/recon/nmap-{{.Worker.Name}}.txt"
dest: "./results/nmap-{{.Worker.Name}}.txt"
Запуск:
reconswarm manual -f pipeline.yaml
# or submit to server:
reconswarm run -f pipeline.yaml
Несколько целей со сканированием на основе Docker:
pipeline:
targets:
- value: "example.com"
type: crtsh
- value: ["api.example.com", "www.example.com"]
type: list
stages:
- name: "Run nuclei scan"
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: "Copy nuclei results"
type: sync
src: "/opt/recon/nuclei-{{.Worker.Name}}.json"
dest: "./results/nuclei-{{.Worker.Name}}.json"
Пользовательский инструментарий с несколькими стадиями:
Конфигурация сервера (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"
Конфигурация конвейера (pipeline.yaml):
pipeline:
targets:
- value: "example.com"
type: crtsh
stages:
- name: "Additional enumeration"
type: exec
steps:
- "cd subfinder && ./subfinder -dL {{.Targets.filepath}} -o /opt/recon/subfinder-{{.Worker.Name}}.txt"
- name: "Merge targets"
type: exec
steps:
- "cat {{.Targets.filepath}} /opt/recon/subfinder-{{.Worker.Name}}.txt | sort -u > /opt/recon/all-targets-{{.Worker.Name}}.txt"
- name: "Scan merged targets"
type: exec
steps:
- "nmap -sC -sV -iL /opt/recon/all-targets-{{.Worker.Name}}.txt -oN /opt/recon/scan-{{.Worker.Name}}.txt"
- name: "Collect all results"
type: sync
src: "/opt/recon"
dest: "./results/{{.Worker.Name}}"
Примечание: стадия sync автоматически определяет, что /opt/recon является каталогом, и рекурсивно копирует все файлы и подкаталоги в локальный каталог назначения.
Перечисление поддоменов:
reconswarm crtsh-dump example.com
Получает и фильтрует резолвящиеся поддомены из crt.sh для заданного домена.
Команда debug (для тестирования предоставления ВМ):
reconswarm debug
Сборка и тестирование с помощью Task:
task build # Build binary
task test # Run tests
task lint # Run linter
task vet # Run go vet
task ci # Run all CI checks
notify — отправка уведомлений или оповещений (webhooks, email, Slack)conditional — выполнение стадий на основе результатов предыдущих стадийparallel — параллельное выполнение нескольких операций на одном воркереretry — автоматический повтор неудачных операций с настраиваемой задержкой (backoff)timeout — установка таймаутов выполнения для каждой стадииvalidate — проверка результатов или условий перед продолжениемЛицензия MIT. Подробности см. в файле LICENSE.
| Запуск нескольких экземпляров сервера за балансировщиком нагрузки |
| Перезапуски без простоя | Перезапуск сервера без потери состояния конвейера |
| Восстановление после сбоя | Новый экземпляр сервера продолжает с того места, где остановился предыдущий |
| Проверка состояния | Прямые запросы к etcd для отладки и мониторинга |