
bbscope — Mis à jour !
Outil d'agrégation de scope pour HackerOne, Bugcrowd, Intigriti, YesWeHack et Immunefi !
bbscope.com
Interface web et API pour agréger les portées des programmes de bug bounty provenant de HackerOne, Bugcrowd, Intigriti et YesWeHack.
Démarrage rapide (Docker)
cd website
cp .env.example .env
# Edit .env — at minimum set POSTGRES_PASSWORD and your platform credentials
docker compose up -d --build
Le site sera disponible à l'adresse https://yourdomain.com (Caddy gère automatiquement le HTTPS via Let's Encrypt).
Défi DNS Cloudflare
Si votre serveur est derrière Cloudflare (DNS proxy), le défi HTTP ACME standard ne fonctionnera pas. Utilisez plutôt le fichier compose Cloudflare, qui construit un Caddy personnalisé avec le plugin DNS Cloudflare :
docker compose -f docker-compose.cloudflare.yml up -d --build
Définissez CF_API_TOKEN dans votre .env. Créez le jeton sur https://dash.cloudflare.com/profile/api-tokens avec la permission Zone:DNS:Edit pour votre domaine.
Développement local
Prérequis : Go 1.24+, une instance PostgreSQL en cours d'exécution.
DB_URL="postgres://postgres:yourpassword@localhost:5432/bbscope?sslmode=disable" \
go run *.go serve --dev --poll-interval 0 --listen localhost:7001
Le drapeau --dev active le mode HTTP uniquement (pas de TLS). --poll-interval 0 désactive l'interrogation en arrière-plan, vous n'avez donc pas besoin d'informations d'identification de plateforme.
Options de la commande serve
| Drapeau | Défaut | Description |
|---|---|---|
--dev, -d | false | Mode développement (HTTP, pas de TLS) |
--poll-interval | 6 | Heures entre les cycles d'interrogation (0 pour désactiver) |
--listen | :8080 | Adresse d'écoute HTTP |
--domain | bbscope.com | Domaine pour sitemap/robots.txt |
La connexion à la base de données est lue depuis la variable d'environnement DB_URL ou db_url dans ~/.bbscope.yaml.
Configuration
Identifiants de plateforme
Tous les identifiants de plateforme sont facultatifs. Les plateformes non configurées sont simplement ignorées lors de l'interrogation.
| Plateforme | Variables d'environnement | Notes |
|---|---|---|
| HackerOne | H1_USERNAME, H1_TOKEN | Jeton API |
| Bugcrowd | BC_EMAIL, BC_PASSWORD, BC_OTP | Ou définissez BC_PUBLIC_ONLY=1 pour les programmes publics uniquement |
| Intigriti | IT_TOKEN | Jeton Bearer |
| YesWeHack | YWH_EMAIL, YWH_PASSWORD, YWH_OTP | Email + mot de passe + OTP |
Normalisation IA (optionnelle)
Définissez OPENAI_API_KEY et éventuellement OPENAI_MODEL (par défaut gpt-4.1-mini) pour activer la normalisation des cibles de portée basée sur l'IA. Mise en cache par cible pour minimiser les appels API.
Authentification de base (optionnelle)
Pour protéger le site avec une authentification de base HTTP :
-
Générez un hash de mot de passe :
docker run --rm caddy:2-alpine caddy hash-password --plaintext 'yourpassword' -
Copiez la configuration exemple dans
conf.d/:cp basicauth.caddy.example conf.d/basicauth.caddy -
Modifiez
conf.d/basicauth.caddyet ajoutez votre nom d'utilisateur et votre hash :basic_auth { myuser $2a$14$hashgoeshere... } -
Redémarrez Caddy :
docker compose restart caddy
Pour désactiver, supprimez conf.d/basicauth.caddy et redémarrez.
Architecture
caddy (ports 80/443) → bbscope-web (:8080) → postgres
- Caddy gère la terminaison TLS et le proxy inverse. Les fragments de configuration supplémentaires dans
conf.d/*.caddysont importés automatiquement. - bbscope-web sert le site et exécute les interrogateurs en arrière-plan.
- PostgreSQL stocke les programmes, les cibles et l'historique des changements de portée. Le schéma est automatiquement migré au démarrage.
API
Le site expose une API publique :
| Point d'accès | Description |
|---|---|
GET /api/v1/programs | Lister tous les programmes |
GET /api/v1/programs/{platform}/{handle} | Détail d'un programme |
GET /api/v1/targets/{type} | Cibles par type : wildcards, domains, urls, ips, cidrs |
Paramètres de requête : scope (in/out/both), platform, type, raw (ignorer IA), format (json/text).
La sortie par défaut est du texte délimité par des sauts de ligne ; ajoutez format=json pour du JSON. Les réponses sont mises en cache pendant 5 minutes.