
Honeypot de alta interacción que imita una aplicación Laravel/Livewire vulnerable. Captura exploits de RCE y webshells dirigidos a CVE-2024-47823, CVE-2025-54068 y CVE-2025-14894, y luego los analiza en contenedores Docker aislados para extraer IOCs.
Un honeypot de alta interacción que se hace pasar por una aplicación vulnerable de Laravel/Livewire. Captura intentos de explotación dirigidos a CVEs conocidos de Livewire, almacena archivos maliciosos subidos (webshells) y cargas útiles de ejecución remota de código (RCE) con deduplicación SHA-256 y, opcionalmente, los ejecuta en un contenedor Docker aislado para extraer indicadores de compromiso (IOCs) — URLs, IPs y dominios con los que el malware intenta contactar.
El sistema se ejecuta como dos procesos separados por seguridad: un servidor web que captura las cargas útiles (sin acceso a Docker) y un trabajador de sandbox que las analiza en contenedores aislados.
Atacante → Nginx → FastAPI → SQLite ← Trabajador de sandbox (Docker)
(captura) (sondea trabajos, escribe IOCs)
Fachada — Sirve páginas realistas de inicio de sesión/registro de Laravel con atributos wire: de Livewire, tokens XSRF y cabeceras X-Powered-By: PHP/8.3.12. Los escáneres automatizados ven lo que parece una aplicación vulnerable real.
Captura — Cada petición HTTP se registra en SQLite (IP, cabeceras, hash del cuerpo, timestamp) mediante una capa middleware ASGI, de forma transparente, antes de cualquier enrutamiento.
Señuelos — Los endpoints de Livewire aceptan subidas de archivos y mensajes de componentes como lo haría el framework real. Las cargas útiles se clasifican (código PHP, objetos serializados, comandos de shell) y se almacenan con deduplicación SHA-256. Cada carga útil interesante crea un trabajo duradero en la cola sandbox_jobs.
Sandbox — Un proceso trabajador independiente sondea trabajos pendientes y ejecuta cada carga útil en un contenedor Docker efímero (sistema de archivos de solo lectura, sin red, cap_drop=ALL). Un shim LD_PRELOAD intercepta las llamadas de red de libc para registrar intentos de comunicación C2 (comando y control). El analizador extrae los IOCs y puntúa posibles endpoints C2 mediante heurísticas.
Un señuelo comodín *.php también captura sondeos posteriores a la explotación para nombres de webshell comunes (por ejemplo, accesson.php, wp-login.php, admin.php).
Requisitos: Python 3.11+ y uv.
git clone https://github.com/HelgeSverre/livewire-honeypot.git
cd livewire-honeypot
# Instalar dependencias
uv sync
# Iniciar el servidor web (solo captura, no necesita Docker)
DATA_DIR=./data uv run uvicorn honeypot.main:app --reload --port 8000
# En una segunda terminal — iniciar el trabajador de sandbox (requiere Docker)
DATA_DIR=./data uv run python -m honeypot.worker
# Ejecutar pruebas
uv run pytest tests/ -v
El servidor web funciona de forma independiente — captura y almacena todo incluso sin el trabajador de sandbox en ejecución. Inicia el trabajador cuando quieras análisis automatizado de cargas útiles.
Nota: El directorio
src/está en el path de Python a través depyproject.toml(src-layout), por lo quehoneypot.main:appse asigna asrc/honeypot/main.py.
Necesitarás:
El despliegue completo es un solo comando una vez que la VPS existe. El script maneja cada paso desde "droplet limpio" a "servicio funcionando con TLS" — paquetes apt, usuarios y grupos, entorno virtual de Python, imagen de sandbox, nginx, certbot y reglas de firewall.
# 1. Crear un droplet de $6/mes (Ubuntu 24.04, 1 GB de RAM es suficiente).
# En 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. Apuntar el registro A de tu dominio a la IP del droplet.
# Esperar a que DNS resuelva antes de continuar.
dig +short tu-dominio.ejemplo # debería devolver la IP del droplet
# 3. Copiar el proyecto al droplet.
rsync -az --exclude='.git' --exclude='.venv' --exclude='data' \
./ root@<ip-del-droplet>:/opt/honeypot/
# 4. Ejecutar el script de arranque. Pasar tu dominio habilita TLS mediante certbot.
ssh root@<ip-del-droplet> 'cd /opt/honeypot && [email protected] \
bash deploy/setup.sh tu-dominio.ejemplo'
Eso es todo. El honeypot ahora sirve una página de inicio de sesión falsa de Laravel/Livewire a través de HTTPS, capturando cada petición en SQLite, y listo para analizar cargas útiles en el sandbox Docker.
deploy/setup.sh es idempotente — volver a ejecutarlo es seguro. En orden:
honeypot (web) y sandbox (trabajador), y el grupo compartido honeypot-data.uv sync --python /usr/bin/python3.12. Usamos deliberadamente el Python instalado por apt en lugar del intérprete incluido por uv — el Python de uv vive en /root/.local/share/uv/, que un usuario de servicio sin privilegios no puede recorrer, y obtendrías un confuso status=203/EXEC de systemd si dejas que uv elija el intérprete./var/honeypot/ con bit setgid y propiedad de grupo compartida, para que ambos servicios puedan leer las escrituras del otro.ExecStart del trabajador para usar el daemon Docker del sistema (la unidad incluida asume Docker rootless, que es más difícil de configurar).docker build -t honeypot-sandbox sandbox/).Si quieres realizar cada paso tú mismo en lugar de ejecutar setup.sh, el historial de comandos equivalente está en deploy/setup.sh como etapas comentadas.
| Servicio | Usuario | Propósito | Acceso a Docker |
|---|---|---|---|
honeypot.service |
Ambos servicios comparten /var/honeypot/ para la base de datos SQLite y el almacenamiento de cargas útiles. El proceso web no tiene acceso al socket de Docker, por lo que incluso si se ve comprometido mediante tráfico de atacantes, no puede crear contenedores en el host.
# Ver logs
journalctl -u honeypot -f
journalctl -u honeypot-worker -f
# Reiniciar servicios
systemctl restart honeypot honeypot-worker
# Actualizar
cd /opt/honeypot && git pull && uv sync
docker build -t honeypot-sandbox sandbox/
systemctl restart honeypot honeypot-worker
Todos los ajustes se controlan mediante variables de entorno (definidas en los archivos de unidad systemd o exportadas antes de ejecutar):
Todos los datos residen en una única base de datos SQLite (por defecto: /var/honeypot/captures.db).
# Peticiones recientes
sqlite3 /var/honeypot/captures.db \
"SELECT timestamp, source_ip, method, path, matched_trap
FROM requests ORDER BY id DESC LIMIT 20;"
# Cargas útiles únicas por frecuencia
sqlite3 /var/honeypot/captures.db \
"SELECT sha256, filename, payload_type, times_seen, sandbox_status
FROM payloads ORDER BY times_seen DESC;"
# IPs de atacantes principales
sqlite3 /var/honeypot/captures.db \
"SELECT ip, total_requests, first_seen, last_seen
FROM attackers ORDER BY total_requests DESC LIMIT 10;"
# Resultados del sandbox con IOCs extraídos (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;"
# Trabajos de sandbox pendientes
sqlite3 /var/honeypot/captures.db \
"SELECT id, payload_sha256, status, created_at
FROM sandbox_jobs ORDER BY id DESC LIMIT 10;"
Los datos de IOC en sandbox_runs.iocs se almacenan como JSON con las claves: domains, ips, emails, urls, hashes. Extrae y alimenta tu plataforma de inteligencia de amenazas (MISP, OpenCTI, etc.) según sea necesario.
src/honeypot/
main.py # Aplicación web FastAPI (solo captura, sin Docker)
worker.py # Trabajador de sandbox independiente (sondea SQLite, necesita Docker)
config.py # Configuración desde variables de entorno
capture/
database.py # SQLite asíncrono — peticiones, cargas útiles, cola sandbox_jobs
logger.py # Middleware ASGI — registra cada petición
payloads.py # Almacenamiento con deduplicación SHA-256 + clasificación de cargas útiles
facade/
routes.py # Páginas con huella de Laravel (inicio de sesión, registro, etc.)
templates/ # HTML Jinja2 con atributos wire: de Livewire
static/ # livewire.js falso (huella v3.5.1)
traps/
livewire.py # POST /livewire/message, /upload-file, /preview-file
php_catchall.py # Captura general para sondeos *.php
sandbox/
orchestrator.py # Ciclo de vida del contenedor Docker + endurecimiento
analyzer.py # Análisis de artefactos + extracción de IOC + puntuación C2
deploy/
nginx.conf # Proxy inverso con limitación de tasa
honeypot.service # Unidad systemd (web)
honeypot-worker.service # Unidad systemd (trabajador de sandbox)
setup.sh # Script de arranque para VPS
sandbox/
Dockerfile # Imagen del contenedor sandbox (PHP 8.3 + herramientas de atacante)
entrypoint.sh # Punto de entrada del contenedor con shim de red LD_PRELOAD
Esta es una herramienta de investigación para recolectar muestras de malware y observar el comportamiento de atacantes en infraestructura que posees. No es un producto de seguridad en producción. Despliégalo únicamente en sistemas que controles, y ten en cuenta que capturar y ejecutar cargas útiles de atacantes puede tener implicaciones legales en tu jurisdicción. La base de datos SQLite y los archivos de cargas útiles crecen sin límite — monitorea el uso del disco e implementa políticas de retención según sea necesario.
Las incidencias y solicitudes de extracción son bienvenidas.
| CVE | CVSS | Resumen | Endpoint del señuelo |
|---|
| CVE-2024-47823 | 9.8 Crítico | RCE por subida de archivos en Livewire mediante evasión de tipo MIME. Las extensiones de archivo se adivinan a partir del tipo MIME en lugar de validarse desde el nombre del archivo, lo que permite subir archivos .php disfrazados como imágenes. Afecta a Livewire < 2.12.7 y < 3.5.2. | POST /livewire/upload-file |
| CVE-2025-54068 | 9.2 Crítico | RCE por hidratación de propiedades en Livewire. El proceso de hidratación no sanitiza los tipos de objetos en las actualizaciones de propiedades de componentes, permitiendo que cargas útiles inyectadas se ejecuten en el servidor. Afecta a Livewire 3.0.0-beta.1 hasta 3.6.3. | POST /livewire/message |
| CVE-2025-14894 | Crítico | RCE por subida sin restricciones en Livewire Filemanager. La falta de validación de tipo MIME y de archivo permite la subida no autenticada de archivos PHP ejecutables. | POST /livewire/upload-file |
limit_req_zone/etc/nginx/conf.d/http {}server {}certbot --nginx si se pasó un dominio.honeypot |
| Servidor web — captura peticiones y cargas útiles |
| No |
honeypot-worker.service | sandbox | Trabajador de sandbox — analiza cargas útiles en Docker | Sí |
| Variable | Valor por defecto | Descripción |
|---|
DATA_DIR | /var/honeypot | Directorio base para todos los datos |
DB_PATH | $DATA_DIR/captures.db | Ruta de la base de datos SQLite |
SANDBOX_TIMEOUT | 60 | Máximo de segundos por ejecución de sandbox |
SANDBOX_MEMORY | 128m | Límite de memoria del contenedor |
SANDBOX_CPUS | 0.5 | Límite de CPU del contenedor |
SANDBOX_MAX_CONCURRENT | 3 | Máximo de contenedores sandbox concurrentes |
SANDBOX_IMAGE | honeypot-sandbox | Imagen Docker del sandbox |
WORKER_POLL_INTERVAL | 2.0 | Segundos entre sondeos de trabajos |