
Missbraucht Kerberos-Tickets, um die Windows UAC zu umgehen und SYSTEM-Berechtigungen zu erlangen, indem eine gefälschte MachineID in Service-Tickets injiziert wird, unter Verwendung des tgtdeleg-Tricks und SCM-Zugriffs.
Dieser POC wurde inspiriert von James Forshaw (@tiraniddo), der auf der BlackHat USA 2022 einen Vortrag mit dem Titel „Taking Kerberos To The Next Level“ hielt und eine Demo zum Missbrauch von Kerberos-Tickets zur Umgehung der UAC zeigte. Durch das Hinzufügen eines KERB-AD-RESTRICTION-ENTRY zum Dienstticket, aber mit einer gefälschten MachineID, können wir die UAC leicht umgehen und SYSTEM-Privilegien erlangen, indem wir auf den SCM zugreifen, um einen Systemdienst zu erstellen. James Forshaw erklärte die dahinterstehende Logik in einem Blogbeitrag mit dem Titel „Bypassing UAC in the most Complex Way Possible!“, der mich sehr interessierte. Obwohl er den vollständigen Exploit-Code nicht zur Verfügung stellte, habe ich einen POC basierend auf Rubeus erstellt. Als C#-Toolset für die direkte Kerberos-Interaktion und den Missbrauch von Tickets bietet Rubeus eine einfache Schnittstelle, mit der wir problemlos Kerberos-Anfragen initiieren und Kerberos-Tickets manipulieren können.
Weitere Artikel zu KRBUACBypass finden Sie in meinem Blog „Revisiting a UAC Bypass By Abusing Kerberos Tickets“, einschließlich des Hintergrundprinzips und der Implementierung. Wie im Artikel erwähnt, wurde dieser Artikel von @tiraniddos „Taking Kerberos To The Next Level“ inspiriert (ohne seine Offenlegung hätte ich es nicht gemacht) und ich habe ihn lediglich als Tool implementiert, bevor ich das College abschloss.
Wir können kein TGT manuell generieren, da wir keine aktuellen Anmeldeinformationen des Benutzers haben und keinen Zugriff darauf haben. Allerdings hat Benjamin Delpy (@gentilkiwi) in seinem Kekeo einen Trick (tgtdeleg) hinzugefügt, der es erlaubt, unconstrained Delegation zu missbrauchen, um ein lokales TGT mit einem Sitzungsschlüssel zu erhalten.
Tgtdeleg missbraucht die Kerberos GSS-API, um verfügbare TGTs für den aktuellen Benutzer zu erhalten, ohne erhöhte Privilegien auf dem Host zu erlangen. Diese Methode verwendet die AcquireCredentialsHandle-Funktion, um das Kerberos-Sicherheitsanmeldeinformationshandle für den aktuellen Benutzer zu erhalten, und ruft die InitializeSecurityContext-Funktion für HOST/DC.domain.com mit dem ISC_REQ_DELEGATE-Flag und dem Ziel-SPN auf, um den Pseudo-Delegationskontext vorzubereiten, der an den Domänencontroller gesendet wird. Dies führt dazu, dass die KRB_AP-REQ in der GSS-API-Ausgabe die KRB_CRED im Authenticator-Prüfsumme enthält. Der Sitzungsschlüssel des Diensttickets wird dann aus dem lokalen Kerberos-Cache extrahiert und verwendet, um die KRB_CRED im Authenticator zu entschlüsseln, um ein verwendbares TGT zu erhalten. Das Rubeus-Toolset enthält ebenfalls diese Technik. Einzelheiten finden Sie unter „Rubeus – Now With More Kekeo“.
Mit diesem TGT können wir unser eigenes Dienstticket generieren, und der mögliche Ablauf ist wie folgt:
KERB-AD-RESTRICTION-ENTRY hinzu, aber füllen Sie eine gefälschte MachineID ein.Sobald Sie ein Dienstticket haben, können Sie die Kerberos-Authentifizierung verwenden, um auf Named Pipes oder TCP des Service Control Managers (SCM) über HOST/HOSTNAME oder RPC/HOSTNAME SPN zuzugreifen. Beachten Sie, dass die Win32-API des SCM immer die Negotiate-Authentifizierung verwendet. James Forshaw hat einen einfachen POC erstellt: SCMUACBypass.cpp, bei dem durch die beiden APIs HOOK AcquireCredentialsHandle und InitializeSecurityContextW der Name des vom SCM aufgerufenen Authentifizierungspakets (pszPack age) in Kerberos geändert wird, damit der SCM bei der lokalen Authentifizierung Kerberos verwenden kann.
Für weitere Details lesen Sie bitte:
Werfen wir nun einen Blick auf die Ausführung, wie in der Abbildung unten gezeigt. Fordern Sie zuerst ein Ticket für den HOST-Dienst des aktuellen Servers über die asktgs-Funktion an, und erstellen Sie dann einen Systemdienst über krbscm, um das SYSTEM-Privileg zu erlangen.
KRBUACBypass.exe asktgs
KRBUACBypass.exe krbscm
