Un atelier de découverte du monde du hacking, en passant par l'utilisation du terminal, de la programmation en Python et un peu de malice.
Installer Oracle VirtualBox sur les postes des participants et copier-coller la VM sur ces postes (voir ressources).
Imprimer un mémo des commandes Bash pour chaque participant.
La capture de drapeau est une compétition de hacking : des équipes de hackeurs, de pirates informatiques, doivent trouver un drapeau (ou flag en anglais) caché sur une machine. Souvent, il s'agit d'un petit fichier avec un code caché à l'intérieur. L'accès au dit fichier est normalement impossible, les participants doivent exploiter des failles de sécurité pour l'atteindre malgré tout. Le drapeau sert de preuve de l'intrusion.
À votre avis, à quoi cela ressemble-t-il ? Commencer par présenter différentes représentations du hacking dans la culture :
Nous allons essayer de pirater un site web, ou en tout cas, l'administrateur d'un certain site web. Attention : ce que nous faisons ici est dans un cadre pédagogique, pour apprendre à utiliser un terminal, faire de la programmation, connaître les bonnes pratiques en termes de sécurité. Tout ce que nous allons faire aujourd'hui se déroulera dans un univers factice. Le piratage réel est un acte illégal !
Les participants lancent la VM et se connectent avec l'utilisateur sherlock:holmes. S'assurer que tous les participants se mettent en plein écran. Décrire l'environnement : distribution de Linux (Debian), on retrouve un explorateur de fichier (l'ouvrir et montrer les dossiers courants) ainsi qu'un navigateur, Firefox. Afficher le site cible : http://cible.ctf.
On dispose également d'un autre outil très puissant, le terminal. Distribuer le pense-bête des commandes Bash. Ouvrir le terminal. Exécuter et décrire le fonctionnement des commandes suivantes :
$ whoami
sherlock
$ cmatrix
^C
$ ls
Bureau Documents Images Téléchargements
$ cd Documents
$ ls
$ mkdir Dossier
$ ls
Dossier
$ cd Dossier
$ touch bonjour.txt
$ ls
bonjour.txt
$ echo "bonjour tout le monde" > bonjour.txt
$ cat bonjour.txt
bonjour tout le monde
$ rm bonjour.txt
$ ls
Faire éventuellement le lien avec l'explorateur de fichiers. Donner un exercice aux participants : écrivez votre prénom dans un fichier, et visualisez-le.
Notre cible est un site internet, à l'adresse http://cible.ctf. Les participants peuvent visualiser ce site dans leur navigateur.
Présenter la page de suivi, avec la première étape. La première chose que l'on fait pour attaquer un site internet, c'est de le scanner pour identifier les points d'entrées. Pour cela, il existe la commande nmap. Exécuter la commande
nmap cible.ctf
Ce que fait cette fonction, c'est de tester tous les ports d'une machine pour voir lesquels sont ouverts. En réseau, un port est un canal sur lequel la machine peut accepter des requêtes, des messages, en provenance de l'extérieur. Si aucun port n'est ouvert, accéder à la machine sera plus difficile, car on ne pourra pas s'y connecter directement.
La commande devrait montrer deux ports ouverts : 22 et 80. À ces deux ports sont associés deux services, ssh et http. Laisser les participants deviner le rôle du service http : il s'agit du serveur web, le logiciel qui gère le blog que l'on voit à l'adresse http://cible.ctf. Le port est ouvert pour pouvoir recevoir les requêtes des clients (« je veux accéder à telle ou telle page ») et y répondre.
Reste le service ssh. Il s'agit d'un logiciel pour pouvoir se connecter à distance à une machine et pouvoir y exécuter des commandes, comme dans un terminal. Une sorte de terminal télécommandé. C'est très pratique, très utilisé, mais très dangereux si on le laisse accessible sur internet, car cela permettra à d'autres personnes de s'y connecter.
Pour essayer, il faut écrire la commande ssh utilisateur@domaine. Essayer de se connecter au compte local :
ssh sherlock@mediatheque
Exécuter les commandes whoami et ls pour voir que l'on a accès à un shell classique, puis sortir en faisant Ctrl+D.
Pour se connecter à distance sur la cible, il faudrait exécuter :
ssh <utilisateur@cible.ctf>
Le problème, c'est que nous ne connaissons pas a priori le nom d'utilisateur de notre cible. Laisser un temps aux participants pour le deviner, et surtout pour s'en assurer. Comment peut-on le tester ? Sur le seul article disponible depuis le blog, on peut voir le nom du webmaster, qui est probablement son nom d'utilisateur. Si on teste avec la commande ssh, au lieu d'une erreur Permission denied, on obtient une invite pour taper le mot de passe : c'est donc le bon nom d'utilisateur.
Pour craquer le mot de passe, quelles sont nos possibilités ? Comme nous ne savons pas grand-chose sur la cible, nous allons essayer la force brute : tester plein de combinaisons possibles, mais pour aller plus vite, pas n'importe lesquelles.
Pour aider les participants, indiquer que le mot de passe de la cible est faible. Qu'est-ce qu'un mot de passe faible ? Plusieurs réponses sont possibles. Nous allons nous concentrer sur le cas des mots de passes courants, avec une attaque par dictionnaire.
Demander aux participants d'aller sur internet et d'essayer de trouver des listes de mots de passes (français) courants. Il en faut beaucoup (plusieurs milliers, voire dizaines de milliers). Guider les participants pour trouver le dépôt GitHub tarrashck/richelieu, qui contient de telles listes. Télécharger la plus longue (20 000 entrées) avec la commande wget (bien penser à prendre la version « Raw ») :
wget https://raw.githubusercontent.com/tarraschk/richelieu/refs/heads/master/french_passwords_top20000.txt
mv french_passwords_top20000.txt liste.txt
cat liste.txt
Tester toutes les combinaisons reste trop long pour le faire à la main. Pour automatiser cela, nous allons le faire avec un script, par exemple en Python.
Avec l'éditeur de texte nano, ouvrir le fichier crack.py à la racine. Expliquer le fonctionnement du code, remplacer les parties nécessaires : le domaine (cible.ctf), le nom d'utilisateur (celui trouvé auparavant), le chemin vers le dictionnaire (ou utiliser la commande cp ou mv pour copier, déplacer ou renommer la liste). Enregistrer les modifications avec Ctrl+O puis Entrée, et sortir avec Ctrl+X. Exécuter le code :
python crack.py
Si les participants rencontrent des difficultés pour récupérer le fichier texte contenant les mots de passe, ils peuvent le copier depuis /opt/ctf/dicts/french_passwords_top20000.txt.
Les participants peuvent désormais se connecter à la machine distante avec le nom d'utilisateur et le mot de passe trouvé.
whoami
ls
Laisser les participants explorer un peu les dossiers, en leur donnant pour consigne de chercher si, dans les documents de l'utilisateur, il y a un fichier avec des informations importantes.
A priori, cette tâche est très fastidieuse. Pour nous aider, nous allons utiliser une commande pour chercher des dossiers ou des fichiers, la commande find.
find ~/Documents -name "a*" # fichiers commençant par a
La question, c'est que chercher ? Là, laisser les participants creuser un peu. En indice, indiquer que l'on cherche des données « secrètes » de l'utilisateur, comme ses mots de passe. Ils peuvent soit tomber dessus par chance, soit trouver la bonne chose à chercher : le fichier se nomme « mot-de-passe-blog.txt ».
find . -name "mot*"
Utiliser la commande cat pour lire le contenu de ce fichier, et trouver le mot de passe d'administration du blog.
Dernière étape, il faut deviner l'adresse d'administration du blog. Le blog semble utiliser la technologie Grav, en recherchant Grav et administration dans un moteur de recherche, on trouve l'adresse http://cible.ctf/admin/ (on peut également la deviner). Laisser les participants se connecter avec l'identifiant connu et le nouveau mot de passe.
S'il reste du temps, montrer qu'avec l'accès à l'interface d'administration du blog, on peut éditer des pages, publier du contenu, etc. ce qui serait très dangereux dans la vraie vie.
Laisser les participants fouiller l'interface d'administration avec pour consigne essayer de trouver un maximum d'informations sur notre cible, sur l'utilisateur. Si les participants pêchent, leur indiquer que l'on cherche son mail. Le mail du compte est visible dans l'onglet « Comptes » de l'interface d'administration.
Laisser les participants essayer de se connecter par eux-mêmes sur le webmail : ils doivent deviner l'adresse du site (http://email.ctf) et le mot de passe (identique au mot de passe du blog : réutiliser le même mot de passe plusieurs fois est une très mauvaise pratique !). En cas de difficulté, donner l'adresse du site.
Dans le webmail, laisser les participants chercher le « drapeau ». Ils peuvent pour cela utiliser la barre de recherche. Dès qu'ils trouvent, c'est gagné !
Offrir un goûter aux participants.
Révéler la facticité de la machine, en appuyant sur l'illégalité d'un piratage réel :
ls /home aurait permis de tout trouver sur la machineless, le fichier /opt/ctf/ssh.py : il s'agit du script Python implémentant un faux serveur SSH. Un véritable serveur implémente des mécanismes de sécurité qui ne nous auraient pas permis de faire ce que l'on a fait.Réfléchir aux façons de protéger ce système. Quelle(s) mesure(s) aurait pu nous empêcher de parvenir à nos fins ?
[1] https://www.franceinfo.fr/replay-radio/l-il-de-constance/une-hackeuse-fait-tomber-un-tinder-pour-nazis-et-revele-l-ampleur-des-reseaux-supremacistes_7723345.html
La machine virtuelle est une machine Debian. Contactez-nous pour en obtenir une copie (pour VirtualBox) ou retrouvez les instructions d'installations et les scripts sur GitHub, ychalier-rlv/ctf.