Il arrive que j’ai le temps de lire les technet de Microsoft…, j’aurais du le faire beaucoup plus tôt !
Si vous utilisez beaucoup le bureau à distance, vous aurez déjà découvert RDCMan :
Si vous êtes un aficionados, vous n’aurez pas manqué le SSO pour bureau à distance, qui permet d’éviter de rentrer ses identifiants lors d’une connexion :
- http://technet.microsoft.com/library/cc772108.aspx
- http://blogs.msdn.com/b/rds/archive/2007/04/19/how-to-enable-single-sign-on-for-my-terminal-server-connections.aspx
- http://blogs.msdn.com/b/rds/archive/2008/04/30/problems-using-default-credentials-with-vista-rdp-clients-with-single-sign-on-enabled.aspx
(dans les commentaires du blog MSDN, on trouve aussi les options particulières pour activer ce mode sous Windows XP SP3 et envers les serveurs non NLA et sans TLS)
Ceci fonctionne très bien vers toutes les machines basées sur NT 6 depuis des machines NT 6 ! (ou XP SP3 avec le nouveau fournisseur de sécurité RDP installé) (c’est déjà ça ;))
Sans trop chercher à comprendre le fonctionnement, j’ai tout de suite voulu tester les fonctionnalités « pass-the-hash » de mimikatz sur une connexion bureau à distance….
Sans succès :(, la connexion continue à s’effectuer avec les identifiants virtuels de mimikatz… c’est donc que ce SSO fonctionne avec un « système » autre que nos hashs préférés, a priori directement notre mot de passe courant !
Ces fonctionnalités de SSO utilisent, entre autres, un SSP (security support provider) dans LSA (Local Security Authority) : tspkg
Le provider
Ce provider n’est pas sans nous rappeler msv1_0
qui, au fil des versions, continue de nous faire profiter de quelques fonctions amusantes :
NlpGetPrimaryCredential ; GetPrimaryCredential NlpAddPrimaryCredential ; AddPrimaryCredential NlpDeletePrimaryCredential ; DeletePrimaryCredential
Pour rappel, ces fonctions permettent de récupérer les hashs LM et NTLM d’une connexion existante en fonction de l’identifiant, puis de le manipuler (réinjecter par exemple)….
rien de nouveau, c’est déjà dans mimikatz 0.x, et c’est fort amusant
Notre nouvelle librairie préférée dispose d’une fonction très sympathique elle aussi :
TSCredTableLocateDefaultCreds *TSObtainClearCreds
* dans certains cas
TSCredTableLocateDefaultCreds
; retourne une structure permettant de pointer vers les identifiants et le mot de passe « obfusqué » en fonction de l’identifiant de connexionTSObtainClearCreds
; a été une bonne piste de départ, cette fonction retourne la structure finale avec le mot de passe en clair (!), en réalité cela repose sur :LsaUnprotectMemory
Problème
Ce provider est actif par défaut sous les NT 6 ! Et le stockage des mots de passe est effectué même si le SSO n’est pas activé !
Téléchargement et fonctionnement
Une livraison de mimikatz en version « pre-alpha » pour l’occasion :
(plus d’information : http://blog.gentilkiwi.com/mimikatz/librairies/sekurlsa#getLogonPasswords et http://blog.gentilkiwi.com/mimikatz/librairies/sekurlsa/tspkg)
Petite parenthèse pour les Windowsiens prudents (Aurélien C), il faut faire attention à débloquer le fichier téléchargé, sinon les fichiers décompressés auront du mal à fonctionner :
Les fonctions évoqués plus hauts, ne sont bien sûr disponibles que sur les systèmes NT 6 ! (ou XP SP3 sur lequel le provider tspkg
aurait été activé)
A exécuter après avoir obtenu des droits administrateurs (ou system) :
privilege::debug inject::process lsass.exe sekurlsa.dll @getLogonPasswords
La commande privilege::debug
n’est pas obligatoire si vous êtes déjà system.
Améliorations
par ordre d’importance
- étudier une authentification SSO RDP sans mot de passe en clair (avec un challenge/response par exemple)
- ne pas stocker directement un mot de passe avec comme seule protection réversible
LsaProtectMemory
(ça fait stagiaire étudiant) - rendre le stockage de données de connexion dépendant de la stratégie SSO
- stratégie devant être au niveau utilisateur, pas au niveau machine… les identifiants appartiennent à un utilisateur, pas à une machine…
En attendant, il est URGENT de retirer le provider tspkg
… surtout si vous n’utilisez pas le SSO du RDP !
Pour cela, il faut passer par le registre :
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
, valeur Security Packages
et enlever seulement la ligne tspkg
et redémarrer…