Chiffrement des mots de passe Netscreen (1/3) - Un peu d'observation

Thu 03 January 2008 by JB

Ce document présente la méthodologie qui nous a permis d'analyser le format de stockage des mots de passe des utilisateurs de NetScreen, solution de gestion unifiée des menaces développée par Juniper Networks. Une étude préliminaire a été faite par observation du format des mots de passe. Elle n'a pas permis de comprendre en totalité les algorithmes utilisés pour encoder le mot de passe. Une autre phase a été nécessaire : la ROM du boîtier a été désassemblée. Cela a permis finalement d'écrire un programme permettant de casser les mots de passe utilisés.

Un peu d'observation

Les mots de passe des utilisateurs peuvent être ajoutés ou modifiés via le serveur Web du boîtier. Toute la configuration peut se faire via ce serveur, ou encore par telnet ou ssh.

Les identifiants sont modifiés à l'aide d'un formulaire. Deux variables, admin_id et admin_pw, entrées par l'utilisateur, sont converties en base 64 puis envoyées en POST au serveur lors du changement de mot de passe. Ces deux variables sont tronquées à 31 caractères.

Le fichier de configuration est mis à jour. Par exemple, si on crée un administrateur Netscreen ayant comme mot de passe netscreen (c'est en fait la combinaison login / mot de passe par défaut), on trouvera la ligne suivante dans le fichier de configuration :

set admin name "netscreen"  password "nKVUM2rwMUzPcrkG5sWIHdCtqkAibn"

Le nom d'utilisateur, en clair, est converti en minuscules. En revanche les manipulations effectuées sur le mot de passe sont assez obscures. Il semble que l'encodage soit du base 64. Plusieurs combinaisons ont été générées pour comprendre ces manipulations.

netscreen/netscreen:  nKVUM2 rwMUzP crkG5 sWIHdC tqkAib n
netscreen/netscreem:  nC4oMx rsCJ0H cTECW sdL7DI tlnGhZ n
netscreen/c:          nJBHPi r3M3gA c99Jn soNsQA tGsNAv n
netscreen/1:          nKeZGv rkNDkP cAPBm sCA4HO tH7GS7 n
admin/1:              nBh0Cc ruF3NP cAwGH sFGK7O t0lIEa n
bdmin/1:              nPITES rEOxiO c3ACI sXHvgD t8WPhc n
admin/2               nMHsCe r+FbTO cStIm sxLtwJ tFbOgY n
admin/admin:          nH/vDi rbE5GB cjdGo slAEBB tHFA6E n

On déduit aisément que :

  • le jeu de caractères utilisés semble bien être base 64. Les seuls caractères présents dans chacun des hashs sont des majuscules, des minuscules, des chiffres, / et + ;
  • la taille des condensats générés est fixe ;
  • des caractères fixes sont ajoutés, probablement pour servir de marqueurs. Le système peut vérifier que le mot de passe n'a pas été altéré grâce à ça.
  • les condensats sont différents si les noms d'utilisateurs sont différents.

On conclut que les mots de passe sont certainement hachés, avec un sel dépendant du nom d'utilisateur. Notons que si on utilise la même combinaison utilisateur / mot de passe plusieurs fois, le condensat du mot de passe est toujours le même. Le sel dépend donc uniquement du nom d'utilisateur.

Les lettres fixes rajoutées (n, r, c, s, t, n, soient les consonnes de \rnetscreen de droite à gauche) peuvent être supprimées. On remarque alors que le condensat peut être découpé en blocs de 3 caractères, dont la première lettre est toujours en majuscules :

KVU M2w MUz Prk G5W IHd Cqk Aib
C4o Mxs CJ0 HTE CWd L7D Iln GhZ
JBH Pi3 M3g A99 Jno NsQ AGs NAv
KeZ Gvk NDk PAP BmC A4H OH7 GS7
Bh0 Ccu F3N PAw GHF GK7 O0l IEa
PIT ESE Oxi O3A CIX Hvg D8W Phc
MHs Ce+ FbT OSt Imx Ltw JFb OgY

Chaque caractère, en base 64, correspond à un mot de 6 bits. Or, les caractères majuscules codent les valeurs \"faibles\" (de 0 à 25). La plus grande majuscule se trouvant au début d'un bloc de 3 caractères est un P, 16lettre de l'alphabet, qui encode la valeur 15. 15 est la plus grande valeur qu'il est possible d'écrire sur 4 bits. On en déduit que le premier caractère de chaque bloc correspond à un mot de 4 bits, les deux autres bits étant toujours à 0 (et inutilisés).

Chaque bloc de 3 caractères coderait donc 4+6+6 = 16 bits, soient deux octets. Un mot de passe encodé contient 8 blocs de 3 caractères, soit 8 blocs de 16 bits, ou encore 128 bits. Ce qui est la taille des condensats de certaines fonctions de hachage bien connues (MD2, MD4, MD5, RIPEMD-128, HAVAL-128 notamment).

Reste à savoir quelle fonction a été utilisée, et de quelle façon. Le condensat de la combinaison netscreen /netscreen, une fois converti en hexadécimal, est : A554CDB0C533FAE46E5681DD2AA4089B. On essaie de trouver la combinaison utilisée pour calculer le condensat, en hachant une chaîne dépendante du nom d'utilisateur et du mot de passe. Par exemple :

  • *h(*netscreennetscreen*)*
  • *h(*netscreen$netscreen*)*
  • *h(*netscreen#netscreen*)*
  • *h(*neersctennetscreen*)*

Plusieurs attaques par force brute ont été lancées, mais n'ont donné aucun résultat. Il est alors nécessaire d'étudier le fonctionnement interne du boîtier pour comprendre comment ce condensat est calculé.