
Hochinteraktiver Honeypot, der eine verwundbare Laravel/Livewire-App nachahmt. Erfasst RCE-Exploits und Webshells, die auf CVE-2024-47823, CVE-2025-54068 und CVE-2025-14894 abzielen, und analysiert sie anschließend in isolierten Docker-Containern, um IOCs zu extrahieren.
Ein High-Interaction-Honeypot, der sich als verwundbare Laravel/Livewire-Anwendung ausgibt. Er erfasst Exploit-Versuche, die auf bekannte Livewire-CVEs abzielen, speichert hochgeladene Schaddateien (Webshells) und Remote-Code-Execution-Payloads (RCE) mit SHA-256-Deduplizierung und führt sie optional in einem gesandboxten Docker-Container aus, um Indicators of Compromise (IOCs) zu extrahieren – URLs, IPs und Domains, mit denen die Malware Kontakt aufzunehmen versucht.
Das System läuft aus Sicherheitsgründen als zwei getrennte Prozesse: ein Webserver, der Payloads erfasst (kein Docker-Zugriff), und ein Sandbox-Worker, der sie in isolierten Containern analysiert.
Attacker → Nginx → FastAPI → SQLite ← Sandbox Worker (Docker)
(capture) (polls jobs, writes IOCs)
Fassade – Stellt realistische Laravel-Anmelde-/Registrierungsseiten mit Livewire-wire:-Attributen, XSRF-Tokens und X-Powered-By: PHP/8.3.12-Headern bereit. Automatisierte Scanner sehen, was wie eine echte verwundbare App aussieht.
Erfassung – Jede HTTP-Anfrage wird von einer ASGI-Middleware-Schicht transparent in SQLite protokolliert (IP, Header, Body-Hash, Zeitstempel), bevor irgendein Routing stattfindet.
Fallen – Livewire-Endpunkte akzeptieren Datei-Uploads und Komponentennachrichten genau wie das echte Framework. Payloads werden klassifiziert (PHP-Code, serialisierte Objekte, Shell-Befehle) und mit SHA-256-Deduplizierung gespeichert. Jeder interessante Payload erzeugt einen dauerhaften Auftrag in der sandbox_jobs-Warteschlange.
Sandbox – Ein separater Worker-Prozess fragt nach anstehenden Aufträgen und führt jeden Payload in einem ephemeren Docker-Container aus (nur lesbares Dateisystem, kein Netzwerk, cap_drop=ALL). Ein LD_PRELOAD-Shim fängt libc-Netzwerkaufrufe ab, um C2-Kommunikationsversuche (Command-and-Control) zu protokollieren. Der Analyzer extrahiert IOCs und bewertet potenzielle C2-Endpunkte mithilfe von Heuristiken.
| CVE | CVSS | Zusammenfassung | Fallen-Endpunkt |
|---|---|---|---|
| CVE-2024-47823 | 9.8 Kritisch | Livewire-Datei-Upload-RCE durch MIME-Typ-Umgehung. Dateierweiterungen werden anhand des MIME-Typs erraten statt anhand des Dateinamens validiert, wodurch als Bilder getarnte .php-Uploads möglich sind. Betrifft Livewire < 2.12.7 und < 3.5.2. | POST /livewire/upload-file |
| CVE-2025-54068 | 9.2 Kritisch | Livewire-Prop-Hydration-RCE. Der Hydrationsprozess bereinigt Objekttypen bei Komponenteneigenschafts-Updates nicht, sodass injizierte Payloads serverseitig ausgeführt werden können. Betrifft Livewire 3.0.0-beta.1 bis 3.6.3. | POST /livewire/message |
| CVE-2025-14894 | Kritisch | Unbeschränkter Upload-RCE im Livewire-Dateimanager. Fehlende Dateityp- und MIME-Validierung ermöglicht den nicht authentifizierten Upload ausführbarer PHP-Dateien. | POST /livewire/upload-file |
Eine *.php-Catch-all-Falle erfasst auch Post-Exploitation-Sondierungen nach gängigen Webshell-Dateinamen (z. B. accesson.php, wp-login.php, admin.php).
Voraussetzungen: Python 3.11+ und uv.
git clone https://github.com/HelgeSverre/livewire-honeypot.git
cd livewire-honeypot
# Install dependencies
uv sync
# Start the web server (capture-only, no Docker needed)
DATA_DIR=./data uv run uvicorn honeypot.main:app --reload --port 8000
# In a second terminal — start the sandbox worker (requires Docker)
DATA_DIR=./data uv run python -m honeypot.worker
# Run tests
uv run pytest tests/ -v
Der Webserver funktioniert eigenständig – er erfasst und speichert alles, auch wenn der Sandbox-Worker nicht läuft. Starten Sie den Worker, wenn Sie eine automatisierte Payload-Analyse wünschen.
Hinweis: Das Verzeichnis
src/ist überpyproject.toml(src-layout) im Python-Pfad, sodasshoneypot.main:appaufsrc/honeypot/main.pyabgebildet wird.
Sie benötigen:
Die vollständige Bereitstellung ist ein einziger Befehl, sobald die VPS existiert. Das Skript übernimmt jeden Schritt von „nacktem Droplet“ bis „Dienst läuft mit TLS“ – apt-Pakete, Benutzer und Gruppen, Python-venv, Sandbox-Image, nginx, certbot und Firewall-Regeln.
# 1. Provision a $6/mo droplet (Ubuntu 24.04, 1 GB RAM is enough).
# On DigitalOcean:
doctl compute droplet create veritron-honeypot \
--size s-1vcpu-1gb \
--image ubuntu-24-04-x64 \
--region fra1 \
--ssh-keys "$(doctl compute ssh-key list --format ID --no-header | head -1)" \
--wait
# 2. Point your domain's A record at the droplet IP.
# Wait for DNS to resolve before continuing.
dig +short your-domain.example # should return the droplet IP
# 3. Copy the project onto the droplet.
rsync -az --exclude='.git' --exclude='.venv' --exclude='data' \
./ root@<droplet-ip>:/opt/honeypot/
# 4. Run the bootstrap script. Passing your domain enables TLS via certbot.
ssh root@<droplet-ip> 'cd /opt/honeypot && [email protected] \
bash deploy/setup.sh your-domain.example'
Das war's. Der Honeypot liefert jetzt eine gefälschte Laravel/Livewire-Anmeldeseite über HTTPS aus, erfasst jede Anfrage in SQLite und ist bereit, Payloads in der Docker-Sandbox zu analysieren.
deploy/setup.sh ist idempotent – eine erneute Ausführung ist sicher. Der Reihe nach:
honeypot (Web) und sandbox (Worker) sowie die gemeinsame Gruppe honeypot-data.uv sync --python /usr/bin/python3.12 aus. Wir verwenden bewusst das apt-installierte Python anstelle des gebündelten Interpreters von uv – uvs Python liegt in /root/.local/share/uv/, auf das ein unprivilegierter Dienstbenutzer nicht zugreifen kann, und man erhält ein verwirrendes status=203/EXEC von systemd, wenn man uv den Interpreter auswählen lässt./var/honeypot/ mit Setgid-Bit und gemeinsamem Gruppenbesitz, sodass beide Dienste die Schreibvorgänge des jeweils anderen lesen können.ExecStart des Workers so um, dass der systemweite Docker-Daemon verwendet wird (die mitgelieferte Unit setzt Rootless Docker voraus, das schwieriger einzurichten ist).docker build -t honeypot-sandbox sandbox/).limit_req_zone in /etc/nginx/conf.d/ ab (sie muss im Block http {} stehen, nicht in server {}).certbot --nginx aus, wenn eine Domain übergeben wurde.Wenn Sie jeden Schritt selbst ausführen möchten, anstatt setup.sh auszuführen, finden Sie die entsprechende Shell-Historie in deploy/setup.sh als kommentierte Phasen.
| Dienst | Benutzer | Zweck | Docker-Zugriff |
|---|---|---|---|
honeypot.service | honeypot | Webserver – erfasst Anfragen und Payloads | Nein |
honeypot-worker.service | sandbox | Sandbox-Worker – analysiert Payloads in Docker | Ja |
Beide Dienste teilen sich /var/honeypot/ für die SQLite-Datenbank und die Payload-Speicherung. Der Webprozess hat keinen Zugriff auf den Docker-Socket. Selbst wenn er durch Angreifer-Traffic kompromittiert wird, kann er auf dem Host keine Container erstellen.
# View logs
journalctl -u honeypot -f
journalctl -u honeypot-worker -f
# Restart services
systemctl restart honeypot honeypot-worker
# Upgrade
cd /opt/honeypot && git pull && uv sync
docker build -t honeypot-sandbox sandbox/
systemctl restart honeypot honeypot-worker
Alle Einstellungen werden über Umgebungsvariablen gesteuert (in den systemd-Unit-Dateien gesetzt oder vor der Ausführung exportiert):
| Variable | Standard | Beschreibung |
|---|---|---|
DATA_DIR | /var/honeypot | Basisverzeichnis für alle Daten |
DB_PATH | $DATA_DIR/captures.db | Pfad zur SQLite-Datenbank |
SANDBOX_TIMEOUT | 60 | Maximale Sekunden pro Sandbox-Lauf |
SANDBOX_MEMORY | 128m | Speicherlimit des Containers |
SANDBOX_CPUS | 0.5 | CPU-Limit des Containers |
SANDBOX_MAX_CONCURRENT | 3 | Maximale gleichzeitige Sandbox-Container |
SANDBOX_IMAGE | honeypot-sandbox | Docker-Image für die Sandbox |
WORKER_POLL_INTERVAL | 2.0 | Sekunden zwischen Auftragsabfragen |
Alle Daten liegen in einer einzigen SQLite-Datenbank (Standard: /var/honeypot/captures.db).
# Recent requests
sqlite3 /var/honeypot/captures.db \
"SELECT timestamp, source_ip, method, path, matched_trap
FROM requests ORDER BY id DESC LIMIT 20;"
# Unique payloads by frequency
sqlite3 /var/honeypot/captures.db \
"SELECT sha256, filename, payload_type, times_seen, sandbox_status
FROM payloads ORDER BY times_seen DESC;"
# Top attacker IPs
sqlite3 /var/honeypot/captures.db \
"SELECT ip, total_requests, first_seen, last_seen
FROM attackers ORDER BY total_requests DESC LIMIT 10;"
# Sandbox results with extracted IOCs (JSON)
sqlite3 /var/honeypot/captures.db \
"SELECT payload_id, exit_code, duration_seconds, c2_urls_found, iocs
FROM sandbox_runs ORDER BY id DESC LIMIT 5;"
# Pending sandbox jobs
sqlite3 /var/honeypot/captures.db \
"SELECT id, payload_sha256, status, created_at
FROM sandbox_jobs ORDER BY id DESC LIMIT 10;"
IOC-Daten in sandbox_runs.iocs werden als JSON mit den Schlüsseln domains, ips, emails, urls, hashes gespeichert. Extrahieren Sie sie nach Bedarf und speisen Sie sie in Ihre Threat-Intelligence-Plattform (MISP, OpenCTI usw.) ein.
src/honeypot/
main.py # FastAPI web app (capture-only, no Docker)
worker.py # Standalone sandbox worker (polls SQLite, needs Docker)
config.py # Settings from environment variables
capture/
database.py # Async SQLite — requests, payloads, sandbox_jobs queue
logger.py # ASGI middleware — logs every request
payloads.py # SHA-256 dedup storage + payload classification
facade/
routes.py # Laravel-fingerprinted pages (login, register, etc.)
templates/ # Jinja2 HTML with Livewire wire: attributes
static/ # Fake livewire.js (v3.5.1 fingerprint)
traps/
livewire.py # POST /livewire/message, /upload-file, /preview-file
php_catchall.py # Catch-all for *.php probing
sandbox/
orchestrator.py # Docker container lifecycle + hardening
analyzer.py # Artifact parsing + IOC extraction + C2 scoring
deploy/
nginx.conf # Reverse-proxy with rate limiting
honeypot.service # systemd unit (web)
honeypot-worker.service # systemd unit (sandbox worker)
setup.sh # VPS bootstrap script
sandbox/
Dockerfile # Sandbox container image (PHP 8.3 + attacker tools)
entrypoint.sh # Container entry-point with LD_PRELOAD network shim
Dies ist ein Forschungswerkzeug zum Sammeln von Malware-Proben und zur Beobachtung des Angreiferverhaltens auf Infrastruktur, die Sie besitzen. Es ist kein Produktiv-Sicherheitsprodukt. Setzen Sie es nur auf Systemen ein, die Sie kontrollieren, und beachten Sie, dass das Erfassen und Ausführen von Angreifer-Payloads in Ihrer Rechtsordnung rechtliche Konsequenzen haben kann. Die SQLite-Datenbank und die Payload-Dateien wachsen unbegrenzt – überwachen Sie die Speichernutzung und implementieren Sie bei Bedarf Aufbewahrungsrichtlinien.
Issues und Pull-Requests sind willkommen.