Saltar al contenido

Kerberoasting y AS-REP Roasting: por qué una cuenta de servicio débil derrumba el dominio

    Kerberoasting y AS-REP Roasting:

    por qué una cuenta de servicio débil derrumba el dominio

    Serie Red Team / Active Directory  |  unfantasmaenelsistema.com

    En los artículos anteriores de esta serie quedó dibujado el mapa: Active Directory es un grafo de permisos y confianzas, y BloodHound sirve para ver por dónde se puede llegar de «un usuario cualquiera» a «Domain Admin». Kerberoasting es una de las aristas más repetidas de ese grafo, y tiene una particularidad incómoda: no explota ningún fallo de software. Explota una decisión de diseño de Kerberos de hace veinticinco años combinada con una contraseña que alguien puso en 2014 y nunca cambió.

    Este artículo explica el mecanismo a alto nivel, por qué funciona, y —sobre todo— cómo se detecta y se mitiga en tu propio dominio. No es una guía de intrusión: no hay comandos de ataque paso a paso. El crackeo del ticket, que es un problema de fuerza bruta sobre GPU, ya se trató en el artículo de Hashcat y no se repite aquí.

    Qué aprenderás en este artículo

    Cómo entrega Kerberos un ticket de servicio y por qué ese ticket es «crackeable» · Por qué cualquier usuario autenticado puede pedirlo: el fallo es de diseño, no de configuración · Qué es AS-REP Roasting y en qué se parece y se diferencia de Kerberoasting · Por qué el cifrado RC4 (etype 0x17) convierte el ataque en trivial frente a AES · Detección con Event ID 4769, análisis de patrones y cuentas trampa (honeypot SPN) · Mitigación real: gMSA, contraseñas largas, forzar AES, mínimo de SPN y Protected Users

    1. Recordatorio rápido: cómo funciona Kerberos

    Kerberos es el protocolo de autenticación por defecto en un dominio de Active Directory. La idea es evitar que la contraseña del usuario viaje una y otra vez por la red. En su lugar hay un intermediario de confianza —el KDC, que en la práctica es el controlador de dominio— que reparte tickets.

    • Al iniciar sesión, el cliente pide un TGT (Ticket Granting Ticket) al KDC. Para probar que es quien dice, envía una marca de tiempo cifrada con una clave derivada de su contraseña: es la preautenticación.
    • Con el TGT en mano, cuando el usuario quiere usar un servicio (un servidor SQL, un recurso compartido, una web interna) pide un TGS (Ticket Granting Service) para ese servicio concreto.
    • El servicio se identifica por su SPN (Service Principal Name), una cadena como `MSSQLSvc/sql01.lab.local:1433` que asocia un servicio y un puerto a la cuenta que lo ejecuta.
    • El KDC responde con el TGS. Parte de ese ticket va cifrada con la clave de la cuenta del servicio, para que solo ese servicio pueda leerlo al recibirlo.

    Ese último punto es la clave de todo. La «clave de la cuenta del servicio» se deriva directamente de la contraseña de esa cuenta. Si la cuenta de servicio es una cuenta de usuario normal (`svc_sql`, `svc_backup`, `iis_app`…), su clave es una función de una contraseña que escribió una persona.

    2. Kerberoasting: el ataque en una frase

    Un atacante que ya tiene una cuenta de dominio cualquiera —no necesita ser administrador de nada— pide al KDC un TGS para un servicio con SPN. El KDC se lo entrega sin comprobar si esa cuenta tiene permiso real para usar el servicio: la autorización se supone que la hará el propio servicio más tarde. El atacante nunca contacta con el servicio. Se queda con el ticket, extrae la porción cifrada con la clave de la cuenta de servicio y se la lleva a otra máquina.

    Fuera del dominio, sin hacer ruido y sin límite de intentos, prueba millones de contraseñas: para cada candidata deriva la clave, intenta descifrar el ticket y comprueba si el resultado tiene la estructura esperada. Cuando una funciona, ha recuperado la contraseña en claro de la cuenta de servicio. Si esa cuenta pertenece a un grupo con privilegios —y las cuentas de servicio históricas suelen estar en «Domain Admins» «por comodidad»— el dominio ha caído.

    Por qué esto es un fallo de diseño, no un despiste

    Cualquier principal autenticado puede solicitar un TGS para cualquier SPN del dominio. Es un comportamiento intencionado del protocolo: la comprobación de acceso se delega en el servicio de destino. El atacante se salta esa comprobación simplemente por no llegar nunca a hablar con el servicio. No hay un permiso que «quitar» para impedirlo del todo; solo se puede reducir la superficie y detectar el abuso.

    3. El papel del cifrado: RC4 frente a AES

    No todos los tickets son igual de fáciles de atacar. El tipo de cifrado (`etype`) con el que el KDC protege el TGS determina cuánto cuesta el crackeo offline:

    etypeAlgoritmoDerivación de claveCoste para el atacante
    0x17 (23)RC4-HMACClave = hash NTLM de la contraseña, sin sal ni iteracionesMuy bajo: miles de millones de intentos por segundo en GPU
    0x12 (18)AES256-CTS-HMAC-SHA1-96PBKDF2 con 4096 iteraciones y sal por dominio+cuentaMucho más alto: el KDF lento frena la fuerza bruta
    0x11 (17)AES128-CTS-HMAC-SHA1-96Igual que AES256 pero clave de 128 bitsAlto, similar a AES256 para este propósito

    La diferencia es enorme. Con RC4, la clave es literalmente el hash NTLM: sin sal, sin estiramiento, idéntico al que se ataca en cualquier volcado de credenciales. Con AES, cada intento pasa por 4096 rondas de PBKDF2, lo que multiplica el tiempo por varios órdenes de magnitud. Por eso una de las mitigaciones más efectivas es forzar AES en las cuentas de servicio y, donde se pueda, deshabilitar RC4 en el dominio.

    El truco del downgrade

    Aunque una cuenta admita AES, un atacante puede pedir explícitamente el ticket en RC4 si el KDC todavía lo permite. Configurar el atributo `msDS-SupportedEncryptionTypes` de la cuenta para que solo ofrezca AES, y auditar (o eliminar) el soporte de RC4 a nivel de dominio, cierra esa vía de degradación.

    4. AS-REP Roasting: la variante que ni siquiera necesita una cuenta

    AS-REP Roasting ataca el primer paso de Kerberos, el de la preautenticación. Normalmente, para pedir un TGT hay que demostrar que conoces la contraseña enviando esa marca de tiempo cifrada. Pero existe una opción en cada cuenta —»No requiere autenticación previa de Kerberos» (`DONT_REQ_PREAUTH` en `userAccountControl`)— que desactiva ese requisito.

    Cuando una cuenta la tiene activada, cualquiera puede pedir un TGT para ella sin autenticarse en absoluto. El KDC responde con un AS-REP que contiene una porción cifrada con la clave del usuario. A partir de ahí, el ataque es idéntico: crackeo offline por diccionario y reglas. La diferencia es que el atacante no necesita ninguna credencial previa; le basta con conocer o adivinar nombres de cuenta.

    KerberoastingAS-REP Roasting
    ObjetivoCuentas con SPN (cuentas de servicio)Cuentas con preautenticación deshabilitada
    Requisito previoUna cuenta de dominio válida cualquieraNinguno (solo el nombre de la cuenta)
    Mensaje que se capturaPorción del TGS (Event ID 4769)Porción del AS-REP (Event ID 4768)
    Cifrado que interesa al atacanteRC4 (etype 0x17)RC4 (etype 0x17)
    Causa raízDiseño del protocolo (cualquiera pide un TGS)Configuración explícita de la cuenta
    Mitigación principalgMSA, contraseñas largas, AES, menos SPNNo deshabilitar la preautenticación; si es imprescindible, contraseña muy larga

    La opción de saltarse la preautenticación suele aparecer por compatibilidad con sistemas antiguos (Unix con implementaciones de Kerberos limitadas, dispositivos heredados). Conviene auditarla periódicamente: casi nunca sigue siendo necesaria y casi nadie recuerda haberla puesto.

    5. Detección: qué se ve en los logs

    Kerberoasting deja rastro porque cada solicitud de ticket de servicio genera un evento en el controlador de dominio: el Event ID 4769 («Se solicitó un vale de servicio Kerberos»). El problema es que ese evento se genera también miles de veces al día por actividad legítima, así que la detección no es «ver un 4769» sino ver un patrón.

    SeñalDónde se miraPor qué llama la atención
    4769 con `Ticket Encryption Type = 0x17`Seguridad del DC, campo del eventoEn un dominio que ya usa AES, una petición RC4 explícita es anómala
    Muchos 4769 distintos desde una misma cuenta en poco tiempoCorrelación en el SIEM por `Account Name` origenUn usuario normal pide tickets para 2 o 3 servicios al día, no para 40 en un minuto
    4769 para SPN que esa cuenta no usa nuncaLínea base de qué servicios toca cada usuarioEnumeración de todos los SPN del dominio, no uso real
    `Failure Code = 0x0` pero sin conexión posterior al servicioCorrelación con logs del servicio (SQL, IIS…)Se pidió el ticket pero nunca se usó: el patrón del roasting
    4768 con preautenticación ausente + RC4Seguridad del DCIndicio de AS-REP Roasting contra una cuenta vulnerable

    Una regla razonable para empezar en un SIEM: alertar cuando una misma cuenta origen genera solicitudes 4769 para más de N SPN distintos en una ventana corta, dando más peso a las que llegan con cifrado RC4. Es una heurística, no una firma perfecta, pero cubre el caso ruidoso, que es el más habitual con herramientas automáticas.

    # Triaje rapido de 4769 con cifrado RC4 en un DC (lectura de eventos, no ataque)
    Get-WinEvent -FilterHashtable @{ LogName='Security'; Id=4769 } |
      Where-Object { $_.Message -match 'Tipo de cifrado de vale:\s+0x17' -or
                     $_.Message -match 'Ticket Encryption Type:\s+0x17' } |
      ForEach-Object {
        $x = [xml]$_.ToXml()
        [pscustomobject]@{
          Hora        = $_.TimeCreated
          CuentaOrigen = ($x.Event.EventData.Data | ? Name -eq 'TargetUserName').'#text'
          SPN          = ($x.Event.EventData.Data | ? Name -eq 'ServiceName').'#text'
          IP           = ($x.Event.EventData.Data | ? Name -eq 'IpAddress').'#text'
        }
      } | Group-Object CuentaOrigen | Sort-Object Count -Descending |
      Select-Object Name, Count

    Cuentas trampa (honeypot SPN)

    La detección más limpia es una cuenta señuelo: un usuario sin privilegios reales, con un SPN atractivo (por ejemplo `MSSQLSvc/backup-admin.lab.local`), una contraseña aleatoria de 64+ caracteres que nadie conoce ni usa, y sin ninguna sesión ni servicio real detrás. · Como ninguna actividad legítima pide jamás un ticket para ese SPN, cualquier Event ID 4769 dirigido a esa cuenta es, por definición, reconocimiento. Se configura una alerta de máxima prioridad al primer evento. Coste casi nulo, señal casi sin falsos positivos.

    6. Mitigación: cómo se cierra de verdad

    6.1 gMSA: cuentas de servicio administradas por el dominio

    La solución de fondo es no tener contraseñas humanas en las cuentas de servicio. Las gMSA (Group Managed Service Accounts) usan una contraseña de 240 bytes generada y rotada automáticamente por el propio dominio cada 30 días. Nadie la conoce, nadie la escribe y es imposible de crackear por fuerza bruta. Un ticket robado de una gMSA no lleva a ninguna parte. Migrar los servicios que lo soporten (SQL Server, IIS, tareas programadas, muchos servicios de terceros modernos) a gMSA elimina el problema de raíz para esas cuentas.

    6.2 Para las cuentas de servicio que no pueden ser gMSA

    • Contraseñas de 25+ caracteres, aleatorias, gestionadas en una bóveda. A partir de esa longitud y con suficiente entropía, el crackeo offline deja de ser viable aunque el ticket salga en RC4.
    • Forzar AES en la cuenta (`msDS-SupportedEncryptionTypes` solo AES) y trabajar para deshabilitar RC4 en todo el dominio.
    • Rotación periódica de esas contraseñas, idealmente automatizada.
    • Mínimo de SPN: revisar el atributo `servicePrincipalName` de las cuentas de usuario. Cada SPN sobrante en una cuenta de persona es un objetivo gratis. Los SPN duplicados o huérfanos se eliminan.

    6.3 Reducir el valor de lo que se pueda robar

    • Sacar las cuentas de servicio de los grupos privilegiados. Una cuenta de servicio casi nunca necesita ser «Domain Admin»; necesita permisos concretos sobre recursos concretos. Este único cambio convierte muchos Kerberoasting exitosos en callejones sin salida.
    • Protected Users para las cuentas de administración: los miembros de ese grupo no pueden usar RC4 ni DES y tienen otras protecciones de Kerberos. No es para las cuentas de servicio (rompe muchas), pero sí para los administradores.
    • AS-REP: revisar que ninguna cuenta tenga la preautenticación deshabilitada salvo que sea absolutamente imprescindible, y en ese caso tratarla como una cuenta de servicio débil (contraseña larguísima).
    MedidaQué atacaEsfuerzoEfecto
    Migrar a gMSAKerberoasting (raíz)Medio (por servicio)Elimina el problema para esa cuenta
    Contraseña 25+ aleatoriaKerberoastingBajoHace inviable el crackeo offline
    Forzar AES / quitar RC4Kerberoasting y AS-REPMedio (compatibilidad)Sube el coste del crackeo varios órdenes de magnitud
    Sacar de grupos privilegiadosImpacto post-crackeoBajoConvierte el éxito en un callejón sin salida
    Honeypot SPNDetecciónBajoAlerta temprana casi sin falsos positivos
    Auditar DONT_REQ_PREAUTHAS-REP RoastingBajoElimina el objetivo

    7. Practicarlo en el laboratorio

    Para entender el ataque y, sobre todo, para probar si tu detección funciona, hace falta un dominio de Active Directory de pruebas, aislado y sin salida a producción: un controlador de dominio y un cliente Windows en un rango 192.168.56.x, con un par de cuentas de servicio creadas a propósito (una con contraseña débil y RC4, otra con contraseña fuerte y AES) y una cuenta señuelo con su SPN.

    • Genera actividad de solicitud de tickets desde el cliente con una cuenta de usuario normal del laboratorio y observa los Event ID 4769 que aparecen en el DC: fíjate en el tipo de cifrado y en el SPN de destino.
    • Comprueba que tu regla de SIEM (o tu script de triaje) distingue el patrón ruidoso de la actividad normal de fondo.
    • Verifica que la cuenta señuelo dispara la alerta al primer acceso.
    • Cambia la cuenta de servicio débil por una gMSA y confirma que el ticket resultante ya no ofrece una vía de crackeo realista.
    • El paso de crackeo offline, si quieres cerrar el círculo, se hace con las herramientas y el enfoque del artículo de Hashcat, siempre sobre los tickets de tus propias cuentas de laboratorio.

    Uso legal y ético

    Kerberoasting y AS-REP Roasting son técnicas de compromiso de credenciales en Active Directory. Solicitar tickets para enumerar SPN, capturar material cifrado o intentar crackearlo en un dominio que no sea tuyo, o para el que no tengas autorización expresa y por escrito (un contrato de auditoría con su alcance definido), es ilegal, aunque en apariencia «solo se pidan tickets». · En España, el acceso no autorizado a un sistema de información y el mantenimiento en él contra la voluntad de quien tiene derecho a excluirlo están tipificados en el art. 197 bis del Código Penal; la obtención, facilitación o posesión de herramientas concebidas para ello, en el art. 197 ter; y los daños u obstaculización de sistemas ajenos, en el art. 264 y siguientes. El descubrimiento y revelación de secretos del art. 197 puede sumarse si hay datos personales de por medio. · Practica únicamente en un dominio de laboratorio propio y aislado (rango 192.168.56.x sin salida a producción). En tu organización, solo con autorización interna, una cuenta de auditoría y una ventana comunicada al equipo de seguridad.

    Referencias

    Microsoft — «Group Managed Service Accounts» y guía de cuentas de servicio (learn.microsoft.com) · Microsoft — «Decrypting the Selection of Supported Kerberos Encryption Types» (blog del equipo de AD) · MITRE ATT&CK — T1558.003 (Kerberoasting), T1558.004 (AS-REP Roasting) · The Hacker Recipes — Kerberos: Kerberoasting y ASREProast (secciones de detección y mitigación) · CISA / NSA — guías de endurecimiento de Active Directory y Kerberos · Nuestros artículos sobre el modelo de seguridad de Active Directory, BloodHound y Hashcat

    Conclusión

    Kerberoasting no es un exploit: es la factura de una decisión cómoda. Cada cuenta de servicio con contraseña de diccionario, cada SPN puesto «para que funcione» en una cuenta de persona, cada cuenta de servicio metida en «Domain Admins» por no perder una tarde configurando permisos, es un ticket que el KDC entregará educadamente a cualquiera que lo pida y que se romperá en una GPU esa misma noche.

    La defensa no pasa por un producto, sino por higiene: gMSA donde se pueda, contraseñas largas y aleatorias donde no, AES en lugar de RC4, cuentas de servicio con los permisos justos, una cuenta señuelo que avise, y una regla de correlación sobre el Event ID 4769. Ninguna de esas cosas se compra; todas se hacen. Y juntas convierten el ataque más fiable contra Active Directory en uno que hace ruido y no lleva a ningún sitio.

    unfantasmaenelsistema.com | Seguridad, sistemas y todo lo que no debería funcionar (pero funciona)

    Resumen de privacidad

    Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.