Mi 1er CVE – Captura de Credenciales LDAP de FortiGate.

4 minute read

English here

En Julio del 2018 informé al equipo de desarrollo de Fortinet sobre una vulnerabilidad que descubrí en la forma en que el FortiGate (versión 6.0.2 y anteriores) manejaba las credenciales de LDAP almacenadas en el dispositivo, esta permitía a un administrador con acceso de lectura modificar la solicitud de LDAP para apuntar a otro servidor y de esta forma capturar las credenciales en texto plano. En este post explicaré cómo descubrí la vulnerabilidad y ciertas recomendaciones para los administradores de Active Directory a la hora de configurar cuentas de servicio para LDAP.

Agradezco al equipo de Fortinet quienes mantuvieron la comunicación activa desde el momento que reporté la vulnerabilidad hasta la resolución de la misma; discutimos de qué forma esto podría ser abusado por un cibercriminal y en Noviembre del 2018 Fortinet hizo pública la vulnerabilidad, agradeciéndome en su sitio web https://fortiguard.com/psirt/FG-IR-18-157 por la divulgación responsable y asignó el CVE ID CVE-2018-13374 al descubrimiento.

FortiGuard

CVE

¿Qué es un CVE? por sus siglas en ingles Common Vulnerability Exposure, es una lista de vulnerabilidades de seguridad de la información públicas. Concede la posibilidad de identificar cada vulnerabilidad, asignando a cada una un código único.

Explicación del Descubrimiento

Mientras configuraba LDAP en el FortiGate, noté que luego de guardar la configuración al intentar editar la casilla de password tenía *****

FortiGate-LDAP

En ese momento me pregunté, ¿Qué tal si yo pudiera leer este password? Abrí Burp Suite para analizar la petición y al hacer clic en “Test Connectivity”, noté que esta generaba una solicitud GET con algunos parámetros en formato json.

BurpReq-1

Llamaron mi atención algunas variables: server, port y secure. Como esta solicitud se está haciendo desde mi navegador, significa que tengo el control de su contenido y si el FortiGate no está aplicando controles internos podría aceptar cualquier alteración. En ese momento pensé, ¿Qué pasaría si yo cambio la IP por mi maquina?

Inicié netcat en mi maquina, escuchando en el puerto 389 e hice la modificación de la dirección IP en la solicitud de prueba de conexión teniendo el siguiente resultado:

Solicitud modificada

BurpReq-2

NetCat

NetCat-1

Eureka! Puedo hacer que el FortiGate me envíe el password de LDAP y de esta forma extraer las credenciales en texto plano.

Continué con mi investigación, buscando la forma de proteger las credenciales y configuré LDAPS, esta es la variación de LDAP que incorpora SSL para transferir las credenciales de forma segura. Luego de hacer la configuración, e intentar conectar este fue el resultado.

FortiGate-LDAP2

Solicitud modificada

BurpReq-3

NetCat

NetCat-2

Ahora el password está cifrado y no podemos leerlo, sin embargo, comparemos ambas solicitudes y resaltemos los campos más importantes:

FortiGate-LDAP3

La solicitud con LDAPS hace un cambio de puerto a 636 (puerto por defecto de LDAPS), cambia el valor de secure a 2 e incluye el certificado en la variable ca.

No obstante, en ese momento me pregunté, ¿Qué pasaría si cambio el valor de secure a la condición de LDAP (“secure”: 0)? y aquí el resultado:

Solicitud modificada

BurpReq-4

NetCat

NetCat-3

De esta forma pude capturar las credenciales de LDAP del FortiGate, independientemente de que si la conexión esté encriptada o no. Pero no todo terminó aquí, continuando con las pruebas cree un usuario de solo lectura y para mi sorpresa, este también podía extraer las credenciales de LDAP.

Esto me resultó muy crítico, porque algunos administradores comparten ciertas tareas con otros departamentos y/o usuarios, asignan privilegios de escrituras o solo lectura para ciertas tareas, si este es el caso, cualquier usuario con permisos de lectura o escritura podría obtener las credenciales de conexión con LDAP, si se utilizan cuentas con altos privilegios podría resultar en comprometer todo el Active Directory.

Python Script – CVE-2018-13374

Para simplificar las pruebas de esta vulnerabilidad cree un script en python3 que realiza todo el proceso de captura del usuario y credenciales de LDAP.

cve-2018-13374-py

El código fuente se encuentra en mi repositorio de Github.

Solución

Fortinet solucionó la vulnerabilidad en la versión 6.0.3, de modo que aquellos que utilicen versiones anteriores están expuestos a esta vulnerabilidad. Señalar también que:

  • No hay actualizaciones de esta vulnerabilidad para las versiones 5.4 y 5.6.
  • Un usuario con privilegios de escritura puede aún obtener las credenciales, la corrección solo aplica a los usuarios de solo lectura.

Recomendaciones

En sentido general cuando se configuran cuentas de servicios que necesiten algún tipo de integración con Active Directory, se acostumbra a utilizar cuentas con más privilegios de los que se necesita (ejemplo Domain Admins), esta practica puede afectar las organizaciones si estas cuentas son comprometidas por algún método.

Para los administradores al momento de configurar cuentas de servicio LDAP aquí algunas recomendaciones:

  • Crear una cuenta para estos fines, evitar reutilizar cuentas en múltiples servicios.
  • Passwords complejos, con al menos 25 caracteres.
  • Eviten usar grupos como Domain Admins para estas cuentas.
  • En la mayoría de los casos no es necesario utilizar una cuenta con privilegios administrativos, pueden hacer uso de una cuenta regular para estas configuraciones.
  • En caso de que sean necesarios más privilegios de los regulares, asignar específicamente los privilegios necesarios.
  • Aplicar controles especiales a cuentas de servicio tales como:
    • Monitoreo de inicios de sesión o consultas a Active Directory.
    • Restringir el inicio de sesión, para evitar que en el caso que sea comprometida pueda ser utilizada por un atacante.
    • Configurar permisos especiales para los atributos necesarios.

Esta vulnerabilidad abre la posibilidad a que puedan descubrirse otras soluciones con el mismo problema. Insto a los curiosos a probar las soluciones que manejan y encontrar más vulnerabilidades de este tipo para prevenir que sean utilizadas por un ciber criminar antes de ser públicamente conocidas.

Dios les bendiga!

El servir a Cristo, no es una tarea, sino una relación. Amigos de Dios. Jn 15:15

Updated: