Hackez le Hacker - Comment Configurer un Honeypot SSH

Découvrez comment configurer un honeypot SSH pour détecter et analyser en temps réel les cyberattaques. Apprenez à paramétrer un faux serveur SSH qui enregistre les identifiants et IP des attaquants, renforçant votre veille et votre sécurité.

Hack the Hacker - How to Setup an SSH Honeypot

Qu’est-ce qu’un Honeypot :

Un honeypot détecte et enregistre les attaques lorsqu’un attaquant tente de pénétrer dans un système.

Le honeypot dont nous parlerons ici est un honeypot SSH.

Préphase

Cet article fait suite à celui que j’ai publié à propos de l’exécution d’un Honeypot SSH pendant 30 jours en conditions réelles, l’article a fait du bruit et j’ai reçu beaucoup de messages demandant comment j’ai configuré et mis en place ce Honeypot SSH.

L’article précédent :

Hack the Hacker - How to Setup an SSH Honeypot

Sofiane’s Blog - Ce que vous obtenez après avoir fait tourner un Honeypot SSH pendant 30 jours

r/CyberSecurity Reddit

YCombinator Hacker News

Prérequis

Nous allons configurer ceci sur un VPS classique sans aucune pré-configuration spécifique.

Important

Cette configuration est destinée à la recherche et aux tests, merci de ne pas la mettre en place sur votre réseau local ou réseau d’usage personnel/professionnel.

VPS

C’est à vous de choisir et de trouver le fournisseur VPS qui vous convient le mieux.

Honeypot Cowrie

Il existe plusieurs honeypots SSH connus, mais celui que nous allons utiliser s’appelle Cowrie.

C’est une version améliorée du célèbre honeypot appelé Kippo.

Hack the Hacker - How to Setup an SSH Honeypot

Docker

Pour cette installation, nous utiliserons l’image Docker de Cowrie.

Pour cela, il vous faudra docker installé sur le nouveau VPS, vous pouvez consulter la Documentation Officielle Docker pour l’installer.

Hack the Hacker - How to Setup an SSH Honeypot

Paquets à installer

  • python3
  • wget

Configuration

Je change généralement le port SSH par défaut sur mes serveurs ou machines.

Une méthode que je préfère est de définir le vrai port SSH sur quelque chose comme 2022. Ensuite, je configure le honeypot pour écouter sur le port SSH par défaut, le 22.

Installation

Par défaut, Cowrie est configuré pour écouter le port 2222. Nous allons mapper ce port dans le conteneur Docker vers le port 22 de notre hôte. Cette configuration nous permet de rediriger tous les bots et attaquants qui scannent vers notre honeypot de manière transparente.

Hack the Hacker - How to Setup an SSH Honeypot

Création, configuration et utilisation de l’utilisateur cowrie :

> sudo adduser --disabled-password cowrie #Ajout de l'utilisateur
Adding user 'cowrie' ...
Adding new group 'cowrie' (1002) ...
Adding new user 'cowrie' (1002) with group 'cowrie' ...
Changing the user information for cowrie
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]

> sudo usermod -aG docker cowrie #Ajout de cowrie au groupe docker

> sudo su - cowrie #Passage en utilisateur cowrie

Avant de continuer, nous allons d’abord créer des dossiers dans les répertoires de notre VPS pour y stocker tous les logs, pour qu’ils soient accessibles directement et non pas seulement à l’intérieur du conteneur.

Ensuite, nous allons configurer les dossiers “cowrielog” & “cowrietty” avec des permissions lecture-écriture pour tous.

> mkdir cowrielog && mkdir cowrietty
> chmod -R a+rw cowrielog/ cowrietty/

Et nous démarrons notre Honeypot Cowrie :

