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
.
L’injection
- Ouverture du processus cible en écriture, avec possibilité de créer des threads
OpenProcess
- Allocation de mémoire, dans le processus cible, pour la routine de chargement
VirtualAllocEx
- Écriture, dans la mémoire allouée, du nom de la librairie à charger
WriteProcessMemory
- 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
- Attente de la fin de l’opération de chargement (fin du thread initialement créé)
WaitForSingleObject
- Libération de la mémoire allouée
VirtualFreeEx
Avantages de cette méthode :
- 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 :
- É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 pointeursRTL_AVL_TABLE
; nécessitant l’utilisation deRtlLookupElementGenericTableAvl
- 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 processusLSASS
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
parReadProcessMemory
, donnant lieu à des proxys d’utilisation des structuresUNICODE_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, viaReadProcessMemory
RTL_AVL_TABLE
; utilisera un proxy de parcours d’arbres, viaReadProcessMemory
- Le déchiffrement : il suffit d’aller récupérer les clés depuis
LSASS
pour les utiliser dansmimikatz
Récupération des clés
Bientôt dans un post dédié…