Comment Windows stocke-t-il les mots de passe ? Vous avez peut-être déjà eu besoin de retrouver un mot de passe perdu, celui du compte Administrateur par exemple, ou bien un ami a utilisé votre PC pour apprendre comment changer un mot de passe et l'a oublié juste après.

codage du mot de passe jusqu'à vous révéler comment celui-ci est sauvegardé sur l'ordinateur. Est-ce vraiment sécurisé ? Quelles alternatives à la perte d'un mot de passe ?

Algorithmes de cryptage

Windows NT stocke les mots de passe des utilisateurs sous deux formes. Elles correspondent aux deux principaux algorithmes utilisés dans la phase d'authentification du protocole de communication SMB utilisé par Windows.

Algorithme Lanman

Pour être crypté, le mot de passe est mis en majuscules et complété par des zéros s'il faisait moins de quatorze caractères. Ensuite, la chaîne 0x4B,0x47,0x53,0x21,0x40,0x23,0x24,0x25 est cryptée avec les sept premiers caractères du mot de passe par du DES pour former la première partie du mot de passe crypté. De manière indépendante, cette même chaîne est chiffrée avec les sept caractères suivants pour former la seconde partie du mot de passe. Le DES, Data Encryption Standard, est un algorithme de chiffrage par bloc datant des années 70 fonctionnant avec une clé de 56 bits. Il a déjà fait l'objet d'une présentation dans un précédent Pirate Mag.

             mot de passe = "PaSswOrd"
                       || Mise en majuscule,
	               || on complète avec des zéros
	               \/ 
               PASSWORD,0,0,0,0,0,0
                  ||         ||
                  \/         \/
               PASSWOR    D,0,0,0,0,0,0
                  ||         || Cryptage DES de la constante
	          ||         || 0x4B,0x47,0x53,0x21,0x40,0x23,0x24,0x25 
       	          \/         \/
e5 2c ac 67 41 9a 9a 22    4a 3b 10 8f 3f a6 cb 6d
			|| Concaténation
			\/
e5 2c ac 67 41 9a 9a 22 4a 3b 10 8f 3f a6 cb 6d

Cette forme cryptée s'appelle le LANMAN hash. Elle est apparue dans Windows 3.11 pour Workgroup.

Cette méthode de cryptage présente plusieurs faiblesses:

Certaines personnes voulaient savoir d'où venait la constante, si son choix était important pour la sécurité de l'algorithme. Ce n'est pas le cas. Par exemple, sous Linux et de nombreux Unix, la constante cryptée par du DES est formée uniquement de 0, difficile de faire plus simple.

Algorithme NTLM

Le mot de passe est convertit sous forme Unicode, représentation universelle des caractères. En fait, comme les caractères correspondent à de l'ASCII, cela revient à ajouter un caractère nul derrière chaque caractère. Puis, la forme Unicode est crypté avec l'algorithme MD4, Message Digest 4 de la société RSA. En fait, le DES fait pour crypter et décrypter des messages tandis que MD4 a été conçu pour produire des empreintes de messages.

             mot de passe = "PaSswOrd"
	          || Unicode
		  \/
             P,a,S,s,w,O,r,d
	          || MD4
		  \/
MD4 hash    :
cd a5 e8 81 b8 b7 68 89 5f b3 e0 11 2a e9 5e 28

Si la forme LANMAN du mot de passe a été cassé, il ne reste plus qu'à découvrir la casse (majuscule/minuscule) du mot de passe d'origine. Ainsi en cryptant les différentes variations sur la casse du mot de passe LANMAN, le mot de passe original est rapidement retrouvé. Par exemple, si le mot de passe LANMAN est TOTO123, il suffit de tester les seize possibilités suivantes pour retrouver le mot de passe NTLM: toto123, totO123, toTo123, toTO123, tOto123, tOtO123, tOTo123, tOTO123 Toto123, TotO123, ToTo123, ToTO123, TOto123, TOtO123, TOTo123, TOTO123

Une attaque directe du mot de passe NTLM est difficilement réalisable en temps de calcul. Cependant, comme dans le cas du mot de passe LANMAN, s'attaquer à un millier de compte ou à un seul ne demande pas plus de ressource.

Un aperçu de l'utilisation réseau

Lors des connexions réseaux SMB, partage d'imprimante ou de fichier, les formes cryptées du mot de passe peuvent être utilisées sous forme de challenge (question/réponse évitant que le mot de passe ou l'une de ces formes chiffrée ne circulent en clair sur le réseau) pour authentifier un individu. Comme la méthode LANMAN est moins fiable, il est possible de l'interdire si aucun Windows 9x n'est utilisé. Pour plus d'informations, se reporter au dossier Windows et la sécurité de MISC 2.

Fichier SAM

Le fichier SAM, Security Accounts Manager, contient, en autre, la liste des comptes ainsi que les mots de passe cryptés. Ce fichier se trouve généralement dans le répertoire \winnt\system32\config. Même un administrateur ne peut lire directement ce fichier. Par contre, la commande rdisk /s va en créer une copie de sauvegarde compressée dans le répertoire repair de la racine du répertoire de Windows. La commande expand sam._ my_sam permet de récupérer le fichier décompressé.

V-struct

Les premières informations ont été publiées via le programme pwdump inclus dans les distributions de SAMBA, version libre du protocole SMB. A partir de là, Petter Nordahl-Haggen, auteur d'Offline NT Password & Registry Editor http://home.eunet.no/~pnordahl/ntpasswd/, a redécouvert la plupart des structures du fichier SAM, sous-structure de la base de registre. Les comptes utilisateurs sont décrits dans \SAM\Domains\Account\Users\Names\, il "suffit" de parcourir les structures du fichier pour les lister.

