In diesem Blogeintrag soll es um zwei bekannte “Angriffe” auf das Kerberos Protokoll gehen. Ich schreib “Angriffe” in Hochkomma, denn obwohl im Zusammenhang von “Golden” und Silver” Ticket häufig von Angriffen auf Kerberos gesprochen wird, so wird hier ledglich eine Information ansgenutzt die ein normaler Nutzer nicht haben sollte. Es wird keine Schwachstelle im eigentlichen Protokoll ausgenutzt.
Bei beiden Angriffen geht es darum Kerberos Ticket zu fälschen. Damit gehören sie zu T1558 (“Steal or Forge Kerberos Tickets”) der Mittre ATT&CK Matrix.
Wie im Einführungsartikel zu Kerberos beschrieben, benötigt ein Client für den Zugriff auf einen Service ein Service Ticket oder auch TGS (Ticket-Granting Service). Das Ticket bekommt der Client vom Domain Controller wenn er seine Identität mit Hilfe seines Passworts (Zertifikat) nachweisen kann und keine Kerberos-Policy gegen die Ausstellung eines TGT/TGS gibt. Vereinfacht dargestellt ist der Ablauf wie folgt:
Aus dem Ablauf ergeben sich einige Vorrausetzungen, die für die korrekte und sichere Arbeitsweise von Kerberos gelten müssen:
Bei einem Golden Ticket erstellt der Angreifer ein gefälschtes TGT inklusive eines Privileged Attribute Certificate (PAC). Das PAC enthält die Identität des Benutzers und damit seine SID, seine Gruppen und alles was sonst noch im PAC steht. Dies kann ein Angreifer tun, wenn in den Besitz - wie auch immer - vom Passworthash vom KRBTGT Benutzer kommt. Damit kann er Schritt 1 und 2 aus dem oben dargestellten Ablauf übergehen und gleich einen eigenen Sitzungschlüssel und ein TGT erzeugen. Mit den Daten kann er dann direkt die Service Tickets (TGS-REQ) beim Domain Controller anfragen.
Dafür benötigt der Angreifer folgende Daten:
Solange das Ticket nicht älter als 20 Minuten ist, wird der Domain Controller keine Überprüfung durchführen, ob der Benutzer aktiviert ist, geändert wurde oder überhaupt existiert.
Bei einem Silver Ticket kennt der Angreifer den Passworthash von einem Service (meist Computerkonto), auf den er gerne Zugreifen würde. Mit der Hilfe des Passworthash erstellt der Angreifer dafür ein eigenes Service Ticket (TGS), inklusive der Benutzeridentität (PAC), die er gerne hätte. Er überspringt damit die Schritte 1 - 4 vom oben dargestellten Ablaufs. Wenn die sogenannte Privilege Attribute Certificate Validation nicht durchgeführt wird, was bei den meisten Operationen aus Performancegründer der Fall ist, so akzeptiert das Zielsystem, das Ticket so wie es ist. Ich habe es in meiner Demo Umgebung nicht geschafft eine PAC Validierung zu aktiveren.
Für ein Silver Ticket benötigt der Angreifer folgende Daten:
Auch wenn ich hier die ganze Zeit von einem Zielsystem schreibe, sind damit alle Teilnehmer im Kerberosnetzwerk gemeint, die ein Service Principal Name haben, für die also Kerberos Tickets erzeugt werden können.
Für beide Angriffe gibt es zahlrieche Tools, die es ermöglichen den Angriff durchzuführen. Eine Information die häufig zu beginn fehlt ist die Domänen-Sid. Diese kann beispielsweise mit der Hilfe folgenden Powershell-Einzeiler erhalten werden:
(New-Object Security.Principal.NTAccount krbtgt).Translate([Security.Principal.SecurityIdentifier]).Value
Das funktioniert natürlich nur, wenn ihr bereits auf einem Computer seid, der Mitglied in der Domäne ist.
Ein weitere Punkt der oftmals vergessen wird ist, dass Kerberos auf FQDNs aufbaut. Dies gilt vorallem wenn ihr Lateral Movement von einem Windows System auf das nächste System durchführen wollt. Sprich: wenn ein Ticket erzeugt wird und ihr das Ticket in einen Prozess einfügt, so wird das Ticket nur vom Windows Security Subsystem verwendet, wenn ihr für euer Ziel den FQDN (mindestens den Hostnamen) verwendet. Wenn ihr beispielsweise nach der Erstellung eines Tickets PSEXEC mit der IP-Adresse eures Ziels verwendet, so wird Windows versuchen die Anmeldung über NTLM durchzuführen. Was dann natürlich scheitert.
Bei Mimikatz muss zum Erstellen von gefälschten Tickets, dass Modul Kerberos mit der Funktion golden verwendet werden. Die Funktion benötigt folgende Parameter:
Darüberhinaus existieren noch zahlreiche weitere Parameter, die verwendet werden können. Eine (vollständige) Liste finden ihr hier. Ein besonderer Schalter der Funktion, der gerade bei den ersten Gehversuchen immer wieder für Verwirrung sorgt, ist /ptt. Im Gegensatz zu sekrulsa::pth, bei dem ein neues Fenster aufgeht, wird hier das Ticket in den aktuellen Prozess injiziert. Das bedeutet, wenn der Schalter verwendet wird, muss Mimikatz beendet werden und es muss der aktuelle Prozess verwendet werden, um das Ticket zu verwenden. Alternativ könnt ihr auch mit misc::cmd eine neue CMD mit den aktuellen Anmeldedaten starten. Wenn der Schalter nicht verwendet wird, so wird das Ticket in einem KIRBI-File auf die Platte geschrieben.
Ein weitere Tipp den ich euch geben kann ist, dass ich immer den Befehl kerberos::purge verwende, bevor ich ein Ticket erzeuge. Damit verhindert ihr, dass Windows potentiell ein noch vorhandenes Ticket verwendet.
Im Anschluss an die Erstellung vom Golden Ticket, könnt ihr euch jetzt mit den üblichen Methoden wie PSEXEC, WINRM, WMI oder was auch sonst die Windows integrierte Anmeldung unterstützt auf weitere Systeme verbinden. Da der Domain Controller davon ausgeht, dass nur er ein TGT erzeugen kann und solange das TGT noch jung ist, werden die Daten blind übernommen. Das kann beispielsweise beobachtet werden, wann ihr euch die Sitzung auf dem Zielsystem im Bild anschaut. In meiner Testumgebung gibt es weder einen IronMan mit RID 888, noch die Gruppe 666. Dennoch wird beides in die Benutzersitzung auf dem Zielsystem übernommen.
Auch KerberosRun bietet die Möglichkeit unter Windows Golden Tickets zu erzeugen.
Unter Linux können Kerberos Tickets erzeugt werden. Dafür kommt hier das Tool impacket zum Einsatz. Genauer gesagt kann das das Skript ticketer.py dazu verwendet werden.
Im Anschluss wird der Pfad zum Ticket in die Variable KRB5CCNAME gespeichert. Anschließend kann psexec.py, wmiexec.py oder eines der zahlreichen anderen Skripte aus dem Projekt verwendet werden.
Mimikatz die Erstellung von Silver Tickets funktioniert ähnlich wie die Erzeugung von Golden Tickets. Dafür werden allerdings zwei Angaben mehr benötigt:
Der Service gibt an, wie ihr auf das Ziel zugreifen wollt. Eine Liste aller bekannten Service-Klassen findet ihr hier. Hier mal eine kleine Übersicht der wichtigsten Services und Tools:
Service | Zugriffsprotokoll | Beispiel Tool |
---|---|---|
CIFS | SMB | PSEXEC |
HTTP | HTTP (SOAP) | winrm |
LDAP | LDAP | Mimikatz: DCSync |
HOST | Verschiedene | MMC |
Die Erstellung eines Silver Tickets funktioniert ähnlich wie die Erzeugung eines Golden Tickets.
Analog zu Golden Ticket, kann auch hier wieder impacket verwendet werden, um ein verwertbares Silver Tickets zu erzeugen.
Während ich an diesem Artikel schrieb stellte ich mir die Frage, ob es möglich ist Kerberos von einem Standalone-Client aus ohne Dritt-Software zu verwenden. Die Lösung auf die Frage, gab mir folgender Tweet.
Tatsächlich konnte ich mit der im Tweet genannte Methode, von einem Standalone-Client auf einen Domain Controller zugreifen. Leider hab ich keinen Weg gefunden, wie ich von einem Standalone System mit Bordmitteln auf andere Systeme in der Domäne zugreifen konnte.
Microsoft bietet die Möglichkeit die zu verwendenten Verschlüsselungsalgorithmen für Kerberos einzuschränken. Dafür gibt es folgende Richtlinie:
Wenn die Richtlinie wie oben konfiguriert ist und ihr ein Silver Ticket mit Hilfe von RC4 Verschlüsselung erstellt (/rc:XXX), wird euch folgende Fehlermeldung bei der Anmeldung auf dem Zielsystem erwarten.
In dem Falle könnt ihr nochmal versuchen ein Ticket zu erstellen, allerdings dann mit der AES128 oder AES256 Verschlüsselung. Dazu kann in Mimikatz der Schalter /aes128 oder /aes256 anstatt von /rc4 verwendet werden. Impacket bzw. ticketer.py bietet ebenfalls eine entsprechende Option an.
Da ihr damit allerdings einen Anmeldefehler auf dem Zielsystem erzeugt, ist es ratsam vorher zu prüfen ob es Einschränkungen bei der Kerberos Verschlüsselung gibt. In der Praxis habe ich das allerdings noch nie gesehen. Wenn ihr auf einem System in der Zieldomäne bereits gelandet seid, kann die Kerberos Einstellung entweder mittels PowerShell oder CMD geprüft werden:
(Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\Parameters\ -Name supportedencryptiontypes).supportedencryptiontypes
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\Parameters /v supportedencryptiontypes
Wenn der Key nicht vorhanden ist oder nicht den Wert 0x7ffffff8 (2147483640) zeigt, könnt ihr alle Verschlüsselungarten RC4 und aufwärts verwenden. Die Richtlinie scheint allerdings keinen Einfluss auf “Golden Tickets” zu haben.
Wie immer gilt falls ihr Fragen, Anmerkungen oder Verbesserungsvorschläge zu dem Artikel habt, schreibt eine Mail an info@hackmich.net.