Primary ATDE 1.3 use case, polished for a public VPS.
YOU deploy one box INTERNET bots / scanners hit bait ports
(Docker catch-node) ──▶ HTTP · SSH · Redis · Telnet · MySQL · FTP · deception
│
▼
Every hit is fingerprinted + written to disk
data/caught/events.jsonl
data/caught/dossier_<IP>.json
│
▼
YOU review the live console + OpenAPI
http://YOUR_IP:9091/console
http://YOUR_IP:9091/v1/openapi.json
(severity · tools · tags · abuse · STIX export)
No Cloudflare / AWS / AbuseIPDB keys are required to record attacks. After a few high-severity hits from a public IP, ATDE can also apply a local OS ban (ipset/netsh) without NATS.
git clone https://github.com/theworker02/ATDE.git
cd ATDE
cp .env.example .env
# strongly recommended:
# echo 'ATDE_OPS_TOKEN=long-random-secret' >> .env
bash scripts/deploy-catch-node.sh
# Windows: .\scripts\deploy-catch-node.ps1Or:
docker compose -f deployments/catch-node.yml up -d --build| Port | Bait | Who hits it |
|---|---|---|
| 8080 | Atlas fake control-plane (login, .env, RCE canary) |
Web scanners / bots |
| 2222 | SSH password-burn | Credential stuffers |
| 6379 | Redis protocol bait | Redis exploit bots |
| 2323 | Telnet login bait | IoT botnet scanners |
| 3306 | MySQL greeting / auth bait | DB scanners / credential stuffers |
| 2121 | FTP login bait | Cred-spray / IoT FTP probes |
| 8443 | Deception API surface | Exploit kit probes |
| 9091 | Operator console + catch API + OpenAPI — your IP only | You |
sudo ufw allow 22/tcp
sudo ufw allow 8080,2222,6379,2323,3306,2121,8443/tcp
sudo ufw allow from YOUR.ADMIN.IP to any port 9091
sudo ufw enableConfig keys: ingest.honeypot.mysql_addr (default :3306), ingest.honeypot.ftp_addr (default :2121). Set either to off to disable.
# with catch-node already up:
bash scripts/verify-catch.sh
# Windows:
.\scripts\verify-catch.ps1Then open http://YOUR_IP:9091/console — you should see hits, severity, and tool tags.
atde -config configs/config.yaml -mode seed-demo
# writes sanitized multi-surface events under data/caught/
atde -mode caught -limit 20Use for diligence demos, CI smoke, or training — not a substitute for a public catch-node when you want real internet telemetry.
| Field | Example |
|---|---|
| IP / time | 203.0.113.50, UTC timestamp |
| Service / path | mysql-bait, ftp-bait, http-vuln-bait /.env |
| Tool guess | nuclei, sqlmap, mysql-scanner, ftp-scanner, … |
| Tags | cred-spray, redis-exploit, mysql-bait, ftp-bait, auth-burn |
| Severity | 1–100 (console sorts hot dossiers) |
| Body snippet | attempted passwords / Redis cmds / MySQL auth (truncated) |
| Actions | recorded, later local_firewall if banned |
When an attacker is recorded, ATDE can email you with who hit the decoy and confirmation that they were logged.
- SMTP (TLS / STARTTLS) to your mailbox
- OpenPGP encrypt the body to your public key (recommended — set
ATDE_PGP_REQUIRE=1) - On boot, a one-time “catch-node armed” mail is sent (
ATDE_ALERT_BOOT=1)
# in .env on the VPS
ATDE_ALERT_TO=you@example.com
ATDE_ALERT_FROM=atde@yourdomain.com
ATDE_SMTP_HOST=smtp.yourdomain.com
ATDE_SMTP_PORT=587
ATDE_SMTP_USER=...
ATDE_SMTP_PASS=...
ATDE_SMTP_TLS=starttls
ATDE_PGP_PUBLIC_KEY_FILE=/app/secrets/owner.asc
ATDE_PGP_REQUIRE=1
ATDE_CONSOLE_URL=http://YOUR_PUBLIC_IP:9091/console
ATDE_NODE_NAME=vps-catch-1Mount the key file into the container (example):
# add under volumes in catch-node.yml or override:
# - ./secrets/owner.asc:/app/secrets/owner.asc:roExport your public key (example with GnuPG):
gpg --armor --export you@example.com > secrets/owner.ascDecrypt alerts with your private key in Proton Mail / Thunderbird / gpg -d.
Cooldown (default 15m per IP) prevents inbox floods from noisy scanners.
docker compose -f deployments/catch-node.yml exec atde /app/atde -mode caught
docker compose -f deployments/catch-node.yml exec atde /app/atde -mode dossier
docker compose -f deployments/catch-node.yml exec atde /app/atde -mode export -ip 203.0.113.10
docker compose -f deployments/catch-node.yml exec atde /app/atde -mode abuse -ip 203.0.113.10
docker compose -f deployments/catch-node.yml exec atde /app/atde -mode stix -ip 203.0.113.10
docker compose -f deployments/catch-node.yml exec atde /app/atde -mode watch| Path | Purpose |
|---|---|
/v1/openapi.json |
OpenAPI 3 schema for the catch API |
/v1/capabilities |
Product capability map |
/v1/summary |
Dashboard stats + hot dossiers |
/v1/caught |
Recent events |
/v1/dossiers |
Ranked dossiers |
/v1/dossier/{ip} |
One dossier JSON |
/v1/export/{ip} |
Abuse Markdown package |
/v1/stix/{ip} |
STIX 2.1 indicator bundle |
/console |
Live operator UI |
curl -sS -H "X-ATDE-Token: $ATDE_OPS_TOKEN" http://YOUR_IP:9091/v1/openapi.json | head
curl -sS -H "X-ATDE-Token: $ATDE_OPS_TOKEN" http://YOUR_IP:9091/v1/export/203.0.113.10
curl -sS -H "X-ATDE-Token: $ATDE_OPS_TOKEN" http://YOUR_IP:9091/v1/stix/203.0.113.10Optional Slack/Discord alerts:
export ATDE_WEBHOOK_URL='https://hooks.example/...'
docker compose -f deployments/catch-node.yml up -dDeploy only on hosts you own. This baits and records attackers targeting your decoys — it does not attack third parties. See LEGAL.md.
| Symptom | Fix |
|---|---|
| Console empty after hours | Ports not public / wrong security group / CGNAT |
| Only private IPs | You tested from localhost — wait for internet scanners or run seed-demo |
| Redis/Telnet/MySQL/FTP not listening | Confirm Compose ports and redis_addr / telnet_addr / mysql_addr / ftp_addr in config |
| No alert emails | Set ATDE_ALERT_TO + SMTP + preferably ATDE_PGP_PUBLIC_KEY_FILE; check spam; severity/cooldown |
| Want full CT + STIX pipeline | Use deployments/docker-compose.yml (-mode all) with NATS |
More detail: HONEYPOT.md · OPERATOR.md · DEPLOY.md · CONFIGURATION.md