Cet article est complètement inspiré du billet de Jeremy Stretch : A bit more detail on IOS password hashes. Merci à lui.

Les mots de passe "type 7" utilisé dans les vieux IOS sont facilement réversibles. Ainsi l’utilisation de type 5 est préférable car il génère un hash MD5 non réversible. Cependant, l’utilisation du MD5 n’est pas son seul avantage.

L’utilisation d’un mot de passé stocké avec à l’aide de MD5 se fait en utilisant simplement la commande secret à la place de password.

Router(config)# username foo secret MyP4ssw0rd
Router(config)# do sh run | include username         
username foo secret 5 $1$jR5i$.HDBuKq.wIDOn2EYpCPYc0

Dans l’exemple précédent, ce qui suit le 5 est calculé par le routeur et stocké dans la running config. Ceci est plus qu’un simple hash md5, en effet la méthode reprend ce qui est fréquemment utilisé dans les environnements UNIX, à savoir l’utilisation d’un salt. Le résultat est composé de 3 éléments séparés par le signe dollar ($) :

  • 1 – indique un hash utilisant un salt
  • jR5i – salt de 24-bit généré aléatoirement
  • .HDBuKq.wIDOn2EYpCPYc0 – le hash MD5

Le hash et le salt sont des valeurs binaires utilisant le format d’encodage Base64. Quand l’utilisateur foo souhaite s’authentifier, le mot de passe envoyé en clair par l’utilisateur est concaténé avec le salt de 24-bit stocké dans le fichier de configuration. Un hash MD5 est alors calculé avec la chaine entière salt+password; si le hash calculé correspond au 3è élément stocké dans la configuration, le mot de passé fourni est alors considéré comme valide.

L’utilisation de ce salt a 2 gros bénéfices. Tout d’abord, 2 utilisateurs ayant choisi le même mot de passe auront virtuellement 2 hashs différent. Considérons la création de l’utilisateur bar avec le même mot de passé que l’utilisateur foo créé précédemment, voici le résultat:

Router(config)# user bar secret MyP4ssw0rd
Router(config)# do sh run | include username       
username foo secret 5 $1$jR5i$.HDBuKq.wIDOn2EYpCPYc0
username bar secret 5 $1$P9XX$y9d6Aw.t81.CoKvXITCpZ/

Les 2 utilisateurs vont pouvoir s’authentifier avec le même mot de passe : cependant lors de la création des utilisateurs, les 2 salts générés aléatoirement ont permis de supprimer toute similitude entre les hash stocké dans le fichier de config.

Le second avantage, et non le moindre, est que ce salt permet de se prémunir des attaques de type Rainbow Table. En cryptologie, une table arc-en-ciel (aussi appelée Rainbow Table) est une structure de données qui permet de retrouver un mot de passe à partir de son empreinte. Ce sont de grosse tables contenant des hash (MD5 et autres) précalculées. Cela permet de retrouver très rapidement le mot de passe qui a donné un hash précis.

Pour information, les systèmes UNIX-like utilisent la même technique pour stocker les comptes locaux (le salt étant simplement un peu plus long). L’outil OpenSSL permet de simuler l’opération réalisé par l’IOS Cisco. Voici un exemple pour l’utilisateur foo, nous pouvons retrouver le même hash avec OpenSSL :

fred@Sandbox$ openssl passwd -1 -salt jR5i MyP4ssw0rd
$1$jR5i$.HDBuKq.wIDOn2EYpCPYc0

Liens