Protéger votre routeur cisco – hashcat mask – Part1

février 24, 2015

Chaque année sort le fameux sondage un peu miteux « des mots de passe les plus fréquemment utilisés ». Même si ce genre d’articles consternant ne nous apprend pas grand chose (mise à part que le king des mots de passe  : « 123456 » reste au top du palmarès avec 87 % d’utilisation sur un panel de 3.3 millions de mots de passe..) ( à qd même !), il est surtout l’occasion de rappeler qu’un bon mot de passe peut parfois être bien pire. oui oui :)

Sorti il y a à peine quelques jours, la nouvelle monture du célèbre password recovery tool Hashcat 0.49 (ainsi que de son double démoniaque utilisant les GPU des cartes graphiques,  oclhashcat 1.32) annonce désormais la possibilité de recouvrir notamment plus de 90 hashages d’algorithmes d’encryptions différentes, (Oui Monsieur, rien que ça !). Mais force est de reconnaitre, qu’en plus d’être totalement gratuit, hashcat est devenu la véritable référence en terme de  brute force, toutes plateformes confondues. Rapide (même EXTREMEMENT rapide pour les possesseurs de cartes graphiques avec un GPU qui arrache tout), il impressionne par sa souplesse d’utilisation et sa redoutable efficacité.

Dans le cadre de mes activités (il m’arrive de travailler un peu) et pour des raisons qui resteront confidentielles, j’ai dû récupérer le fichier de configuration d’un routeur cisco 1800 (series 18xx) au format texte, en ressortir le mot de passe «  »oublié » » par l’administrateur, l’auditer, et modifier la configuration afin de la sécuriser si possible.

Bref me voila avec du pain sur la planche, moi qui pensait passer une après-midi bien peinard, c’est loupé.

Dans un premier temps, je vais m’atteler à la récupération du mot de passe et ensuite je pourrais, à ma guise, modifier la configuration du routeur.  Pas de chance pour moi, le king « 123456 » ne semble malheureusement pas fonctionner ici :)

Quelques soit le type de matériel Cisco que vous utilisez, la protection du mot de passe d’accès et de configuration (mode enable) est indiquée de la sorte dans votre configuration :

soit :

De mon côté, le fichier de configuration du routeur Cisco 1801 comporte la ligne suivante concernant mon password :

enable secret 5 $x$xxxx$xxxxxxxxxxxxxxxxxxxxx.

Me voici donc confronté à un password sous forme de hash (MD5), le fameux Cisco Password type 5. L’algorithme Message Digest 5 est une fonction de hachage cryptographique inventé en 1991 et permettant d’obtenir l’empreinte numérique d’un fichier.

MD5 permet donc, à partir d’un simple fichier numérique d’en créer son empreinte numérique, informatiquement appelé checksum et se résumant en une séquence de 128 bits ou 32 caractères en notation hexadécimale. Sous unix, la commande md5sum nous permet de visualiser checksum sur les fichiers :

hashcat1.1

En changeant même un seul caractère de notre ‘petitfichier’,  cela modifiera la valeur de notre hash, c’est ce que l’on appel « l’effet d’avalanche ». Prenons l’exemple de deux fichiers identiques à un caractère prêt. D’un coté une lettre en minuscule, de l’autre en majuscule. La différence d’un simple bit conduit à un avalanche de changements :

hashcat1.2

Analysons de plus prés la différence :

Je précise tout de même qu’un hash n’est pas une encryption, il s’agit d’un « résumé ». La confusion est souvent faite car les hashes font partie du vocabulaire de la cryptographie. L’encryption transforme des données claires en données cryptées et inversement avec les clés qui vont bien. Le hash compile un flot de données en un petit résumé. C’est une opération à sens unique (normalement :) ). Cette vérité est vraie pour tout type de hash qu’il soit MD5, SHA…

Dans notre cas précis, MD5 a été utilisé pour calculer l’empreinte du mot de passe avec la présence d’un sel (permettant logiquement de ralentir une attaque par force brute). Bien souvent, le sel est compris entre deux $. Ainsi, plutôt que de stocker en clair les mots de passe dans un fichier, ce sont leurs empreintes MD5 qui sont enregistrées, de sorte que quelqu’un qui lirait ce fichier, ne pourrait pas découvrir les mots de passe

