Mimikatz est un outil permettant d’effectuer diverses actions sur un système Windows : injection de bibliothèques, manipulation de processus, extraction de hashes et de mots de passe notamment. Il devient indispensable aujourd’hui dans la boîte à outils de tout pentester. Cet article a pour objectif de vous présenter l'utilisation de l'outil lors d'un test d'intrusion, ainsi que l'extraction de mots de passe et de certificats.
1. Présentation
L’outil Mimikatz a été développé par Benjamin Delpy (aka GentilKiwi [BLOG]). Rendu public en 2007. Mimikatz fonctionne sur les versions supérieures à Windows 2000 (les versions 32 et 64 bits sont supportées) : XP, 2003, Vista, Seven, 2008, 2008R2, 8, 2012.
Le code source de l’outil est disponible sur Google Code [CODE].
1.1 Modules
Mimikatz est organisé autour de différents modules (liste non exhaustive) :
- standard : intègre les commandes de base de l'outil.
- crypto : interagit avec les modules cryptographiques de Windows CryptoAPI [CAPI]et CNG [CNG], ainsi que l’extraction de certificats et de clés.
- sekurlsa : extrait les hashes et mots de passe des sessions Windows en cours.
- system : intègre des commandes système de base telles que l’obtention de l’utilisateur et de l’ordinateur courant.
- winmine et minesweeper : module de démonstration permettant de manipuler le démineur de Windows XP et 7.
- nogpo : permet de contourner certaines GPO Windows triviales.
- samdump : permet d’extraire les hashes de la base SAM de l’équipement Windows, via la base de registre ou des fichiers plats.
- inject : injection de bibliothèques dans des processus Windows.
- ts : manipulation des sessions Terminal Server (autorise le dépassement du nombre maximal de connexions simultanées notamment).
- divers : contient diverses fonctions majoritairement expérimentales.
1.2 Bibliothèques
Il est à noter que l’outil fournit également trois bibliothèques :
- sekurlsa : fournit les mêmes fonctionnalités que le module éponyme. Il est préconisé de privilégier l’utilisation du module.Elle ne contient maintenant que les fonctionnalités devant s'exécuter dans le processus LSASS (processus gérant l'authentification des utilisateurs de l'équipement).
- klock : permet la manipulation de bureaux.
- kelloworld : est une bibliothèque servant d’exemple pour l’injection.
1.3 Pilote
Enfin, un pilote mimikatz.sys est également fourni et permet ainsi d’avoir un point d’entrée en mode utilisateur dans le noyau. Pour plus d’informations sur ce pilote, nous vous recommandons la lecture du blog de l’auteur de l’outil [PILOTE].
Dans le cadre de cet article, nous vous présenterons uniquement les modules sekurlsa et crypto. Il s'agit des modules les plus utiles lors d'un test d'intrusion.
2. Fonctionnement
2.1 Attaque « pass-the-pass »
L'attaque « pass-the-pass » consiste à récupérer les mots de passe en clair contenus dans la mémoire des utilisateurs s'étant logués sur le système. Elle est implémentée dans le module sekurlsa de Mimikatz, exploitant le processus LSASS afin d'extraire les mots de passe contenus dans les services suivants :
- tspkg ;
- wdigest ;
- livessp ;
- kerberos ;
- msv1_0.
Ces services stockent en mémoire les identifiants utilisateur (y compris son mot de passe) lors de la phase d'ouverture de session afin d'assurer un mécanisme de Single-Sign-On (SSO) de Windows. Il s'agit de « Security Service Providers » (SSP) chargés dans le processus LSASS.
Le mot de passe n'est pas directement stocké en clair, c'est pourquoi il n'est pas possible de les trouver via une simple recherche de caractères dans la mémoire.
LSASS utilise l'API LsaProtectMemory(), qui permet de chiffrer des données avec une clé de session aléatoire.
Il est alors possible de faire appel à la fonction LsaUnprotectMemory() afin de forcer les services concernés à dévoiler les mots de passe en clair .
Il existe deux méthodes pour parvenir à cette fin :
- Injecter du code dans le processus LSASS pour appeler l'API en question. Cette technique déclenche quasiment tous les antivirus du marché, et ne doit pas être utilisée « en production ». Elle peut causer un arrêt du processus.
- Modifier le processus LSASS directement en mémoire pour récupérer la clé de session et les mots de passe chiffrés. Connaissant l'algorithme de chiffrement (RC4, DESx, 3DES ou AES selon la longueur du mot de passe et les versions de Windows), on en déduit les mots de passe. Cette technique échappe à presque tous les produits de sécurité, y compris les plus sérieux.
La modification de la mémoire à la volée permet de ne pas injecter de code dans LSASS et ainsi éviter tout dysfonctionnement du processus. De plus, une tentative d'injection de code dans le processus semblera beaucoup plus suspecte pour un antivirus.
Il va sans dire que Mimikatz implémente la deuxième méthode.
2.2 Attaque « pass-the-hash »
L'attaque « pass-the-hash » permet de se connecter à distance sur un équipement Windows sans connaître les mots de passe en clair associés aux comptes ciblés.
En effet, l'étude des mécanismes d'authentification LM et NTLM (en… 1997 !) a permis de démontrer que seul le login et le(s) hash(s) du mot de passe étaient nécessaires afin de valider une authentification LM ou NTLM(v2).
Ainsi, si nous sommes en possession d'un login utilisateur et du hash de son mot de passe, nous sommes en mesure d'envoyer ces informations directement au système distant qui validera l'authentification.
2.3 Module Crypto
Le module crypto de Mimikatz permet de lister/exporter les certificats ainsi que de modifier les mécanismes de chiffrement CryptoAPI [CAPI]et CNG [CNG]afin de contourner les vérifications d'export (certaines clés privées pouvant être déclarées comme « non exportables »).
Dans le cadre de l'utilisation de la CryptoAPI, Mimikatz va remplacer4 octets dans l’espace mémoire utilisateur afin de remplacer deux sauts conditionnels en sauts inconditionnels (« jnz» -> « jmp »).
Une fois cette manipulation effectuée, le mécanisme de sécurité du processus rsaenh!CPExportKey ne sera pas en mesure de vérifier les paramètres d'export et continuera l'extraction du certificat et de sa clé privée associée.
Le mécanisme CNG, fourni par Microsoft en réponse aux Critères Communs, ne stocke plus les clés privées au sein du processus utilisateur, mais dans le processus système LSASS [TECHNET].
La fonction lsass(keyiso):ncrypt!SPCryptExportKey permet d'effectuer toutes les vérifications lors d'une demande d'exportation d'un certificat.
Cependant, en forçant un saut conditionnel « jnz », il est possible de contourner le mécanisme de sécurité du processus.
Une fois ces actions effectuées, Mimikatz est en mesure d'exporter une grande partie des certificats et des clés privées présents dans le système.
3. Cas d'utilisation
Afin de vous présenter de manière concrète les possibilités d'utilisation de Mimikatz, nous nous plaçons dans le contexte d'un test d'intrusion simulant le vol d'un ordinateur portable appartenant à un collaborateur de l'entreprise.
L'analyse du portable nous permet de constater qu'une connexion VPN au réseau interne de l'entreprise est disponible sur l'équipement.
3.1 Extraction de certificats et des clés privées associées
Comme indiqué dans le descriptif de la mission, l'ordinateur portable possède un certificat privé, protégé par un mot de passe, permettant la connexion au réseau interne de l'entreprise via un VPN PEAP-TLS.
Il est à noter que la configuration actuelle de l'ordinateur portable ne permet pas d'exporter la clé privée du certificat.
Suite à l'obtention des droits SYSTEM sur l'équipement (via un redémarrage du poste sur un système tiers type live CD afin de récupérer ou créer un compte administrateur local, cette étape est laissée en exercice au lecteur !), nous utilisons le module crypto de Mimikatz afin de récupérer le certificat utilisé lors de la connexion VPN, ainsi que la clé privée associée.
La première étape consiste à rechercher, dans les magasins de la machine, l’endroit où est stocké le certificat. Dans notre cas, le certificat étant associé à un utilisateur, nous listons les magasins de l'utilisateur courant (CERT_SYSTEM_STORE_CURRENT_USER) via la commande suivante :
mimikatz # crypto::listStores <MagasinSystème>
N.B. : Les certificats d’authentification sont très souvent dans :
- CERT_SYSTEM_STORE_LOCAL_MACHINEMy ;
- CERT_SYSTEM_STORE_CURRENT_USERMy.
Sans argument, c’est ce dernier emplacement qui est utilisé par les fonctions crypto::listCertificates et crypto::exportCertificates.
Pour chaque magasin identifié, nous sommes en mesure de lister les certificats disponibles :
mimikatz # crypto::listCertificates <MagasinSystème> <Magasin>
Dans notre exemple, nous constatons dans le magasin CERT_SYSTEM_STORE_CURRENT_USER\My la présence d'un certificat nommé mathieu.mauger(identique au compte de domaine Windows) utilisé pour l'authentification VPN.
Afin d'exporter la clé privée du certificat mathieu.mauger, nous patchons le mécanisme de sécurité CryptoAPI à l'aide de la fonction patchapi :
mimikatz # crypto::patchcapi
N.B. : Si la clé avait été protégée par la CNG, nous aurions dû patcher LSASS avant d’exporter via :
mimikatz # crypto::patchcng
Enfin, il nous suffit d'exécuter la commande suivante pour récupérer le certificat et la clé privée associée :
mimikatz # crypto::exportCertificates < MagasinSystème> <Magasin>
Le certificat ainsi exporté est stocké dans le répertoire courant sous le format DER. Tandis que la partie privée est sauvegardée sous le format PFX et est protégée par le mot de passe : « mimikatz ».
Nous pouvons à présent installer le certificat et la clé privée sur l'une de nos machines afin d'obtenir un accès au réseau interne par le tunnel VPN et ainsi continuer le test d'intrusion.
3.2 Extraction des mots de passe Windows
Une fois connectés au réseau interne, nous avons été à même d'obtenir un shell meterpreter sur un serveur Windows 2003 avec les droits SYSTEM à l'aide d'une vulnérabilité sur le compte de domaine SA.
À l’aide de Mimikatz, et plus particulièrement du module sekurlsa, nous pouvons extraire les mots de passe en clair de tous les utilisateurs (et services) ayant une session ouverte. Dans certains cas, il peut subsister des « restes » de sessions en mémoire, ceci rend bien entendu la collecte encore plus intéressante !
Nous allons donc utiliser l'exécution en mémoire de Mimikatz afin d'éviter le dépôt de fichier sur le serveur.
L'intérêt est de ne pas déposer l'outil sur le système de fichiers de la machine et ainsi le rendre indétectable par des produits de sécurité.
Nous sommes donc en possession d’une console meterpreteret allons maintenant lancer l'exécution de Mimikatz à distance à l’aide de la commande execute et des options spécifiques suivantes :
- H : crée un processus caché.
- i : interagit avec le processus une fois ce dernier créé.
- c : déporte la sortie standard de l’exécutable sur le shell meterpreter.
- d : indique le nom du processus à utiliser et qui apparaîtra ainsi dans le gestionnaire des tâches.
- m : exécute le programme depuis la mémoire.
- f : signale l’exécutable.
- a : signale les arguments. Il est à noter l'utilisation de guillemets pour les arguments de Mimikatz.
Voici l'exécution complète de la commande :
Pour information, les paramètres donnés au module sekurlsa diffèrent en fonction des versions Windows.
Pour les versions supérieures de Windows, il est nécessaire de nous attribuer le privilège Debug si nous ne sommes pas déjà SYSTEM. Pour cela, nous allons utiliser la commande :
mimikatz # privilege::debug
Si la commande s’est bien exécutée, nous recevons un message confirmant la bonne obtention des droits. Il suffit ensuite d’utiliser la même commande que dans l'exemple de meterpreter :
mimikatz # sekurlsa::logonPasswords full
Nous sommes à présent en possession des mots de passe en clair stockés dans le service LSASS.
N.B. : Il est intéressant de noter que même si le stockage des hashes LM a été désactivé via la directive NoLMHash, cela n’empêche pas Windows de conserver une version en mémoire de celui-ci.
3.3 Récupération des mots de passe en base de registre
Dans le contexte de la mission, nous constatons la présence du logiciel de prise de main à distance RealVNC. Ce logiciel stocke les mots de passe dans la base de registre sous le format DES.
Il serait donc intéressant d'explorer la base de registre afin d'obtenir le mot de passe en question.
Cependant, il se peut qu’une stratégie de groupes, appelée GPO (Group Policy Object), soit mise en place afin d’interdire aux utilisateurs l’ouverture de l’éditeur de registre.
Mimikatz possède un module baptisé noGPO qui est en mesure de contourner les protections imposées par les stratégies.
Par exemple, pour ouvrir la base, nous pouvons utiliser la commande suivante :
mimikatz # Nogpo::regedit
Il est possible de faire de même pour l’invite de commande, le gestionnaire des tâches et l’utilisation des PST dans Outlook via les commandes respectives suivantes :
mimikatz # Nogpo::cmd
mimikatz # Nogpo::taskmgr
mimikatz # Nogpo::olpst
4. Protections
La mise en place d’une configuration afin de se prémunir de Mimikatz n’est pas chose aisée.
La solution idéale serait que le mot de passe en clair ne soit pas conservé dans la mémoire du processus LSASS, mais dans l’état actuel des choses, cela casserait le SSO (Single-Sign-On) mis en place par Microsoft.
Au niveau de la configuration de Windows, il est possible de désactiver les Security Service Providers (SSP) stockant les mots de passe en clair tels que :
- LiveSSP ;
- TsPkg ;
- Wdigest.
Néanmoins, il apparaît difficile (voire impossible) de désactiver les services Kerberos et MSV1_0.
En effet, les services MSV1_0 et Kerberos gèrent, respectivement, l'authentification en local et sur le domaine Windows des utilisateurs.
Enfin, il faut proscrire la connexion via le Terminal Server ou l'ouverture d'une session en local sur l'équipement. Le fait d'utiliser uniquement l'authentification par le réseau (par exemple via l'utilitaire psexec) permet d'éviter que le mot de passe ne soit conservé dans la mémoire de l'équipement étant donné qu’il n’est jamais envoyé à l'équipement.
Conclusion
Comme nous venons de le voir, Mimikatz est une véritable boîte à outils, indispensable à tout pentester, désireux de récupérer les mots de passe stockés en clair dans les Security Service Providers (SSP) ou d'extraire les clés privées associées aux certificats d'un équipement Windows lors d'un test d'intrusion interne.
Néanmoins, Mimikatz possède quelques points faibles. Par exemple, le fait de nécessiter les droits administrateur pour extraire les mots de passe. De plus, Mimikatz est à présent détecté par certaines solutions antivirales comme un « hacktool ».
Mimikatz recèle encore de nombreux secrets et est en constante évolution. Mangez-en, c'est bon !
Remerciements
Nous tenons à remercier Benjamin Delpy (@GentilKiwi) pour sa relecture attentive.
Références
[BLOG] http://blog.gentilkiwi.com
[CODE] https://code.google.com/p/mimikatz/
[PILOTE] http://blog.gentilkiwi.com/mimikatz/pilote
[CAPI] http://technet.microsoft.com/library/cc962093.aspx
[CNG] http://msdn.microsoft.com/library/windows/desktop/aa376210.aspx
[TECHNET] http://technet.microsoft.com/fr-fr/library/cc730763%28v=ws.10%29.aspx