
CVE-2024-29296 - Enumeración de usuarios en Portainer CE - 2.19.4
Se encontró una vulnerabilidad de enumeración de usuarios en Portainer CE 2.19.4. Este problema ocurre durante el proceso de autenticación de usuarios, donde una diferencia en el tiempo de respuesta podría permitir que un usuario remoto no autenticado determine si un nombre de usuario es válido o no.
Esta vulnerabilidad ha sido corregida con el issue #11736 de Portainer, el cual fue incluido en las versiones 2.19.5 y 2.20.2 de Portainer CE.
Descubrí esta vulnerabilidad mientras intentaba realizar un ataque de password spray en la página de inicio de sesión de una instancia de Portainer. Envié múltiples solicitudes con diferentes nombres de usuario y contraseñas al formulario de inicio de sesión de la aplicación Portainer.
Independientemente de la existencia del usuario, si la combinación de nombre de usuario y contraseña no es correcta, el backend de la aplicación Portainer responde con el mismo código de estado HTTP. Esto cumple con el mejor enfoque para prevenir o dificultar los intentos de enumerar usuarios válidos.
Sin embargo, al observar los resultados de mi ataque de password spray, noté que los intentos de inicio de sesión para algunos nombres de usuario toman consistentemente un cierto tiempo promedio, mientras que los intentos para otros nombres de usuario toman consistentemente un tiempo promedio notablemente mayor.
El sistema tiene que verificar la validez de la contraseña para los usuarios existentes, pero no necesita hacerlo si el nombre de usuario es inválido en primer lugar. Por lo tanto, asumí que el cambio notable en el tiempo promedio de intento de inicio de sesión tenía relación con eso. Luego procedí a instalar una copia local de Portainer CE 2.19.4 e intenté replicar el comportamiento, con el mismo resultado.
Este es el formato de solicitud que envié. Los campos de nombre de usuario y contraseña fueron seleccionados para insertar los payloads.

Estos fueron los usuarios que inserté en el campo de nombre de usuario. Para esta prueba, solo los usuarios "admin" y "felipe" eran válidos. Todos los demás nombres de usuario en la lista no correspondían a usuarios existentes.

Y estas fueron las contraseñas que inserté en el campo de contraseña.

Se envió una solicitud al servidor por cada par único de nombre de usuario y contraseña. Los resultados se muestran a continuación.

Cuando un nombre de usuario corresponde a un usuario existente, los intentos de inicio de sesión toman consistente y notablemente una mayor cantidad de tiempo en comparación con los intentos de inicio de sesión para usuarios inexistentes.
Esto significa que el sistema de Portainer en esa versión es susceptible a la enumeración de usuarios válidos: al observar el tiempo que el backend tarda en responder a los intentos de inicio de sesión, un atacante puede enumerar los usuarios de la aplicación.