haschcat1.4

 

En 1996, une faille importante est découverte et indique que MD5 devrait être mis de côté au profit de fonctions plus robustes comme SHA-256. Cette faille a été qualifiée de grave, du fait même qu’elle démontre la possibilité de créer des collisions à la demande. Avec le terme collision ici, je sous-entends une situation dans laquelle deux données ont un résultat identique avec la même fonction de hashage. Les collisions sont inévitables, dès lors que l’ensemble de départ (données fournies) de la fonction de hachage est un cardinal strictement supérieur à l’ensemble d’arrivée (empreintes). Je fais référence ici, au principe mathématique des fameux tiroirs de Dirichlet, pour résumer schématiquement :

Si n tiroirs sont occupés par n + 1 objets alors, il y a au moins un tiroir occupé par plus d’un objet, et pourtant un hash de 128bits, peut avoir : 3,4 x  10^38 possibilités, ce qui représente tout de même 340 282 366 920 938 463 463 374 607 431 768 211 456 hashes  possible !

En 2004 une équipe de chercheurs chinois ont définitivement démoli md5 en trouvant le moyen de générer des collisions bien plus rapidement qu’en utilisant le brute force, mais cela est une autre histoire et nous nous égarons de notre sujet. Si vous êtes intéressé par les collisions MD5, je vous recommande vivement de lire l’article sur cette page  détaillant les techniques mathématique de Wang et de Yu’s.

Ecrit en 2009, Hashcat, est arrivé tel un véritable obus dans la marre en étant l’un des premiers ‘password recovery tool’ a supporté le MPI , c’est à dire les ordinateurs multiprocesseurs (multihread) et utilisant différents type de scenario d’attaque en plus du traditionnel brute force comme peux le faire John the ripper.

j’ai réalisé mes tests sur Kali, j’ai simplement procédé à un :

Hashcat dispose d’une multitude de fonctions d’attaques :

Dictionary attack : Ici rien de spécial il s’agit d’un attaque classique par ‘wordlist’
Combinator attack : Chaque mot du dictionnaire est annexé, et peut être annexé a un autre dico.
Permutation attack : Chaque mot du dictionnaire génère des permutations de lui même.
Toggle-Case attack : Pour chaque mot du dico, toutes les combinaisons possible majuscules et minuscules sont générés
Rule-based attack : Plus complexe que les précédentes, permet de générer des passwords à la volé suivant les fonctions choisis (minuscule, majuscule, taille.. )
Table-Lookup attack : Prends un mot du dictionnaire, et génère des mots avec chacun des caractères du mot.
Mask attack : Essai toute les combinaisons , un peu comme un brute force classique, mais de manière plus spécifique avec la possibilité d’indiquer les morceaux de mot de passe par exemple ou d’autre informations permettant de réduire le temps de recherche. C’est sur cette dernière option que j’ai basé mes recherches.

Afin de rendre l’étude un minimum intéressante, je vais faire mes tentatives de brute force, enfin je devrais plutôt dire « d’attaque par masque » sur CPU, et GPU. Je dispose d’un processeur intel i5 (qui n’est clairement pas de première jeunesse, mais pas non plus trop à la ramasse) et d’une carte graphique Nvidia GTX 970 (merci papa noël, alias ma chérie si tu lis ces lignes). En terme de temps de calcul, le GPU devrait allégrement exploser mon CPU. L’avantage du mask attack, en comparaison a un brute force traditionnel, c’est le flot d’option que l’on a a notre disposition afin de maximiser le calcul. En relisant cette phrase je me rend compte qu’elle n’est par particulièrement compréhensible. Le mieux étant de prendre un exemple concret.

La syntax d’Hashcat est relativement simple pour un usage basique :  hashcat –choix_de_l_attaquetype_de_hash le_hash mot_de_passe_probable

le choix de l’attaque fait référence ici à ce dont j’ai parlé un peu plus haut :

le type de hash : (je ne vais pas lister ici les 90 algos)

le fichier contenant notre hash a craquer

Et le meilleur pour la fin: le mot de passe probable selon vous. Quelques explications s’impose :

