
À l'origine un honeypot pour CVE-2026-20131
Un honeypot à faible interaction qui imite l'interface web d'un Cisco Secure Firewall Management Center (FMC) et capture le trafic d'attaque non authentifié de type sérialisation Java (sondes de désérialisation non sécurisée de type CVE).
\xac\xed\x00\x05 (et le Base64 rO0AB…) et extrait les chaînes shell ou URL à l'aide d'expressions régulières et d'heuristiques.requests dans un volume de téléchargements non exécutable.Journaux JSON sur une seule ligne (compatibles avec Splunk et ELK), alertes Telegram facultatives, artefacts de deuxième étape hachés et utilisateur de conteneur non-root. Le projet est destiné aux chercheurs qui ont besoin d'un piège ciblé de type FMC sans code d'intégration supplémentaire.
| Élément | Remarques |
|---|---|
| Docker et Docker Compose v2 | Installer Docker |
| VPS ou hôte | Un segment réseau dédié ou isolé est recommandé |
| Domaine (facultatif) | Pour HTTPS : configurer le DNS et autoriser les connexions entrantes TCP 80 et TCP 443 vers l'hôte |
git clone https://github.com/Hassan-Pouladi/Cisco-FMC-honeypot
cd FMC-Trap
cp .env.example .env
Modifiez .env selon vos besoins (voir Variables d'environnement). Pour les déploiements derrière le Caddy fourni, définissez TRUST_X_FORWARDED_FOR=1 afin que les adresses IP des clients dans les journaux reflètent le client d'origine.
Modifiez Caddyfile : remplacez les noms d'hôte factices par votre domaine (et www le cas échéant) :
example.com, www.example.com {
reverse_proxy fmc-trap:5000
}
En option, décommentez le bloc global email [email protected] dans Caddyfile pour les avis d'expiration de Let’s Encrypt.
yourdomain.com vers l'adresse IP publique de votre serveur, et www si utilisé.ufw allow 80,443/tcp).L'application s'exécute avec l'UID 10001 dans le conteneur. Le répertoire ./data monté en bind doit être accessible en écriture :
mkdir -p data/logs data/downloads
sudo chown -R 10001:10001 data/logs data/downloads
Sans droits de propriété corrects, les requêtes POST d'exploitation peuvent renvoyer 500 (Permission denied lors de l'écriture des journaux ou des blobs bruts).
docker compose up -d --build
docker compose ps
curl -sI https://yourdomain.com/
Attendez-vous à HTTP/2 200 (ou 301 ou 302) et à Via: Caddy. Dans un navigateur, https://yourdomain.com/ doit afficher la page de connexion FMC simulée.
Pour savoir où lire les événements, les charges utiles et les sorties Docker, voir Où trouver les journaux, les téléchargements et la sortie de service et Opérations courantes.
Tout ce qui suit est relatif à votre répertoire de projet (le dossier qui contient docker-compose.yml, généralement FMC-Trap après le clonage). Les chemins se trouvent sur l'hôte ; Docker les monte en bind dans le conteneur.
| Quoi | Chemin sur l'hôte | Comment ouvrir ou suivre |
|---|---|---|
| Journal d'événements (lignes JSON) | data/logs/fmc-trap.json | tail -f data/logs/fmc-trap.json (flux en direct), ou ouvrez dans un éditeur, ou ingérez dans Splunk ou ELK |
| Charges utiles de deuxième étape téléchargées | data/downloads/ | Les fichiers n'apparaissent que lorsque le collecteur enregistre une réponse distante ; chaque fichier est nommé avec son hash SHA256 (64 caractères hexadécimaux), sans extension. Listez avec ls -la data/downloads (Linux ou macOS) ou Get-ChildItem data\downloads (Windows PowerShell) |
| Sortie du processus applicatif | Pas un fichier ; Docker | docker compose logs -f fmc-trap |
| Caddy (TLS, proxy, ACME) | Pas un fichier ; Docker | docker compose logs -f caddy |
| Alertes Telegram (facultatives) | Non stockées dans data/ | Définissez TELEGRAM_BOT_TOKEN et TELEGRAM_CHAT_ID dans .env ; les alertes se déclenchent lorsque des événements sont journalisés |
Quand quelque chose apparaît dans le fichier journal : fmc-trap.json reçoit un objet JSON par ligne lorsqu'une requête correspond au comportement d'une sonde de désérialisation (octets magiques dans un POST). Les requêtes GET ordinaires vers la page de connexion factice ne sont pas écrites dans ce fichier par défaut.
Quand le dossier de téléchargements contient des fichiers : les entrées n'apparaissent que si le pipeline extrait une URL d'une sonde et que le collecteur récupère avec succès le contenu distant autorisé dans la limite de MAX_DOWNLOAD_MB. Si le répertoire reste vide, il se peut qu'aucune URL admissible n'ait encore été détectée, ou que les récupérations soient bloquées par la politique de l'application.
Affichage lisible du JSON (facultatif) : pour une seule ligne, faites passer par python -m json.tool ou utilisez jq s'il est installé.
| Objectif | Commande ou action |
|---|---|
| Vérifier si les conteneurs sont en cours d'exécution | docker compose ps |
Redémarrer après modification de .env ou Caddyfile | docker compose up -d --build (ou docker compose up -d --force-recreate si seul l'environnement a changé) |
| Arrêter la stack | docker compose down |
| Suivre en continu les nouveaux événements JSON | tail -f data/logs/fmc-trap.json |
| Inspecter les derniers événements | tail -n 50 data/logs/fmc-trap.json |
| Compter les artefacts téléchargés | Ouvrez data/downloads dans votre gestionnaire de fichiers, ou utilisez un comptage de fichiers en shell sur ce répertoire (les fichiers sont nommés d'après leur hash SHA256) |
| Confirmer que la page du honeypot se charge | Ouvrez https://yourdomain.com/ dans un navigateur ou utilisez curl -sI comme à l'étape de vérification |
Internet :443/:80 → Caddy (TLS, Let’s Encrypt) → fmc-trap:5000 (Gunicorn/Flask)
↓
./data/logs, ./data/downloads (bind mounts)
expose: "5000" dans Compose).