
Framework de simulation de phishing et de sensibilisation pour campagnes basées sur des nœuds, capture d'identifiants, livraison SMTP, CAPTCHA et rejeu facultatif des identifiants de navigateur.
Framework de simulation de phishing et de sensibilisation à la sécurité avec workflows configurables, gestion de campagnes et proxy d'identifiants optionnel.
cd dedans../deploy.sh - cela configurera les prérequis pour vous, en supposant que vous êtes sur Ubuntu../start.sh --preload-ml. Cela démarrera les serveurs et préchargera les modèles de ML que nous utilisons.Vous obtenez l'interface d'administration sur http://localhost:8000 et le serveur de phishing sur http://localhost:1234. Connexion par défaut : admin / admin123. Changez le mot de passe après la première connexion.
Redirigez le port 8000 vers votre machine locale via SSH pour accéder au panneau d'administration. N'exposez PAS le panneau d'administration ni le serveur Flask (port 1234) directement sur Internet.
deploy.sh installera un serveur Caddy sur le même hôte ; tout est construit en supposant que vous utiliserez Caddy comme proxy inverse. Vous n'êtes pas obligé, mais ici il y a des dragons.
Options facultatives pour start.sh :
--with-caddy — Démarre Caddy via Docker (tests locaux uniquement).--preload-ml — Pré-télécharge le modèle de détection de phishing (~1,3 Go) ; évite le délai de première utilisation avec le plugin Détecteur de phishing.--reset-db — Remet à zéro la base de données et la réinitialise.--admin-only — Démarre uniquement le serveur d'administration (port 8000).--phishing-only — Démarre uniquement le serveur de phishing (port 1234).--skip-init — Ignore l'initialisation de la base de données.--skip-setup — Ignore la configuration du venv/dépendances ; charge simplement .env et démarre les serveurs.Sans start.sh, après avoir installé les dépendances et initialisé la base de données, vous pouvez lancer les deux serveurs avec : uv run python -m cli start.
Python : Voir requirements.txt. La pile de base comprend Flask, SQLAlchemy, Jinja2, Pydantic, Flask-Login, python-jose, passlib, cryptography et Flask-WTF. Le plugin Détecteur de phishing utilise transformers et torch. Le proxy d'identifiants utilise Playwright ; les intégrations optionnelles utilisent OpenAI/Anthropic et boto3 (AWS Connect).
Développement : requirements-dev.txt ajoute pytest, pytest-cov et les outils de test associés. Installez avec uv pip install -r requirements-dev.txt pour exécuter les tests et la couverture.
Système (production) : Le script de déploiement cible Ubuntu/Debian. Il installe uv, Caddy (proxy inverse) et des paquets système tels que libmagic1. Pour le proxy d'identifiants, start.sh exécute uv run playwright install chromium pour installer Chromium.
Préparation de la production sur Ubuntu. Idempotent. Il :
requirements.txt..env à partir de .env.example s'il est manquant et génère SECRET_KEY et JWT_SECRET_KEY s'ils ne sont pas définis.storage/caddy/data, storage/caddy/config, storage/uploads, storage/templates, storage/assets, instance).--init-db (exécute uv run python -m cli init --force).Il ne démarre pas l'application. En production : démarrez Caddy (proxy inverse), puis démarrez l'application avec ./start.sh ou un gestionnaire de processus afin que tout le trafic atteigne l'application via le proxy.
Démarrage en développement et en local. Il :
.env et garantit SECRET_KEY et JWT_SECRET_KEY (les génère si des valeurs par défaut sont présentes).requirements.txt.uv run playwright install chromium pour le proxy d'identifiants.--preload-ml (~1,3 Go).--skip-init). Utilisez --reset-db pour supprimer et réinitialiser.--with-caddy (tests locaux uniquement).uv run python -m cli start ; utilisez --admin-only ou --phishing-only pour n'en lancer qu'un.En production, l'application doit être exécutée derrière un proxy inverse. N'exposez pas les serveurs de développement Flask directement sur Internet.
Le proxy inverse est responsable de la terminaison TLS, des en-têtes Host corrects, du routage des chemins et des domaines, et de la séparation du trafic d'administration du trafic de campagne. L'application écoute sur localhost ou sur un port interne ; le proxy gère le HTTPS public et transmet au serveur d'administration (par exemple le port 8000) et au serveur de phishing (par exemple le port 1234) selon votre configuration.
Recommandé : Utilisez Caddy comme proxy inverse. deploy.sh installe Caddy via APT. Le projet inclut des exemples de Caddyfile (par exemple Caddyfile.minimal). Après avoir exécuté deploy.sh, démarrez Caddy (par exemple caddy run --config /path/to/Caddyfile.minimal), puis démarrez l'application avec ./start.sh ou un gestionnaire de processus. Tout proxy inverse équivalent (nginx, Traefik, etc.) est acceptable tant que l'application n'est pas exposée directement.
Reel est un framework de simulation de phishing et de sensibilisation à la sécurité. Les opérateurs utilisent l'interface d'administration pour gérer les campagnes, les workflows, les modèles et les cibles. Le serveur de phishing sert les pages de destination des campagnes et exécute des workflows — des graphes de plugins basés sur des nœuds — à chaque requête.
Il y a deux points d'entrée de l'application dans app.py : create_app() pour le serveur de phishing et create_admin_app() pour l'interface d'administration. Les campagnes peuvent être entrantes (un visiteur suit un lien ; les workflows GET et POST gèrent les vues de page et les soumissions de formulaires) ou sortantes (le système envoie des e-mails ou des appels via des workflows d'envoi). Caddy peut être utilisé pour le routage des campagnes par domaine. Le proxy d'identifiants utilise Playwright pour l'automatisation du navigateur afin de rejouer les identifiants capturés sur les sites cibles.
Un utilisateur visite une URL de campagne (par exemple /<campaign_uid>). Le serveur de phishing route par UID de campagne. Pour les requêtes GET, il exécute le workflow GET de la campagne (par exemple, rendre la page de destination, CAPTCHA) ; pour les requêtes POST, il exécute le workflow POST (par exemple, valider les entrées, capturer les identifiants, rediriger). Les workflows sont de type campagne et déclarent le support des méthodes HTTP (GET, POST ou BOTH). Le contexte d'exécution inclut campaign, request, session et variables. La réponse est tirée de clés de contexte telles que _response_html, _response_redirect ou _response_json. Les workflows entrants sont utilisés pour les pages de destination, les CAPTCHA, la capture d'identifiants, les redirections et la journalisation.
Un opérateur exécute un workflow d'envoi depuis l'interface d'administration, lié à une campagne (le « Workflow » / workflow d'envoi de la campagne). L'exécuteur d'envoi exécute un seul workflow de type envoi : il sélectionne les cibles (par exemple depuis un CSV ou des utilisateurs suivis), valide ou pré-rend éventuellement le contenu, puis itère sur les cibles — en rendant l'e-mail, en appliquant des limites de débit et en envoyant via un plugin (par exemple SMTP). Il n'y a pas de GET/POST visiteur ; le workflow génère le contenu et l'envoie à une liste de cibles.
Résumé :
Lors de la création de workflows, utilisez la syntaxe {{variable}} pour l'interpolation. Les chemins imbriqués utilisent la notation par points : {{nested.key}}.
Exemple CSV : email,first_name,last_name,company,landing_page → utilisez {{target.email}}, {{target.first_name}}, {{target.company}}, {{target.custom_data.landing_page}}.
Obfuscateur d'URL : Utilisez url ou target.landing_page comme source, ou interpolez : http://{{target.ip}}/login.
| Variable | Description |
|---|---|
{{template_html}} | HTML rendu |
{{campaign.template_html}} | HTML du modèle de campagne |
Détecteur de phishing : Définissez html_content sur {{template_html}}, {{campaign.template_html}} ou {{email_html}}.
Target Selector (CSV) → Loop (array_source: targets, item_key: target) → Render Template → SMTP Sender
Balises typiques dans le modèle : {{target.email}}, {{target.first_name}}, {{target.last_name}}, {{target.custom_data.X}} pour toute colonne CSV supplémentaire.
Les workflows sont construits à partir de nœuds ; chaque nœud est un plugin avec une configuration. Les plugins intégrés suivants sont disponibles.
make test-fast ou ./run_tests.shmake test-coverage ou ./run_tests.sh --coveragemake lintmake format-checkVoir le Makefile pour des cibles supplémentaires (répartitions des tests unitaires/intégration/fonctionnels, init/réinitialisation de la base de données, exécution du serveur admin ou phishing uniquement).
| Variable | Description |
|---|
{{target}} | Objet cible complet pour l'itération de boucle actuelle |
{{target.email}} | E-mail de la cible |
{{target.first_name}} | Prénom |
{{target.last_name}} | Nom de famille |
{{target.custom_data}} | Dictionnaire des autres colonnes CSV |
{{target.custom_data.column_name}} | Toute colonne CSV supplémentaire (par exemple {{target.custom_data.company}}, {{target.custom_data.landing_page}}) |
{{target.name}} | Raccourci pour first_name ou target.first_name |
{{target_name}} | Identique à target.name (alias) |
{{target_email}} | Identique à target.email (alias) |
{{_loop_index}} | Index de boucle actuel (base 0) |
| Variable | Description |
|---|
{{campaign.id}} | ID de campagne |
{{campaign.uid}} | UID de campagne |
{{campaign.name}} | Nom de campagne |
{{campaign.template_html}} | HTML du modèle de campagne |
{{url}} | URL de destination de la campagne |
{{campaign_id}} | ID de campagne |
{{variables}} | Dictionnaire des variables de campagne |
| Variable | Description |
|---|
{{url}} | URL de destination de la campagne (définie par la configuration ou par défaut) |
{{target.landing_page}} | Si landing_page existe dans le CSV |
{{target.custom_data.landing_page}} | Identique à ci-dessus lorsque landing_page est dans custom_data |
{{target.ip}} | Si ip est dans le CSV ou les données personnalisées |
{{email_html}} | HTML de l'e-mail rendu (après Render Template) |
{{body_html}} | HTML du corps de l'e-mail |
| Variable | Description |
|---|
{{phishing_detection.is_phishing}} | True/False provenant de BERT |
{{phishing_detection.confidence}} | Score de confiance BERT |
{{captured_credentials.username}} | Entrant uniquement |
{{captured_credentials.password}} | Entrant uniquement |
{{_email_sent}} | Indique le succès de l'envoi SMTP |
| Plugin | Purpose |
|---|
| CAPTCHA | Cloudflare Turnstile : valider les jetons et/ou rendre le widget ; protéger les formulaires contre les bots. |
| Capture Credentials | Capturer les identifiants des soumissions de formulaires ; les stocker dans le contexte et la base de données pour les plugins en aval. |
| Conditional Logic | Brancher le workflow sur True/False en utilisant le contexte (égalité, contenance, numérique, regex). |
| Data Transform | Définir, supprimer, copier, renommer, fusionner ou filtrer les données de contexte pour les plugins en aval. |
| Delay | Délai fixe ou aléatoire, ou délai jusqu'à une date/heure ; limitation de débit et temporisation. |
| Email Template Validator | Valider les modèles (Jinja2, qualité, spam) ; IA optionnelle ; brancher sur le résultat. |
| Generate Device Code (GraphSpy) | Codes d'appareil Azure AD via l'API GraphSpy ; à utiliser avec AWS Connect pour la livraison vocale. |
| AWS Connect Dialer | Voix sortante via AWS Connect ; SSML ; s'intègre à GraphSpy pour les codes d'appareil. |
| Log Event | Journaliser des événements personnalisés dans la base de données ; données de requête/session ; audit et analyses. |
| Phishing Detector (BERT) | Détection de phishing basée sur le ML sur le HTML ; assurance qualité et analyse de contenu. |
| Pushover | Notifications push (iOS, Android, bureau) via l'API Pushover. |
| Queue Credential Proxy | Après Capture Credentials, mettre en file d'attente un travail d'automatisation de navigateur pour rejouer sur les sites cibles. |
| Redirect | Redirection HTTP vers une URL avec code de statut configurable ; interpolation de variables. |
| Render Template | Rendre le HTML à partir d'un modèle de campagne, personnalisé ou de bibliothèque avec Jinja2 et des variables. |
| Send Slack Message | Envoyer un message à Slack via webhook ou bot ; interpolation de variables. |
| SMTP Email Sender | Envoyer un e-mail via SMTP (TLS, authentification, HTML/texte brut, variables) ; utilisé dans les workflows d'envoi. |
| Target Selector | Sélectionner les cibles depuis un CSV, une liste manuelle ou des utilisateurs suivis ; filtrer par domaine/nombre ; alimenter les workflows d'envoi. |
| URL Obfuscator | Obfusquer les IP/URL (par exemple DWORD, hexadécimal, mappage IPv6) ; pour les tests et la recherche. |
| User Agent Check | Autoriser ou bloquer selon une regex de user-agent ; bloquer, rediriger ou brancher sur le résultat. |
| Validate Input | Valider les champs de formulaire (obligatoire, type, longueur, regex) ; bloquer, rediriger ou continuer. |