
Ursprünglich ein Honeypot für 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.
| 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 |
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.
| 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 |
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.
| 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 |
Internet :443/:80 → Caddy (TLS, Let’s Encrypt) → fmc-trap:5000 (Gunicorn/Flask)
↓
./data/logs, ./data/downloads (Bind-Mounts)
expose: "5000" in Compose).| 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 |
Compose übergibt diese Variablen an den Dienst fmc-trap; Einzelheiten finden Sie in docker-compose.yml.