Análisis técnico de las vulnerabilidades Kerberos CVE-2022-33679 y CVE-2022-33647

Inicio » Blog » Análisis técnico de las vulnerabilidades Kerberos CVE-2022-33679 y CVE-2022-33647

Escrito por Yoav Iellin y Dor Segal, investigadores de Silverfort

El martes de parches de septiembre de 2022 de Microsoft incluyó dos vulnerabilidades de elevación de privilegios de alto riesgo en Kerberos, que fueron descubiertas por Google Project Zero. Las dos vulnerabilidades aprovechan la capacidad de obligar a Kerberos a degradar su codificación del cifrado AES predeterminado al obsoleto MD4-RC4. Una vez que se degrada el cifrado, las dos vulnerabilidades entran en juego y permiten a un atacante aprovechar las debilidades del cifrado MD4-RC4.

El primero, CVE-2022-33679, permite a un atacante obtener una sesión autenticada en nombre de la víctima, lo que puede provocar la ejecución de código arbitrario. El segundo, CVE-2022-33647, permite a un atacante que ya haya logrado realizar un ataque Man-in-the-Middle emitir tickets de servicio Kerberos en nombre del usuario objetivo, obteniendo así los mismos privilegios que el usuario.

Es importante tener en cuenta que, si bien ambas vulnerabilidades apuntan a debilidades en el cifrado MD4-RC4 heredado, cada una abusa de una debilidad diferente, lo que resulta en diferentes requisitos previos y escenarios de ataque.

Este artículo incluye un análisis técnico detallado y una explicación tanto de CVE-2022-33679 como de CVE-2022-33647.

CVE-2022-33679 – Análisis de vulnerabilidad

La vulnerabilidad CVE-2022-33679, para lo cual recientemente se realizó una prueba de concepto liberado, reside en cómo Kerberos cifra su clave de sesión y es posible gracias al uso de Kerberos del anticuado tipo de cifrado RC4-MD4. El ataque consta de dos partes: A) solicitar un nuevo ticket TGT utilizando el tipo electrónico RC4-MD4, seguido de B) una ruptura byte a byte del flujo de claves.

Proceso de explotación:

  1. Obtenga el ticket TGT enviando el paquete AS-REQ al servidor KDC. la solicitud debe solicitar el tipo de cifrado RC4-MD4. Para que el ataque tenga éxito, se deben cumplir los dos requisitos siguientes:
    1. Degradar explícitamente el cifrado de Kerberos desde su AES predeterminado al RC4-MD4 más débil. Esto hace posible el ataque porque su clave es de solo 8 bytes sin IV ni sal.  
    2. El objeto del usuario tiene habilitado el indicador "No requiere autenticación previa de Kerberos". Esto permite obtener un TGT con una clave de sesión cifrada sin necesidad de conocer la contraseña del usuario. Pre autenticación es un mecanismo donde el cliente cifra la marca de tiempo actual con la contraseña ingresada y la envía al KDC donde valida la integridad de la contraseña antes de generar una clave de sesión y un TGT. Debido al indicador "No requiere autenticación previa de Kerberos", el KDC puede ser atacado directamente y no requiere ninguna técnica de ataque especial como Man In The Middle.
  2. Después de que el atacante obtiene con éxito un ticket cifrado, el paquete AS-REP consta de una clave de sesión TGT cifrada de 40 bits de longitud. Utilizando el anticuado tipo de cifrado RC4-MD4, el atacante puede aprovechar su conocimiento del inicio fijo del paquete cifrado para extraer 45 bytes del flujo de claves.
  3. Ahora el atacante puede usar este flujo de claves para volver a cifrar y solicitar un ticket TGT del KDC con una autenticación previa personalizada que se usará para verificar si el flujo de claves es correcto y romper el resto de la siguiente clave de sesión TGT de 40 bits. byte a byte. Esto se hace abusando de dos debilidades en el protocolo ASN.1 utilizado para la codificación Kerberos, para aprovechar el control limitado del atacante sobre el tamaño del campo de autenticación previa:
    1. El analizador KDC ignora las cadenas terminadas en NUL al final del objeto. Esto nos permite agregar un carácter NUL al final del objeto KerberosTime. Esto funcionará para adivinar un solo byte, pero aún necesitamos adivinar cuatro más.
    2. El analizador KDC no valida la longitud de las longitudes codificadas. Las longitudes de las cadenas ASN.1 están representadas por 1 a 4 bytes y el analizador KDC ASN.1 no aplica el camino más corto. Por lo tanto, podemos representar la longitud de nuestra cadena de marca de tiempo con un tamaño de 1 a 4 bytes como deseemos. Significa que podemos ampliar aún más la longitud del texto sin formato y empujar el byte NUL a la siguiente posición y adivinar el siguiente byte del flujo de claves.
  4. Por último, el atacante puede volver a cifrar la marca de tiempo y validar cada suposición enviando un AS-REQ con autenticación previa cifrada y recibirá un error si la fecha de autenticación previa cifrada es incorrecta. En caso de que la autenticación previa tenga éxito, el atacante puede descubrir otro byte del flujo de claves, ya que hay hasta 256 opciones de adivinación para cada byte. Repetir este proceso permite obtener todos los bytes del flujo de claves necesarios para descifrar la clave de sesión almacenada en el ticket original.

