
Exploite les tickets Kerberos pour contourner l'UAC Windows et obtenir les privilèges SYSTEM en injectant un faux MachineID dans les tickets de service, en utilisant la technique tgtdeleg et l'accès SCM.
Ce POC s'inspire de James Forshaw (@tiraniddo) présenté à BlackHat USA 2022 dans une intervention intitulée « Taking Kerberos To The Next Level » (lien PDF). Il y a partagé une démonstration d'abus de tickets Kerberos pour contourner l'UAC. En ajoutant une entrée KERB-AD-RESTRICTION-ENTRY au ticket de service, mais en renseignant un faux MachineID, on peut facilement contourner l'UAC et obtenir les privilèges SYSTEM en accédant au SCM pour créer un service système. James Forshaw a expliqué le principe dans un article de blog intitulé « Bypassing UAC in the most Complex Way Possible! », ce qui m'a beaucoup intéressé. Bien qu'il n'ait pas fourni le code d'exploitation complet, j'ai construit un POC basé sur Rubeus. En tant qu'ensemble d'outils C# pour l'interaction brute avec Kerberos et l'abus de tickets, Rubeus offre une interface simple qui nous permet de lancer facilement des requêtes Kerberos et de manipuler les tickets Kerberos.
Vous pouvez consulter des articles connexes sur KRBUACBypass dans mon blog « Revisiting a UAC Bypass By Abusing Kerberos Tickets », qui incluent le principe général et la mise en œuvre. Comme indiqué dans l'article, celui-ci a été inspiré par l'intervention de @tiraniddo « Taking Kerberos To The Next Level » (je ne l'aurais pas fait sans son partage) et je l'ai simplement implémenté en tant qu'outil avant d'obtenir mon diplôme universitaire.
Nous ne pouvons pas générer manuellement un TGT car nous ne possédons pas et n'avons pas accès aux identifiants de l'utilisateur actuel. Cependant, Benjamin Delpy (@gentilkiwi) a ajouté une astuce (tgtdeleg) dans son Kekeo qui permet d'abuser de la délégation non contrainte pour obtenir un TGT local avec une clé de session.
Tgtdeleg abuse de l'API GSS-API Kerberos pour obtenir les TGT disponibles pour l'utilisateur actuel sans nécessiter de privilèges élevés sur l'hôte. Cette méthode utilise la fonction AcquireCredentialsHandle pour obtenir le handle des informations d'identification de sécurité Kerberos pour l'utilisateur actuel, puis appelle la fonction InitializeSecurityContext pour HOST/DC.domain.com en utilisant le drapeau ISC_REQ_DELEGATE et le SPN cible afin de préparer un contexte de pseudo-délégation à envoyer au contrôleur de domaine. Cela provoque l'inclusion dans la sortie GSS-API du KRB_AP-REQ contenant le KRB_CRED dans le checksum de l'authentificateur. La clé de session du ticket de service est ensuite extraite du cache Kerberos local et utilisée pour déchiffrer le KRB_CRED dans l'authentificateur, ce qui permet d'obtenir un TGT utilisable. L'ensemble d'outils Rubeus intègre également cette technique. Pour plus de détails, consultez « Rubeus – Now With More Kekeo ».
Avec ce TGT, nous pouvons générer notre propre ticket de service, et le processus opérationnel possible est le suivant :
KERB-AD-RESTRICTION-ENTRY, mais en renseignant un faux MachineID.Une fois que vous possédez un ticket de service, vous pouvez utiliser l'authentification Kerberos pour accéder aux pipes nommés du Service Control Manager (SCM) ou au TCP via les SPN HOST/NOMHOTE ou RPC/NOMHOTE. Notez que l'API Win32 du SCM utilise toujours l'authentification Negotiate. James Forshaw a créé un POC simple : SCMUACBypass.cpp, en hookant les deux API AcquireCredentialsHandle et InitializeSecurityContextW pour remplacer le nom du package d'authentification appelé par SCM (pszPack age ) par Kerberos, afin que le SCM utilise Kerberos lors de l'authentification locale.
Pour plus de détails, veuillez lire :
Regardons maintenant l'effet en action, comme illustré ci-dessous. Tout d'abord, demandez un ticket pour le service HOST du serveur actuel via la fonction asktgs, puis créez un service système via krbscm pour obtenir le privilège SYSTEM.
KRBUACBypass.exe asktgs
KRBUACBypass.exe krbscm