> docker run --name cowrie -p 22:2222 -v /home/cowrie/cowrielog:/cowrie/cowrie-git/var/log/cowrie/ -v /home/cowrie/cowrietty:/cowrie/cowrie-git/var/lib/cowrie/tty cowrie/cowrie:latest
2024-06-17T14:47:28+0000 [-] Python Version 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0]
2024-06-17T14:47:28+0000 [-] Twisted Version 24.3.0
2024-06-17T14:47:28+0000 [-] Cowrie Version 2.5.0
2024-06-17T14:47:28+0000 [-] Loaded output engine: jsonlog
2024-06-17T14:47:28+0000 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 24.3.0 (/cowrie/cowrie-env/bin/python3 3.11.2) starting up.
2024-06-17T14:47:28+0000 [twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: twisted.internet.epollreactor.EPollReactor.
2024-06-17T14:47:28+0000 [-] CowrieSSHFactory starting on 2222
2024-06-17T14:47:28+0000 [cowrie.ssh.factory.CowrieSSHFactory#info] Starting factory <cowrie.ssh.factory.CowrieSSHFactory object at 0x7c4c73951b10>
2024-06-17T14:47:28+0000 [-] Generating new RSA keypair...
2024-06-17T14:47:28+0000 [-] Generating new ECDSA keypair...
2024-06-17T14:47:28+0000 [-] Generating new ed25519 keypair...
2024-06-17T14:47:28+0000 [-] Ready to accept SSH connections

Analyse des logs

Le fichier de log se trouve dans ~/cowrielog, et les logs de replay tty dans ~/cowrietty

Utilisation des commandes Linux

Pour filtrer et organiser les sorties, vous pouvez utiliser la commande jq. Cet outil permet d’extraire précisément les informations dont vous avez besoin à partir de données JSON.

L’utilisation de JSON pour les fichiers de logs offre des avantages significatifs en termes de structure, lisibilité, gestion, résilience, et observabilité. Ces bénéfices font de JSON un choix idéal pour la journalisation dans le développement logiciel moderne et les pratiques opérationnelles.

Pour obtenir toutes les tentatives de connexion :

> jq '.| select(.eventid | startswith("cowrie.login"))' cowrie.json

Exemple de sortie :

{
  "eventid": "cowrie.login.failed",
  "username": "tserver",
  "password": "tserver",
  "message": "tentative de connexion [tserver/tserver] échouée",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:56:07.547278Z",
  "src_ip": "59.24.160.227",
  "session": "6530ab02251d"
}
{
  "eventid": "cowrie.login.failed",
  "username": "student02",
  "password": "student02",
  "message": "tentative de connexion [student02/student02] échouée",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:56:12.223248Z",
  "src_ip": "59.24.160.227",
  "session": "56b69171281c"
}
{
  "eventid": "cowrie.login.failed",
  "username": "vyos",
  "password": "vyos",
  "message": "tentative de connexion [vyos/vyos] échouée",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:56:16.560385Z",
  "src_ip": "59.24.160.227",
  "session": "c0fcc16bedfc"
}

Pour obtenir toutes les tentatives de connexion réussies :

> jq '. | select(.eventid == "cowrie.login.success")' cowrie.json

Exemple de sortie :

{
  "eventid": "cowrie.login.success",
  "username": "root",
  "password": "Passw0rd",
  "message": "tentative de connexion [root/Passw0rd] réussie",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:53:39.274245Z",
  "src_ip": "141.98.10.106",
  "session": "d5c5f7b97455"
}

Pour obtenir toutes les tentatives de connexion échouées :

> jq '. | select(.eventid == "cowrie.login.failed")' cowrie.json

Exemple de sortie :

{
  "eventid": "cowrie.login.failed",
  "username": "vsftp",
  "password": "vsftp",
  "message": "tentative de connexion [vsftp/vsftp] échouée",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:55:55.663982Z",
  "src_ip": "59.24.160.227",
  "session": "164c6534c698"
}
{
  "eventid": "cowrie.login.failed",
  "username": "yangjie",
  "password": "yangjie",
  "message": "tentative de connexion [yangjie/yangjie] échouée",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:55:59.626399Z",
  "src_ip": "59.24.160.227",
  "session": "809749c9eba7"
}
{
  "eventid": "cowrie.login.failed",
  "username": "pedro",
  "password": "pedro",
  "message": "tentative de connexion [pedro/pedro] échouée",
  "sensor": "8caf2d7e4943",
  "timestamp": "2024-06-17T14:56:03.966702Z",
  "src_ip": "59.24.160.227",
  "session": "b9bee41ed3d2"
}

Pour obtenir le nombre de tentatives de connexion :

> cat cowrie.json| grep "cowrie.login" | wc -l

12419

Pour obtenir le nombre de tentatives de connexion réussies :

> cat cowrie.json| grep "cowrie.login.success" | wc -l

379

Pour obtenir le nombre de tentatives de connexion échouées :

> cat cowrie.json| grep "cowrie.login.failed" | wc -l

12040

Pour obtenir les adresses IP source :

> jq '.src_ip' cowrie.json

"141.98.10.106"
"141.98.10.106"
"141.98.10.106"
"141.98.10.106"
"59.24.160.227"
"59.24.160.227"
"59.24.160.227"
"59.24.160.227"
"59.24.160.227"
"59.24.160.227"

Vérification des commandes exécutées

En filtrant le fichier de log

> jq '. | select(.eventid == "cowrie.command.input")' cowrie.json

Exemple de sortie :

{
  "eventid": "cowrie.command.input",
  "input": "cd ~; chattr -ia .ssh; lockr -ia .ssh",
  "message": "CMD : cd ~; chattr -ia .ssh; lockr -ia .ssh",
  "sensor": "2c091cd328dc",
  "timestamp": "2024-06-18T00:38:20.746663Z",
  "src_ip": "121.156.118.253",
  "session": "22e1e1e98a94"
}
{
  "eventid": "cowrie.command.input",
  "input": "cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
  "message": "CMD : cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
  "sensor": "2c091cd328dc",
  "timestamp": "2024-06-18T00:38:21.702641Z",
  "src_ip": "121.156.118.253",
  "session": "22e1e1e98a94"
}
{
  "eventid": "cowrie.command.input",
  "input": "cd ~; chattr -ia .ssh; lockr -ia .ssh",
  "message": "CMD : cd ~; chattr -ia .ssh; lockr -ia .ssh",
  "sensor": "2c091cd328dc",
  "timestamp": "2024-06-18T00:40:21.541909Z",
  "src_ip": "95.85.47.10",
  "session": "020967259efb"
}
{
  "eventid": "cowrie.command.input",
  "input": "cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
  "message": "CMD : cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
  "sensor": "2c091cd328dc",
  "timestamp": "2024-06-18T00:40:21.676392Z",
  "src_ip": "95.85.47.10",
  "session": "020967259efb"
}
{
  "eventid": "cowrie.command.input",
  "input": "cd ~; chattr -ia .ssh; lockr -ia .ssh",
  "message": "CMD : cd ~; chattr -ia .ssh; lockr -ia .ssh",
  "sensor": "2c091cd328dc",
  "timestamp": "2024-06-18T00:41:28.715153Z",
  "src_ip": "101.32.128.77",
  "session": "31d76f7f481c"
}
{
  "eventid": "cowrie.command.input",
  "input": "cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
  "message": "CMD : cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
  "sensor": "2c091cd328dc",
  "timestamp": "2024-06-18T00:41:29.412566Z",
  "src_ip": "101.32.128.77",
  "session": "31d76f7f481c"
}

En utilisant le playlog de Cowrie pour rejouer les sessions

Avec playlog, vous obtenez une relecture de la session tty et des commandes qui y ont été exécutées.

> cd ~/cowrietty && wget https://raw.githubusercontent.com/cowrie/cowrie/master/src/cowrie/scripts/playlog.py

> python3 playlog.py <ID DE SESSION>

Hack the Hacker - How to Setup an SSH Honeypot

Exemple d’entrée et sortie :

> python3 playlog.py cc1eb03e9b5926d8076e25826664a04400de854bf5cc660fa35eb86cbdf7dc0f

cd ~ && rm -rf .ssh && mkdir .ssh && echo "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~

Approfondir ?

Vous pouvez configurer Cowrie avec des outils de surveillance de logs, vous trouverez la configuration et l’installation dans la Documentation Officielle Cowrie

Obtenir des analyses IA sur cet article

I just do cybersecurity stuff.

Discussion

Laisser un commentaire

Les commentaires des invités seront examinés avant d'apparaître sur le site.

Aucun commentaire pour le moment. Soyez le premier à commencer la discussion !

Suggestions ou signaler un bug ? Contactez-nous !