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.
¿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.
Mientras configuraba LDAP en el FortiGate, noté que luego de guardar la configuración al intentar editar la casilla de password tenía *
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.
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
NetCat
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.
Solicitud modificada
NetCat
Ahora el password está cifrado y no podemos leerlo, sin embargo, comparemos ambas solicitudes y resaltemos los campos más importantes:
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
NetCat
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.
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.
El código fuente se encuentra en mi repositorio de Github.
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:
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:
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