
وسّع عمليات الاستطلاع لديك بقوة السحابة

ReconSwarm هو إطار عمل نمطي لأتمتة الاستطلاع مصمم للاختبارات الأمنية الموزعة. يقوم بتوفير البنية التحتية السحابية، وتنفيذ خطوط استطلاع متوازية، وجمع النتائج بأقل عبء إعدادات.
يعد ReconSwarm مناسبًا لصيادي برامج مكافآت الثغرات، ومختبري الاختراق، ومهندسي 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 وإضافة نوع جديد إلى المصنع (factory).
المراحل مكونات قابلة للتوسع تنفذ عمليات على الأجهزة الافتراضية للعمال:
جميع حقول المراحل تدعم عرض القوالب. يمكن إضافة أنواع مراحل جديدة لتوسيع الوظائف.
خادم ReconSwarm عديم الحالة تمامًا — كل الحالة محفوظة في 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 — تنفذ أوامر الصدفة مع دعم القوالب:
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 لنطاق معين.
أمر التصحيح (لاختبار توفير الأجهزة الافتراضية):
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 أو البريد الإلكتروني أو Slack)conditional — تنفيذ المراحل بناءً على نتائج المرحلة السابقةparallel — تنفيذ عمليات متعددة بشكل متزامن على نفس العاملretry — إعادة محاولة العمليات الفاشلة تلقائيًا مع تأخير قابل للضبطtimeout — ضبط مهلات تنفيذ لكل مرحلةvalidate — التحقق من النتائج أو الشروط قبل المتابعةرخصة MIT. راجع ملف LICENSE للتفاصيل.
| إعادة تشغيل الخادم دون فقدان حالة خط الأنابيب |
| التعافي من الأعطال | تستأنف نسخة الخادم الجديدة من حيث توقفت النسخة السابقة |
| فحص الحالة | الاستعلام عن etcd مباشرة للتصحيح والمراقبة |