Effectuer du « pass-the-hash » au travers du protocole RDP

Effectuer du « pass-the-hash » au travers du protocole RDP

Avant de commencer

Remote Desktop Protocol (RDP) est un protocole permettant à un utilisateur d’obtenir une session bureau à distance sur un serveur exécutant Microsoft Terminal Services.

À la base le protocole RDP ne supportait que l’authentification interactive. C’est-à-dire que lors d’une ouverture de session RDP, l’utilisateur arrivait sur l’invite d’authentification Windows depuis laquelle il devait renseigner son identifiant ainsi que son mot de passe.

Depuis la version 6.0 de RDP, Microsoft a introduit la Network Level Authentication (NLA). Cette nouvelle fonctionnalité permet de forcer les utilisateurs à s’authentifier sur le réseau avant de leur permettre d’accéder au bureau à distance. De cette manière, Microsoft vise à réduire les ressources nécessaires sur les machines/serveurs Windows exposant un service RDP et également à empêcher toute attaque pré-authentification sur un service RDP (exemple BlueKeep CVE-2019-0708).

Ensuite, Microsoft a ajouté deux nouvelles fonctionnalités de sécurité :

  • Restricted Admin
  • Remote Credential Guard

Restricted Admin

Restricted Admin est un mécanisme de sécurité développé par Microsoft dont l’objectif principal est de ne plus exposer les identifiants de connexion des utilisateurs sur la machine exposant le service Remote Desktop. Cette fonctionnalité est apparue sur Windows 8.1 et Windows Server 2012 R2.

Aucun identifiant de connexion n’est envoyé au serveur distant. L’identité de l’utilisateur est vérifiée en amont via une authentification réseau. Si ces identifiants sont valides, le serveur RDP autorise la connexion, et vous êtes en mesure d’intéragir localement en tant que votre utilisateur. Cependant, étant donné que la machine distante ne stocke en aucun cas vos identifiants de connexion, vous ne serez pas en mesure d’accéder à des services distants avec votre compte depuis la connexion RDP établie. Le compte machine du serveur sera donc utilisé.

Si on résume :

  • UserA souhaite accéder à un service RDP exposé sur le serveur RDPSERVER.test.lan
  • UserA réalise une demande d’ouverture de session réseau (https://docs.microsoft.com/fr-fr/windows-server/security/windows-authentication/windows-logon-scenarios#BKMK_NetworkLogon)
  • L’identité de UserA est validée auprès du service RDP distant
  • La session est établie et l’utilisateur accède au service RDP distant en tant que UserA pour toute action locale et RDPSERVER$ (compte machine) pour toute authentification réseau.

Note : Cette fonctionnalité s’applique uniquement sur les comptes administrateurs sur le serveur distant.

Note : L’authentification réseau inclut 5 mécanismes d’authentification dont NTLM et Kerberos et permet ainsi le PTH (Pass The Hash) ou le PTT (Pass The Ticket)

Remote Credential Guard

Remote Credential Guard est un mécanisme de sécurité développé par Microsoft dont l’objectif est d’authentifier les utilisateurs sur le service RDP distant sans transmettre leurs identifiants sur le réseau et le stocker sur le système distant. Pour ceci, l’authentification Kerberos est déportée sur le client. Le client réalise ainsi l’ensemble des échanges Kerberos afin d’obtenir un TGS valide pour accéder à un service au travers RDP.

Il utilise ensuite un canal sécurisé, précédemment créé, afin de transmettre le TGS uniquement au serveur distant qui se chargera à son tour de le transmettre au service distant.

De cette façon le serveur RDP n’a aucun besoin de connaître le secret d’authentification du client.

Cette fonctionnalité est apparue sur Windows 10 et Windows Server 2016.

Accès à un service RDP avec un hash NT (RestrictedAdmin activé)

Plusieurs techniques existent pour se connecter à un service RDP distant avec un hash NT. Pour cela, il est d’abord nécessaire que la fonctionnalité de sécurité « RestricedAdmin » soit activée sur le serveur RDS (Remote Desktop Services).

Si vous avez la main sur le serveur et que vous souhaitez débug pour voir si RestrictedAdmin est activée, vous pouvez lancer la commande suivante :

reg query HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\ /v DisableRestrictedAdmin

Si la commande vous retourne le texte suivant, c’est que RestrictedAdmin est activé :

DisableRestrictedAdmin    REG_DWORD    0x0

Client Windows (mstsc.exe)

Il est possible d’utiliser le client mstsc.exe (natif Windows) en réalisant un « Pass-The-Hash » local avec l’outil Mimikatz.

Voici la démarche à suivre pour se connecter à un service RDP distant avec un hash NT en utilisant Mimikatz et mstsc.exe :

  • Démarrer votre VM Windows préférée et désactivez l’AV (si actif)
  • Lancer Mimikatz.exe en administrateur puis lancer les commandes suivantes :
privilege::debug
sekurlsa::ptt /user:{{USER}} /domain:{{DOMAIN}} /ntlm:{{NT}} /run:"mstsc.exe /restrictedadmin"
  • Un processus Client RDP va démarrer. Ici le jeton d’accès du processus a été modifié par Mimikatz afin d’utiliser le hash NT, le domaine et l’utilisateur précédemment renseigné.
  • Renseigner l’adresse IP du serveur distant sur lequel vous souhaitez vous authentifier
  • L’authentification est transparente et vous arriverez sur le bureau distant si « RestrictedAdmin » était bien activé.

Bonus : La fonctionnalité sekurlsa::ptt de Mimikatz ne réalise pas vraiment un Pass-The-Hash. En réalité, cette fonctionnalité démarre un nouveau processus/programme demandé et remplace son « Access Token ».

XFreeRDP

Vous pouvez aussi réaliser un hash NT pour vous authentifier sur un service RDP distant en utilisant le client xFreeRDP. La technique suivante est relativement simple et efficace. Par contre, le client xFreeRDP est moins puissant que le client RDP Windows ou OSX.

Voici les étapes à dérouler :

  • Installer le client xFreeRDP
  • Lancer la commande suivante :
xfreerdp /u:{{USER}} /d:{{DOMAIN}} /pth:{{NT}} /v:{{IP}}

Ressources intéressantes sur le sujet :

https://www.pentestpartners.com/security-blog/abusing-rdps-remote-credential-guard-with-rubeus-ptt/
https://syfuhs.net/how-authentication-works-when-you-use-remote-desktop
Remote Credential Guard : https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rdpear/2379443a-7f62-4945-a5ff-8eff15d265ce
https://download.microsoft.com/download/7/7/A/77ABC5BD-8320-41AF-863C-6ECFB10CB4B9/Mitigating-Pass-the-Hash-Attacks-and-Other-Credential-Theft-Version-2.pdf
https://docs.microsoft.com/en-us/windows/security/identity-protection/remote-credential-guard

Wilfried Jaguenaud