L'offset et la longueur des champs sont stockés dans ce qui est appelé la V structure, une structure binaire de 204 octets (0xCC en hexadécimal):

0x0c,0x10 Login
0x18,0x1c Nom complet
0x24,0x28 Commentaires
0x48,0x4c Répertoire utilisateur
0x9c,0xa0 Mot de passe LANMAN
0xa8,0xac Mot de passe NTLM

Les offsets sont relatifs à la fin de cette structure.

Au lieu d'utiliser une salt key, une clé propre à chaque utilisateur, pour perturber le cryptage afin que deux individus avec le même mot de passe ne se retrouvent pas avec la forme cryptée sur le disque, Microsoft a choisi de coder ces deux mots de passe cryptés par un cryptage DES. Les deux clés de 56 bits utilisées sont dérivées du RID. Le RID est un numéro sur 32 bits identifiant l'utilisateur, c'est l'équivalent de l'UID sur un système Unix. La création des clés se fait au niveau des octets: si le SID vaut 0x1234, la première clé va être 0x4321432, la seconde clé 0x1432143. Ce artifice ne renforce pas la sécurité, c'est juste un codage. Dommage que les développeurs de chez Microsoft ne se concentrent pas plus sur la sécurité proprement dite.

Compte administrateur

Sous Unix, le compte administrateur est simple à trouver, c'est le compte root. Sous Windows, c'est plus complexe. Le nom est souvent internationalisé: Administrator, Administrateur,... Pour le reconnaître, il faut chercher un compte dont le RID vaut 500.

La voie obscure: Syskey

Comme les structures du fichier SAM ont été rapidement mises à jour, Microsoft a décidé de chiffrer par du RC4, au sein même du fichier, les mots de passe cryptés. On peut remarquer que les structures des fichiers de mots de passe Unix sont publiques et cela n'a jamais été considéré comme un problème. Les mots de passe sont de toute façon déjà cryptés de manière irréversible, il s'agit là uniquement d'un codage réversible, une couche de brouillard. Depuis le service pack 3 de NT 4, l'utilitaire Syskey est fourni dans pour réaliser ce codage. Depuis Windows 2000, ce cryptage est activé par défaut. La clé de codage est Dans la base de registre, la valeur stockée selon les versions de Windows dans les clés reproduit ces trois possibilités:

La possibilité 1 n'offre aucune sécurité, cela revient à mettre une serrure en laissant la clé dessus. Les deux autres empêchent les attaques directes des mot de passe LANMAN et NTML.

Des attaques plus complexes sont toujours possibles. L'algorithme de cryptage RC4 est un algorithme de cryptage par flux utilisant le XOR. Or dans ce type d'algorithme, le flux de cryptage ne doit pas être réutilisé, il ne faut pas crypter indépendamment les uns des autres des blocs de données. Bindview s'est rendu compte en 1999 que Microsoft l'utilisait (Il l'utilise toujours) pour crypter utilisateur par utilisateur le mot de passe LANMAN puis le mot de passe NTLM. Le flux de cryptage généré à partir de la clé RC4 est donc réutilisé! Cela ouvre donc la voie à des attaques cryptographiques. La mauvaise implémentation de cet algorithme permet de vérifier la validité d'un mot de passe d'un utilisateur. Si le XOR produit par les deux mots de passe chiffrés en RC4 lus dans le fichier est égale au XOR des mots de passe Lanman et NTLM, bingo, le mot de passe est trouvé!

Si cette relation est vérifiée, le mot de passe est trouvé

             -> NTLM             ?    NTLM chiffré
Mot de passe             > Xor   =  Xor
potentiel         
             -> LANMAN                LANMAN chiffré

Ainsi des attaques sont toujours réalisables même si la clé RC4 est inconnue. C'est juste un peu plus lent que de s'attaquer au cryptage NTLM directement quand cela était possible (absence de syskey ou clé syskey connue).

En pratique

Dans la pratique, la liste des comptes et des mots de passe cryptés est récupérable avec la série des programmes pwdump (pwdump, pwdump2,pwdump3) en tant qu'administrateur ou via une faille de sécurité. Cela ne fonctionne pas toujours surtout si justement le fameux mot de passe administrateur est perdu.

NTFS

Pour se procurer le fichier de mot de passe, n'importe quel driver NTFS fait l'affaire. Ensuite, une attaque par dictionnaire ou force brute est possible mais cela peut prendre du temps. Plus risqué mais plus rapide, il y a la possibilité de modifier le fichier SAM avec chntpw, l'utilitaire de Peter. Le problème est que les principaux drivers NTFS en écriture sont payants. Vous pouvez alors utiliser une disquette de boot Linux avec le support expérimentale de l'écriture sur NTFS activé pour modifier le fichier SAM, une telle disquette est disponible au même endroit que chntpw. Si cette disquette Linux vous fait peur, vous avez encore la possibilité plus risquée d'utiliser une version DOS (http://www.cgsecurity.org/ntfs.html) mais elle utilise une version obsolète du driver NTFS de Linux porté sous DOS. Windows 2000 et XP s'abstenir de cette dernière possibilité.

Casser le code

Pour lancer une attaque par dictionnaire ou force brute, vous pouvez utiliser John The Ripper http://www.openwall.com/john/ ou L0phtcrack http://www.atstake.com/research/lc3/.

Une attaque brute permet 2,7 millions tentatives par seconde avec John The Ripper sur un Athlon 1,4 Ghz et à peine 4000 pour le codage MD5 utilisé sur la majorité des Linux. Microsoft fait vraiment de drôles de choix...


Christophe GRENIER, Consultant Sécurité chez Global Secure
grenier@cgsecurity.org
http://www.cgsecurity.org