Avec hashcat vous avez la possibilité de créer des jeux de caractères à tester. Par exemple si vous pensez que le mot de passe ne contient que des minuscules ou que des chiffres, vous pouvez le spécifier, absolument tout est paramétrable ! Par défaut hashcat est fourni avec quelques sets prêt à l’emploi :

Donc en gros: Si je pense que le mot de passe est de 6 caractères en minuscule cela donnera  : ?l?l?l?l?l?l ou si je pense qu’en fait le mot de passe est composé de 5 caractères aléatoire (minuscule, majuscule, la totale) et de 2 caractères alphanumériques à la fin : ?a?a?a?a?a?d?d  huuuumm easy non ? :-) Hashcat nous donne même la possibilité de créer nos propre sets !  :) imaginons que je veuille tester toute les minuscules et tous les chiffres : dans la ligne de commande je rajoute simplement :

C’est d’ailleurs par cette ligne de commande que je vais commencer. Concrètement, je ne connais absolument pas le mot de passe qui a pu être indiqué sur ce routeur, ni même sa longueur (c’est à dire son nombre de caractères) et encore moins si il s’agit de majuscules, minuscules, chiffres .. etc.

Pour commencer je lance donc hascat CPU version 0.49 avec la ligne de commande indiquée plus haut. Une fois la commande lancée, il n’y a plus qu’à croiser les doigts et patienter, c’est le moment d’aller faire un tour, de se vautrer devant la tv et de prendre un petit canada dry bien frais (dans l’ordre que vous voulez), le calcul pouvant duré de quelques minutes à plusieurs heures/jours.

Voici le résultat de mask attack avec mon CPU un vieillot intel I5 et la durée de calcul s’en ressent.

hashcat_ciscomd5_cpu

(j’ai volontairement caché le résultat sur cette capture d’écran, mais chez vous une ligne indiquant le résultat du hash recover devrait être bien visible).

9h ! Hashcat à mis 9 (longues) heures pour découvrir le hash MD5(salt) de mon routeur cisco. Durant ces 9H , hashcat a effectué toutes les combinaisons possible (minuscules et chiffres..) pour retrouver un  password composé finalement de 6 caractères totalement aléatoires.

Tentons cette fois la même manœuvre mais avec la version GPU OCLhashcat 1.32 (CUDA) sur ma carte Nvidia GTX 970 4go de ram.

hashcat_ciscomd5_gpu

(encore une fois ici, j’ai volontairement caché le résultat sur cette capture d’écran, mais chez vous une ligne indiquant le résultat du hash recover devrait être bien visible)

Bordel ! Miséricorde !! 4 mins !!! blasant, navrant, affligeant, stupéfiant, extraordinaire, 4mins  et 35 secondes pour 6 putains de caractères minuscules + chiffres !  En simplement 4 petites minutes, la version GPU d’hashcat a démoli un mot de passe MD5(salt) cisco de 6 caractères !

La puissance d’oclhashcat fait véritablement froid dans la dos. Il existe d’ailleurs de véritables records du monde basés sur 8 cartes graphiques ayant un GPU monstrueux :

hashcatcluster

=> plus d’info sur github pour l’impressionnant benchmark de ce monstre composé de 8 carte nvidia GTX 980  de 6go de ram. (77 billion MD5’s par seconde, oui Monsieur !). Certains sites proposent même d’en acheter des tout fait pour la modique somme de 18,499 USD.

Mais comment faire, me direz vous pour sécuriser son mot de passe face à une tel artillerie ? Pas facile je l’avoue. Mais retenez une chose simple, oubliez les traditionnels mot de passe aléatoires composés de 8 ou 10 caractères, désormais un véritable mot de passe ‘valable’ doit être constitué d’un mélange de (au moins) 16 caractères, on parle alors de ‘passphrase‘. Je vous recommande d’ailleurs de lire l’article de l’ANSSI à ce sujet.

Voila donc une première étape de passée, le password est craqué (victoire!), je vais donc pourvoir prendre la main en mode enable sur la configuration du routeur cisco 1800. Reste maintenant auditer cette configuration et à la sécuriser, mais cela fera l’objet d’un second articles très prochainement promis .

En attendant je vous souhaites d’excellent vacance et bon hashcat à tous.