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.
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:
aa d3 b4 35 b5 14 04 ee
: cryptage DES de la constante
0x4B,0x47,0x53,0x21,0x40,0x23,0x24,0x25 par la chaîne 0,0,0,0,0,0,0.
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:
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.
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.
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é.
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.
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.
\SAM\Domains\Account\F
,
Security\Policy\SecretEncryptionKey
ou,
HKLM\System\CurrentControlSet\Control\Lsa
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).
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.
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é.
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