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é…