
Framework de simulación de phishing y concienciación para campañas basadas en nodos, captura de credenciales, entrega SMTP, CAPTCHA y reproducción opcional de credenciales del navegador.
Marco de simulación de phishing y concienciación en seguridad con flujos de trabajo configurables, gestión de campañas y proxy de credenciales opcional.
cd../deploy.sh; esto configurará los requisitos previos por ti, asumiendo que estás en Ubuntu../start.sh --preload-ml. Esto iniciará los servidores y precargará los modelos de ML que usamos.Obtienes la interfaz de administración (Admin UI) en http://localhost:8000 y el servidor de phishing en http://localhost:1234. Inicio de sesión por defecto: admin / admin123. Cambia la contraseña después del primer inicio de sesión.
Reenvía el puerto 8000 a tu equipo local mediante SSH para acceder al panel de administración. NO expongas el panel de administración ni el servidor Flask (puerto 1234) directamente a Internet.
deploy.sh instalará un servidor Caddy en el mismo host; todo está construido asumiendo que usarás Caddy como proxy inverso. No es obligatorio, pero aquí hay dragones.
Banderas opcionales para start.sh:
--with-caddy — Inicia Caddy mediante Docker (solo para pruebas locales).--preload-ml — Descarga previamente el modelo de detección de phishing (~1.3GB); evita la demora del primer uso al utilizar el plugin Phishing Detector.--reset-db — Restablece la base de datos y la reinicializa.--admin-only — Inicia solo el servidor de administración (puerto 8000).--phishing-only — Inicia solo el servidor de phishing (puerto 1234).--skip-init — Omite la inicialización de la base de datos.--skip-setup — Omite la configuración del venv/dependencias; solo carga .env e inicia los servidores.Sin start.sh, después de instalar las dependencias e inicializar la base de datos, puedes ejecutar ambos servidores con: uv run python -m cli start.
Python: Consulta requirements.txt. El stack principal incluye Flask, SQLAlchemy, Jinja2, Pydantic, Flask-Login, python-jose, passlib, cryptography y Flask-WTF. El plugin Phishing Detector usa transformers y torch. El proxy de credenciales usa Playwright; las integraciones opcionales usan OpenAI/Anthropic y boto3 (AWS Connect).
Desarrollo: requirements-dev.txt añade pytest, pytest-cov y herramientas de prueba relacionadas. Instala con uv pip install -r requirements-dev.txt para ejecutar pruebas y cobertura.
Sistema (producción): El script de despliegue está dirigido a Ubuntu/Debian. Instala uv, Caddy (proxy inverso) y paquetes del sistema como libmagic1. Para el proxy de credenciales, start.sh ejecuta uv run playwright install chromium para instalar Chromium.
Preparación para producción en Ubuntu. Idempotente. Hace lo siguiente:
requirements.txt..env a partir de .env.example si no existe y genera SECRET_KEY y JWT_SECRET_KEY si no están definidas.storage/caddy/data, storage/caddy/config, storage/uploads, storage/templates, storage/assets, instance).--init-db (ejecuta uv run python -m cli init --force).No inicia la aplicación. Para producción: inicia Caddy (proxy inverso) y luego arranca la aplicación con ./start.sh o un administrador de procesos para que todo el tráfico llegue a la aplicación a través del proxy.
Arranque de desarrollo y local. Hace lo siguiente:
.env y garantiza SECRET_KEY y JWT_SECRET_KEY (las genera si hay valores por defecto presentes).requirements.txt.uv run playwright install chromium para el proxy de credenciales.--preload-ml (~1.3GB).--skip-init). Usa --reset-db para borrarla y reinicializarla.--with-caddy (solo para pruebas locales).uv run python -m cli start; usa --admin-only o para ejecutar solo uno.En producción, la aplicación debe ejecutarse detrás de un proxy inverso. No expongas los servidores de desarrollo de Flask directamente a Internet.
El proxy inverso es responsable de la terminación TLS, las cabeceras Host correctas, el enrutamiento por ruta y dominio, y de separar el tráfico de administración del tráfico de campañas. La aplicación escucha en localhost o en un puerto interno; el proxy gestiona el HTTPS público y reenvía al servidor de administración (p. ej. puerto 8000) y al servidor de phishing (p. ej. puerto 1234) según tu configuración.
Recomendado: Usa Caddy como proxy inverso. deploy.sh instala Caddy mediante APT. El proyecto incluye ejemplos de Caddyfile (p. ej. Caddyfile.minimal). Después de ejecutar deploy.sh, inicia Caddy (p. ej. caddy run --config /path/to/Caddyfile.minimal) y luego arranca la aplicación con ./start.sh o un administrador de procesos. Cualquier proxy inverso equivalente (nginx, Traefik, etc.) es aceptable siempre que la aplicación no esté expuesta directamente.
Reel es un marco de simulación de phishing y concienciación en seguridad. Los operadores usan la interfaz de administración (admin UI) para gestionar campañas, flujos de trabajo, plantillas y objetivos. El servidor de phishing sirve las páginas de aterrizaje de las campañas y ejecuta flujos de trabajo—grafos basados en nodos de plugins—en cada petición.
Hay dos puntos de entrada de la aplicación en app.py: create_app() para el servidor de phishing y create_admin_app() para la interfaz de administración. Las campañas pueden ser entrantes (inbound) (un visitante sigue un enlace; los flujos de trabajo GET y POST gestionan las vistas de página y los envíos de formularios) o salientes (outbound) (el sistema envía correos o llamadas mediante flujos de trabajo de envío). Caddy puede usarse para el enrutamiento de campañas basado en dominios. El proxy de credenciales usa Playwright para la automatización del navegador y reproducir las credenciales capturadas en los sitios objetivo.
Un usuario visita una URL de campaña (p. ej. /<campaign_uid>). El servidor de phishing enruta por UID de campaña. Para peticiones GET ejecuta el flujo de trabajo GET de la campaña (p. ej. renderizar página de aterrizaje, CAPTCHA); para peticiones POST ejecuta el flujo de trabajo POST (p. ej. validar la entrada, capturar credenciales, redirigir). Los flujos de trabajo son de tipo campaign y declaran soporte de métodos HTTP (GET, POST o AMBOS). El contexto de ejecución incluye campaign, request, session y variables. La respuesta se toma de claves del contexto como _response_html, _response_redirect o _response_json. Los flujos de trabajo entrantes se usan para páginas de aterrizaje, CAPTCHA, captura de credenciales, redirecciones y registro de eventos.
Un operador ejecuta un flujo de trabajo de envío desde la interfaz de administración, vinculado a una campaña (el «Workflow» / flujo de trabajo de envío de la campaña). El ejecutor de envíos ejecuta un único flujo de trabajo de tipo sending: selecciona los objetivos (p. ej. desde CSV o usuarios rastreados), opcionalmente valida o pre-renderiza el contenido y luego itera sobre los objetivos—renderizando el correo, aplicando límites de tasa y enviando mediante un plugin (p. ej. SMTP). No hay GET/POST de visitante; el flujo de trabajo genera contenido y lo envía a una lista de objetivos.
Resumen:
Al construir flujos de trabajo, usa la sintaxis {{variable}} para la interpolación. Las rutas anidadas usan notación de puntos: {{nested.key}}.
Ejemplo de CSV: email,first_name,last_name,company,landing_page → usa {{target.email}}, {{target.first_name}}, {{target.company}}, {{target.custom_data.landing_page}}.
Ofuscador de URL: Usa url o target.landing_page como fuente, o interpola: http://{{target.ip}}/login.
| Variable | Descripción |
|---|---|
{{template_html}} | HTML renderizado |
{{campaign.template_html}} |
Detector de phishing: Establece html_content a {{template_html}}, {{campaign.template_html}} o {{email_html}}.
Target Selector (CSV) → Loop (array_source: targets, item_key: target) → Render Template → SMTP Sender
Etiquetas típicas en la plantilla: {{target.email}}, {{target.first_name}}, {{target.last_name}}, {{target.custom_data.X}} para cualquier columna CSV adicional.
Los flujos de trabajo se construyen a partir de nodos; cada nodo es un plugin con configuración. Los siguientes plugins integrados están disponibles.
make test-fast o ./run_tests.shmake test-coverage o ./run_tests.sh --coveragemake lintmake format-checkConsulta el Makefile para ver otros objetivos (división de pruebas unitarias/de integración/funcionales, init/reset de la base de datos, ejecutar solo el servidor de administración o de phishing).
--phishing-only| Variable | Descripción |
|---|
{{target}} | Objeto objetivo completo para la iteración actual del bucle |
{{target.email}} | Correo del objetivo |
{{target.first_name}} | Nombre |
{{target.last_name}} | Apellido |
{{target.custom_data}} | Dict de las demás columnas del CSV |
{{target.custom_data.column_name}} | Cualquier columna CSV adicional (p. ej. {{target.custom_data.company}}, {{target.custom_data.landing_page}}) |
{{target.name}} | Abreviatura de first_name o target.first_name |
{{target_name}} | Igual que target.name (alias) |
{{target_email}} | Igual que target.email (alias) |
{{_loop_index}} | Índice actual del bucle (basado en 0) |
| Variable | Descripción |
|---|
{{campaign.id}} | ID de la campaña |
{{campaign.uid}} | UID de la campaña |
{{campaign.name}} | Nombre de la campaña |
{{campaign.template_html}} | HTML de la plantilla de la campaña |
{{url}} | URL de aterrizaje de la campaña |
{{campaign_id}} | ID de la campaña |
{{variables}} | Dict de variables de la campaña |
| Variable | Descripción |
|---|
{{url}} | URL de aterrizaje de la campaña (definida por configuración o por defecto) |
{{target.landing_page}} | Si landing_page existe en el CSV |
{{target.custom_data.landing_page}} | Igual que la anterior cuando landing_page está en custom_data |
{{target.ip}} | Si ip está en el CSV o en los datos personalizados |
| HTML de la plantilla de la campaña |
{{email_html}} | HTML del correo renderizado (después de Render Template) |
{{body_html}} | HTML del cuerpo del correo |
| Variable | Descripción |
|---|
{{phishing_detection.is_phishing}} | Verdadero/Falso de BERT |
{{phishing_detection.confidence}} | Puntuación de confianza de BERT |
{{captured_credentials.username}} | Solo entrante (inbound) |
{{captured_credentials.password}} | Solo entrante (inbound) |
{{_email_sent}} | Indica si el envío SMTP fue exitoso |
| Plugin | Propósito |
|---|
| CAPTCHA | Cloudflare Turnstile: valida tokens y/o renderiza el widget; protege los formularios de los bots. |
| Capture Credentials | Captura credenciales de los envíos de formularios; las almacena en el contexto y en la base de datos para plugins posteriores. |
| Conditional Logic | Ramifica el flujo de trabajo según Verdadero/Falso usando el contexto (igualdad, contención, numérico, regex). |
| Data Transform | Establece, elimina, copia, renombra, fusiona o filtra datos del contexto para plugins posteriores. |
| Delay | Demora fija o aleatoria, o demora hasta una fecha/hora; limitación de tasa y temporización. |
| Email Template Validator | Valida plantillas (Jinja2, calidad, spam); IA opcional; ramifica según el resultado. |
| Generate Device Code (GraphSpy) | Códigos de dispositivo de Azure AD mediante la API de GraphSpy; úsalo con AWS Connect para la entrega por voz. |
| AWS Connect Dialer | Voz saliente mediante AWS Connect; SSML; se integra con GraphSpy para códigos de dispositivo. |
| Log Event | Registra eventos personalizados en la base de datos; datos de petición/sesión; auditoría y analíticas. |
| Phishing Detector (BERT) | Detección de phishing basada en ML sobre HTML; control de calidad y análisis de contenido. |
| Pushover | Notificaciones push (iOS, Android, escritorio) mediante la API de Pushover. |
| Queue Credential Proxy | Después de Capture Credentials, pone en cola un trabajo de automatización del navegador para reproducirlas en los sitios objetivo. |
| Redirect | Redirección HTTP a una URL con código de estado configurable; interpolación de variables. |
| Render Template | Renderiza HTML desde una plantilla de campaña, personalizada o de la biblioteca con Jinja2 y variables. |
| Send Slack Message | Envía un mensaje a Slack mediante webhook o bot; interpolación de variables. |
| SMTP Email Sender | Envía correo mediante SMTP (TLS, autenticación, HTML/texto plano, variables); se usa en flujos de trabajo de envío. |
| Target Selector | Selecciona objetivos desde CSV, lista manual o usuarios rastreados; filtra por dominio/cantidad; alimenta los flujos de trabajo de envío. |
| URL Obfuscator | Ofusca IPs/URLs (p. ej. DWORD, hexadecimal, mapeado IPv6); para pruebas e investigación. |
| User Agent Check | Permite o bloquea mediante regex de user-agent; bloquea, redirige o ramifica según el resultado. |
| Validate Input | Valida campos de formulario (obligatorios, tipo, longitud, regex); bloquea, redirige o continúa. |