
Originally a Honeypot for CVE-2026-20131
Ein Low-Interaction-Honeypot, der die Web-Oberfläche eines Cisco Secure Firewall Management Centers (FMC) nachahmt und nicht authentifizierten Java-Serialisierungs-ähnlichen Angriffsverkehr (CVE-artige Insecure-Deserialization-Sonden) erfasst.
\xac\xed\x00\x05 (und Base64 rO0AB…) und extrahiert Shell- oder URL-Strings mittels regulärer Ausdrücke und Heuristiken.requests in ein nicht ausführbares Download-Verzeichnis abgerufen.Einzeilige JSON-Logs (kompatibel mit Splunk und ELK), optionale Telegram-Benachrichtigungen, gehashte Artefakte der zweiten Stufe und ein Nicht-Root-Containerbenutzer. Das Projekt richtet sich an Forscher, die eine gezielte FMC-ähnliche Falle ohne zusätzlichen Integrationscode benötigen.
git clone https://github.com/Hassan-Pouladi/Cisco-FMC-honeypot
cd FMC-Trap
cp .env.example .env
Bearbeiten Sie .env nach Bedarf (siehe Umgebungsvariablen). Für Bereitstellungen hinter dem mitgelieferten Caddy setzen Sie TRUST_X_FORWARDED_FOR=1, damit die Client-IP-Adressen in den Logs den ursprünglichen Client widerspiegeln.
Bearbeiten Sie die Caddyfile: Ersetzen Sie die Platzhalter-Hostnamen durch Ihre Domain (und ggf. www):
example.com, www.example.com {
reverse_proxy fmc-trap:5000
}
Heben Sie optional den globalen email [email protected]-Block in der Caddyfile auf, um Let's Encrypt-Ablaufhinweise zu erhalten.
ihredomain.com → öffentliche IP Ihres Servers und www, falls verwendet.ufw allow 80,443/tcp).Die Anwendung läuft als UID 10001 innerhalb des Containers. Das gebundene Verzeichnis ./data muss beschreibbar sein:
mkdir -p data/logs data/downloads
sudo chown -R 10001:10001 data/logs data/downloads
Ohne korrekte Besitzerrechte können Exploit-POST-Anfragen 500 zurückgeben (Permission denied beim Schreiben von Logs oder Rohdaten).
docker compose up -d --build
docker compose ps
curl -sI https://ihredomain.com/
Erwarten Sie HTTP/2 200 (oder 301 oder 302) und Via: Caddy. Im Browser sollte https://ihredomain.com/ die simulierte FMC-Anmeldeseite anzeigen.
Informationen zum Lesen von Ereignissen, Payloads und Docker-Ausgaben finden Sie unter Logs, Downloads und Service-Ausgabe finden und Häufige Vorgänge.
Nachfolgendes bezieht sich auf Ihr Projektverzeichnis (den Ordner, der docker-compose.yml enthält, normalerweise FMC-Trap nach dem Klonen). Pfade beziehen sich auf den Host; Docker mountet sie per Bind in den Container.
Wenn etwas in der Log-Datei erscheint: fmc-trap.json erhält ein JSON-Objekt pro Zeile, wenn eine Anfrage Deserialisierungs-Sondenverhalten (Magic-Bytes in einem POST) entspricht. Normale GET-Anfragen an die gefälschte Anmeldeseite werden standardmäßig nicht in diese Datei geschrieben.
Wenn der Download-Ordner Dateien enthält: Einträge erscheinen nur, wenn die Pipeline eine URL aus einer Sonde extrahiert und der Harvester erfolgreich erlaubte entfernte Inhalte innerhalb von MAX_DOWNLOAD_MB abruft. Bleibt das Verzeichnis leer, liegen möglicherweise noch keine qualifizierenden URLs vor, oder Abrufe werden durch die Anwendungsrichtlinie blockiert.
JSON hübsch ausgeben (optional): Leiten Sie eine einzelne Zeile durch python -m json.tool oder verwenden Sie jq, falls installiert.
Internet :443/:80 → Caddy (TLS, Let’s Encrypt) → fmc-trap:5000 (Gunicorn/Flask)
↓
./data/logs, ./data/downloads (Bind-Mounts)
expose: "5000" in Compose).Compose übergibt diese Variablen an den Dienst fmc-trap; Einzelheiten finden Sie in docker-compose.yml.
Jede Zeile in data/logs/fmc-trap.json ist ein JSON-Objekt. Übliche Schlüssel sind timestamp, event_type, src_ip, headers, raw_payload_hash, extracted_commands und downloaded_file_hash, wenn eine Datei gespeichert wurde. Gespeicherte Blobs in data/downloads/ verwenden Modus 0400 (schreibgeschützt für den Besitzer).
Um Gunicorn direkt ohne Caddy zu erreichen, fügen Sie unter fmc-trap in docker-compose.yml Folgendes hinzu:
ports:
- "127.0.0.1:5000:5000"
Binden Sie die Anwendung in der Produktion nicht an 0.0.0.0, wenn Caddy TLS terminiert.
.env auf dem Host (niemals .env committen).Stellen Sie nur auf Systemen bereit, die Sie besitzen oder für die Sie ausdrücklich autorisiert sind, Instrumentierung zu installieren. Honeypots können Angriffsverkehr und Malware sammeln; halten Sie sich an geltendes Recht und organisatorische Richtlinien. Diese Software ist für Sicherheitsforschung bestimmt.
| Element | Hinweise |
|---|
| Docker und Docker Compose v2 | Docker installieren |
| VPS oder Host | Ein dediziertes oder isoliertes Netzwerksegment wird empfohlen |
| Domain (optional) | Für HTTPS: DNS konfigurieren und eingehenden TCP 80 und TCP 443 zum Host zulassen |
| Was | Host-Pfad | Öffnen oder verfolgen |
|---|
| Ereignis-Log (JSON-Zeilen) | data/logs/fmc-trap.json | tail -f data/logs/fmc-trap.json (Live-Stream), oder in einem Editor öffnen, oder in Splunk oder ELK aufnehmen |
| Heruntergeladene Payloads der zweiten Stufe | data/downloads/ | Dateien erscheinen nur, wenn der Harvester eine entfernte Antwort speichert; jede Datei ist mit ihrem SHA256-Hash benannt (64 hexadezimale Zeichen), ohne Erweiterung. Auflisten mit ls -la data/downloads (Linux/macOS) oder Get-ChildItem data\downloads (Windows PowerShell) |
| Anwendungsprozess-Ausgabe | Keine Datei; Docker | docker compose logs -f fmc-trap |
| Caddy (TLS, Proxy, ACME) | Keine Datei; Docker | docker compose logs -f caddy |
| Telegram-Benachrichtigungen (optional) | Nicht in data/ gespeichert | Setzen Sie TELEGRAM_BOT_TOKEN und TELEGRAM_CHAT_ID in .env; Benachrichtigungen werden bei Ereignis-Logs ausgelöst |
| Ziel | Befehl oder Aktion |
|---|
| Prüfen, ob Container laufen | docker compose ps |
Neustart nach Bearbeitung von .env oder Caddyfile | docker compose up -d --build (oder docker compose up -d --force-recreate, wenn nur env geändert) |
| Stack anhalten | docker compose down |
| Neue JSON-Ereignisse kontinuierlich verfolgen | tail -f data/logs/fmc-trap.json |
| Letzte Ereignisse anzeigen | tail -n 50 data/logs/fmc-trap.json |
| Heruntergeladene Artefakte zählen | Öffnen Sie data/downloads im Dateimanager, oder verwenden Sie einen Shell-Dateizähler für dieses Verzeichnis (Dateien sind nach SHA256 benannt) |
| Sicherstellen, dass die Honeypot-Seite lädt | Öffnen Sie https://ihredomain.com/ in einem Browser oder verwenden Sie curl -sI wie im Überprüfungsschritt |
| Variable | Zweck | Standard / Hinweis |
|---|
TRUST_X_FORWARDED_FOR | Den ersten X-Forwarded-For-Hop als src_ip verwenden | 1 wird mit Caddy empfohlen |
DECEPTION_STATUS | 200 gibt einen HTML-Body zurück; 302 gibt eine Weiterleitung zurück | 200 |
DECEPTION_REDIRECT_URL | Zielpfad bei Status 302 | / |
MAX_DOWNLOAD_MB | Harvester-Limit pro URL | 16 |
TELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_ID | Optionale Benachrichtigungen | Leer deaktiviert Benachrichtigungen |
FMC_SERVER_HEADER | Server-Antwort-Header | nginx |
VT_API_KEY | Reserviert | Optional |
| Symptom | Lösung |
|---|
Permission denied beim Schreiben unter data/ | Führen Sie sudo chown -R 10001:10001 data/logs data/downloads aus |
Bind for 0.0.0.0:80 failed: port is already allocated | Ein anderer Dienst oder Container ist an 80 gebunden. Stoppen Sie diesen Dienst oder geben Sie 80 frei; nur ein Prozess kann pro Host auf 80 hören. |
| Let's Encrypt- oder ACME-Fehler in Caddy-Logs | Stellen Sie sicher, dass DNS auf diesen Server auflöst und dass 80 und 443 aus dem Internet erreichbar sind. Compose konfiguriert DNS 1.1.1.1 und 8.8.8.8 für Caddy, wenn der Host-Resolver innerhalb von Docker fehlschlägt. |
curl zu HTTPS gibt leere Ausgabe zurück oder schlägt beim ersten Versuch fehl | Warten Sie, bis Zertifikat erfolgreich bezogen in docker compose logs caddy erscheint. |
Client-IP in Logs ist 172.x.x.x | Setzen Sie TRUST_X_FORWARDED_FOR=1 bei Verwendung von Caddy und erstellen Sie die Container neu: docker compose up -d --force-recreate. |