7 de septiembre de 2018

OpenSSH. Fallo permite la enumeración de usuarios

OpenSSH, es una popular suite de utilidades criptográficas que permiten establecer una comunicación cifrada entre cliente y servidor.  Prácticamente omnipresente en el ámbito UNIX, OpenSSH fue escrita como parte del proyecto OpenBSD a partir de un fork de SSH; posee una licencia de código BSD.
El problema se ha hallado en la función userauth_pubkey. Como podemos ver en el código original:
authctx es una estructura que contiene información del contexto de autenticación, entre los valores que la componen, valid es un entero. Cómo podemos observar de los comentarios anexos, si posee un 0 el usuario no existe (lo contrario, existe y se le permite hacer login):
Tal y como comenta el reporte original, si el usuario no es válido la función vuelve (línea 100 de la primera captura) y el servidor enviaría un mensaje al cliente, SSH2_MSG_USERAUTH_FAILURE, indicando este error. Sin embargo, y siempre que la petición ssh de autenticación posea un formato erróneo, si el usuario existe, procede a verificar la petición y al no ser correcta falla en la función sshpkt_get_u8, con lo que se ejecutaría la función fatal y el servidor cerraría la conexión con el cliente de inmediato.
 Es decir, siempre y cuando el usuario sea válido y la petición tenga un formato no válido, sabremos por el cierre de la conexión que el usuario existe en el sistema. Esto nos permite obtener un método de prueba y error para enumerar los posibles usuarios de un sistema.
 Hasta ahora, OpenSSH ha tenido otras vulnerabilidades relacionadas con este tipo de ataques, del tipo timing, donde se explota una diferencia en tiempo o cantidad de datos en la respuesta entre un usuario válido u otro que no exista. Posibilitando, por lo tanto, un método para derivar la existencia.
 Por ejemplo, esta, donde si un usuario existía en el sistema el servidor ssh respondía con dos segundos aproximados de retraso frente a la respuesta inmediata si el usuario no existía.
 La corrección de este fallo se ha traducido en postergar la comprobación authctxt->valid que hemos visto después de comprobar que la petición posee un formato correcto, impidiendo que existan diferencias tanto si existe o no un usuario concreto. Observemos el cambio de posición del bloque de código afectado:
 El fallo afecta, en principio, a todas las versiones de OpenSSH, aunque ya ha sido parcheado en la versión 7.7
 No tardaremos en ver exploits y módulos de nmap explotando este error, por lo que habrá que estar atentos a los registros de eventos para comprobar como se comen el espacio en disco a base de martillear los servidores ssh.
Más información:
Fuente: Hispasec