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

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:
Эта архитектура обеспечивает:
| Возможность | Описание |
|---|---|
| Горизонтальное масштабирование | Запуск нескольких экземпляров сервера за балансировщиком нагрузки |
| Перезапуски без простоя | Перезапуск сервера без потери состояния конвейера |
| Восстановление после сбоя | Новый экземпляр сервера продолжает с того места, где остановился предыдущий |
| Проверка состояния | Прямые запросы к 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"