
Cet article traite essentiellement de la sécurité de nos mots de passe, des techniques pour les tester et des erreurs à ne pas commettre.
1. Installation de John The Ripper
John The Ripper est un logiciel libre spécialisé dans le cassage de mots de passe en tout genre. On va pouvoir l'installer simplement via la commande suivante :
yum install john
2. Utilisation
On créé un nouvel utilisateur sur notre système pour le test, qui se nommera toto :
adduser toto
On lui attribut un password, 'pass12' par exemple :
passwd toto
On récupère son mot de passe crypté depuis le fichier /etc/shadow :
cat /etc/shadow | grep toto > /tmp/john.tmp
On lance john pour qu'il trouve le password :
john /tmp/john.tmp
Ici, il aura fallu pas moins de 3 minutes 27 secondes à John pour trouver la solution :
Loaded 1 password hash (FreeBSD MD5 [32/32])
pass12 (toto)
guesses: 1 time: 0:00:03:27 (3) c/s: 5850 trying: pass12
Cette méthode fonctionne aussi pour les mots de passe codés en Traditional DES, utilisés dans les fichiers .htpasswd par exemple :
[root@localhost ~]# htpasswd -cb /tmp/john.tmp toto pass12
Adding password for user toto
[root@localhost ~]# john /tmp/john.tmp
Loaded 1 password hash (Traditional DES [24/32 4K])
pass12 (toto)
guesses: 1 time: 0:00:00:08 (3) c/s: 149111 trying: ph34321 - pastin
On pourra aussi utiliser un dictionnaire de mots, afin de trouver le mot de passe plus rapidement. Cette méthode consiste à tester une liste de mots prédéfinis dans un fichier texte :
john --wordlist=/usr/share/dict/words /tmp/john.tmp
Au passage, on notera que lorsque le décodage est long, on peut appuyer à tout moment sur le touche entrée, afin de voir ou en est le logiciel.
3. Les tables de hashages
Les hashs, contrairement au cryptage, sont des techniques permettant de crypter un message qui ne pourra être décrypté. Le logiciel john n'est donc pas capable de crypter des mots de passe étant "hashés".
Cela n'arrêtera pas des personnes mal intentionnées pour autant. En effet, il existe des techniques pour en venir à bout. On pourra prendre l'exemple des attaques par dictionnaire, qui consiste à crypter une liste de mots afin de les comparer au mot de passe illisible à l'oeil nu.
J'ai implémenté cette idée à l'aide d'un petit script php disponible ici : generer-cryptage.zip
Imaginons que j'arrive à récupérer le hash md5 suivant :
f71dbe52628a3f83a77ab494817525c6
Exemple d'utilisation du script :
[root@localhost ~]# unzip generer-cryptage.zip
[root@localhost ~]# php generer-cryptage.php > /tmp/maliste
[root@localhost ~]# cat /tmp/maliste | grep f71dbe526
toto:hash_md5:f71dbe52628a3f83a77ab494817525c6
Un autre exemple, sera l'attaque par brute force. Dave Hope a écrit un petit programme en c permettant d'utiliser cette méthode. Le code source est disponible ici : md5force.c.
Exemple d'utilisation :
[root@localhost ~]# yum install openssl-devel
[root@localhost ~]# gcc -lssl -o md5force md5force.c
[root@localhost ~]# ./md5force to f71dbe52628a3f83a77ab494817525c6 4
Found: toto <==> f71dbe52628a3f83a77ab494817525c6
On pourra également générer des hashs avec beaucoup plus de caractères :
./md5force 0123456789abcdefghijklmnopqrstuvwxyz. f71dbe52628a3f83a77ab494817525c6 6
Ici, l'exploitation de ces méthodes reste assez limitées. Mais depuis quelques temps, on voit apparaître des sites spécialisés dans la constitution de bases de données contenant plusieurs milliers de hashs, comme ce site web par exemple :
shm.hard-core.pl
4. Les erreurs à éviter
Citation : For example, if the login name is "abc", then "abc", "cba", and "abcabc" are excellent candidates for passwords. [Grampp and Morris, "UNIX Operating System Security"]
Cette citation nous montre que dans la plupart des cas, l'utilisateur utilisera son login pour construire son mot de passe. J'ai donc codé un petit programme en c, qui respecte les contraintes de cette citation, afin de voir le résultat. Le code source de ce dernier est disponible ici : devine-password.c.
Exemple d'utilisation du programme :
[root@localhost shell]# gcc -o devine-password devine-password.c
[root@localhost shell]# ./devine-password
Veuillez saisir le login (max 128 caracteres) : john
Liste de mot de passe possible :
john
nhoj
johnjohn
johnnhoj
nhojjohn
John
Nhoj
JohnJohn
JohnNhoj
NhojJohn
La création d'un mot de passe à partir de son login est donc très fortement déconseillée.
On devra également éviter le mot de passe composé que de chiffres. En effet, leur décodage est très rapide. Pour le démonter, j'ai écrit un autre programme en c, qui est capable de générer une liste de nombres en fonction des paramètres qu'on lui donne. Ce dernier est disponible ici : generer-nombre.c.
Attribution du mot de passe '1234567' à toto et recopiage de la chaîne cryptée dans le fichier temporaire :
passwd toto
cat /etc/shadow | grep toto > /tmp/john.tmp
Exemple d'utilisation du programme, ici on génère une liste de chiffres allant de 0 à 9999999 :
gcc -o generer-nombre generer-nombre.c
./generer-nombre -d 0 -f 9999999 > /tmp/liste-nombre.tmp
Il ne reste plus qu'à lancer le décodage via john, en lui précisant de charger la liste de nombre :
[root@localhost ~]# john --wordlist=/tmp/liste-nombre.tmp /tmp/john.tmp
Loaded 1 password hash (FreeBSD MD5 [32/32])
1234567 (toto)
guesses: 1 time: 0:00:04:21 100% c/s: 4716 trying: 1234567
5. Les solutions
Une solution pour parer toutes ces techniques, est donc d'utiliser un mot de passe long comportant une multitude de caractères différents.
On devra également multiplier le nombre de mots de passe. En effet, utiliser le même et unique mot de passe pour protéger toutes ces données est fortement déconseillé. Des logiciels comme Revelation sous linux, permettent de les générer et vous enlèvent le souci de les retenir.
Site officiel de John : www.openwall.com/john/
Estimation de durée : www.lockdown.co.uk
John The ripper vu par Titax : blog.titax.fr
Billet original sur Tux-planet