La clave de sesión obtenida le da al atacante la posibilidad de solicitar un ticket a cualquier SPN en nombre del usuario objetivo.

Flujo de ruptura del primer byte de la clave de sesión AS-REQ mediante CVE-2022-33679. Debe ir seguido de los bytes restantes.
Flujo de ataque continuo, rompiendo el último byte y obteniendo un nuevo TGT usando la clave de sesión rota
Crédito: POC de James Forshaw y Rubeus de GhostPack

CVE-2022-33647 Análisis técnico

Afortunadamente para el atacante, la vulnerabilidad CVE-2022-33647 funciona con autenticación previa, a diferencia de CVE-2022-33679. Esto es importante porque la autenticación previa está habilitada de forma predeterminada para cada objeto creado en Active Directory. El principal requisito para este ataque es un intermediario entre el cliente y el controlador de dominio (este tipo de ataque es común y hay muchas formas de lograrlo, como suplantación de DNS, envenenamiento de ARP, etc.). El MITM se utiliza para obligar al cliente a degradar el cifrado a MD4-RC4.

Flujo de explotación

Cuando el cliente envía la primera solicitud de AS, el KDC responde con el mensaje "Se requiere autenticación previa". Sin embargo, el atacante puede alterar la respuesta del KDC porque en esta etapa de la autenticación no hay verificación. Modificaremos el cifrado admitido por el KDC a RC4-MD4 como se muestra en la figura. Como resultado (si RC4 está habilitado), el cliente enviará un AS_REQ con autenticación previa utilizando el algoritmo MD4-RC4.

A partir de este punto, el atacante tiene dos opciones:

  1. Fuerza bruta la clave de sesión de 5 bytes, lo que podría no ser tan eficiente y llevar mucho tiempo.
  2. La otra opción es aprovechar el conocimiento de los datos de texto sin formato: la autenticación previa. En Kebreros, el adversario MITM puede tener una estimación precisa de la marca de tiempo de autenticación previa en texto sin formato creada por el cliente en la solicitud AS. El mecanismo de cifrado carece de un vector de inicialización o nonce e ignora el valor de uso de la clave. Como resultado, se utiliza el mismo flujo de claves en diferentes partes del intercambio de autenticación. Entonces, la mayor parte del flujo de claves utiliza el mismo flujo de claves RC4. La autenticación previa contiene una marca de tiempo cifrada, por lo que, utilizando nuestro conocimiento de la hora actual, el atacante puede descubrir parte del flujo de claves. Si el atacante tiene suerte, se utilizará el mismo flujo de claves para descifrar 4 bytes de la clave de sesión TGT en la respuesta de AS. El último byte se superpone con el byte menor de la marca de tiempo, que representa microsegundos, que el atacante desconoce. El último byte se romperá en un ataque de fuerza bruta contra una solicitud TGS lograda por la víctima, como se describe a continuación.

Ampliación de serialización ASN.1

La codificación ASN.1 DER es un sistema de codificación de etiquetas, longitud y valores para cada elemento. La marca de tiempo de autenticación previa se codifica mediante este método. La estructura de la marca de tiempo codificada consta de una secuencia con dos elementos. El primero, un objeto GeneralizedTime (KerberosTime) en formato Zulu. El segundo elemento es un número entero que representa los microsegundos.

Cada elemento tiene su propia etiqueta y longitud después del valor. Por este motivo, podemos identificar 10 bytes constantes que representan todas las etiquetas y longitudes.

  • 30 -> Etiqueta de secuencia
  • 1A – (int) 26 (longitud de toda la estructura)
  • A0 – Etiqueta del primer elemento
  • 11 – longitud del elemento
  • 18 – Generalizar la etiqueta de tiempo
  • 0F – (int) valor longitud (15)
  • A1 – Etiqueta del segundo elemento
  • 05 – (int) longitud del elemento
  • 02 – etiqueta de tipo INTEGER
  • 03 – (int) longitud del valor

La cantidad total de bytes constantes es 10, agregaremos otros 15 bytes de longitud para adivinar la marca de tiempo. Los últimos tres bytes son el elemento de microsegundos que no es eficiente de adivinar. Finalmente, 24 bytes adicionales de ceros antes de la parte cifrada generarán un flujo de claves de 49 bytes. La clave de sesión TGT se encuentra entre los bytes 46 y 50 de la respuesta de AS. El último byte del flujo de claves que falta puede ser forzado de forma bruta contra un ticket de servicio interceptado de la víctima.

Patch

Microsoft cerró estas vulnerabilidades en la actualización de seguridad de septiembre. La actualización deshabilitó el tipo de cifrado RC4-MD4 (-128) junto con el tipo de cifrado RC4-HMAC-OLD (-133). Una vez parcheado, los futuros AS-REQ/TGS-REQ que utilicen uno de estos dos tipos de cifrado recibirán el error "Tipo de cifrado no compatible".

https://msrc.microsoft.com/update-guide/vulnerability/CVE-2022-33679

Información adicional

https://bugs.chromium.org/p/project-zero/issues/detail?id=2310&q=label%3ACVE-2022-33647 – análisis de James Forshaw

Detenga las amenazas a la identidad ahora