💻Broken Authentication
La autenticación es un pilar fundamental de la seguridad de las API web. Estas utilizan diversos mecanismos de autenticación para garantizar la confidencialidad de los datos. Una API se ve afectada con Broken Authentication si alguno de sus mecanismos de autenticación puede ser eludido o evadido.
Restricción inadecuada de intentos excesivos de autenticación
El endpoint contra el que practicaremos es vulnerable a CWE-307: Improper Restriction of Excessive Authentication Attempts.
Escenario
El administrador de Inlanefreight E-Commerce Marketplace nos ha proporcionado las credenciales htbpentester3@hackthebox.com:HTBPentester3 y quiere que evaluemos qué vulnerabilidades de API puede explotar el usuario con sus roles asignados.
Dado que la cuenta pertenece a un cliente, utilizaremos el endpoint /api/v1/authentication/customers/sign-in para obtener un JWT y luego autenticarnos con él:

Al invocar el endpoint /api/v1/customers/current-user, recuperamos la información de nuestro usuario actualmente autenticado:

El endpoint /api/v1/roles/current-user revela que al usuario se le asignan tres roles: Customers_UpdateByCurrentUser, Customers_Get, y Customers_GetAll:

Customers_GetAll nos permite utilizar el endpoint /api/v1/customers, que devuelve los registros de todos los clientes:

Aunque el endpoint sufre Broken Object Property Level Authorization (lo cual abordaremos en la próxima sección) porque expone información confidencial sobre otros clientes, como email, phoneNumber, y birthDate, no nos permite directamente secuestrar ninguna otra cuenta.
Al expandir el endpoint PATCH /api/v1/customers/current-user , descubrimos que nos permite actualizar nuestros campos de información, incluida la contraseña de la cuenta:

Si proporcionamos una contraseña débil como "pass", la API rechaza la actualización, indicando que las contraseñas deben tener al menos seis caracteres:

El mensaje de validación proporciona información valiosa, ya que revela que la API utiliza una política de contraseñas débiles que no garantiza la seguridad criptográfica. Si intentamos configurar la contraseña como '123456', observaremos que la API ahora muestra el estado de éxito true, lo que indica que se realizó la actualización:

Dado que la API utiliza una política de contraseñas débil, es posible que otras cuentas de clientes hayan usado contraseñas criptográficamente inseguras al registrarse. Por lo tanto, realizaremos pruebas de fuerza bruta de contraseñas con ffuf contra los clientes.
Primero, necesitamos obtener el mensaje (de error) que devuelve el endpoint /api/v1/authentication/customers/sign-in cuando se le proporcionan credenciales incorrectas, que en este caso es "Invalid Credentials":

En lugar de atacar a los 107 clientes, el administrador de Inlanefreight E-Commerce Marketplace nos ha proporcionado los correos electrónicos de tres objetivos de alto valor (que debemos guardar en un archivo):
OlawaleJones@yandex.comIsabellaRichardson@gmail.comWenSalazar@zoho.com
Para la lista de palabras de contraseña, usaremos xato-net-10-million-passwords-10000 de SecLists
Dado que estamos analizando dos parámetros simultáneamente (el correo electrónico y la contraseña), necesitamos usar la flag -w y asignar las palabras clave EMAIL y PASS a las listas de palabras de los correos electrónicos y las contraseñas de los clientes, respectivamente.
Una vez finalizado, descubriremos que la contraseña de IsabellaRichardson@gmail.com es qwerasdfzxcv:
Ahora que hemos forzado la contraseña, podemos usar el endpoint /api/v1/authentication/customers/sign-in con las credenciales IsabellaRichardson@gmail.com:qwerasdfzxcv para obtener un JWT de Isabella y ver toda su información confidencial en Inlanefreight E-Commerce Marketplace.
Fuerza bruta de OTP y respuestas a preguntas de seguridad
Las aplicaciones permiten a los usuarios restablecer sus contraseñas solicitando un One Time Password(OTP) enviado a un dispositivo propio o respondiendo a una pregunta de seguridad elegida durante el registro. Si la fuerza bruta de las contraseñas no es viable debido a políticas de contraseñas robustas, podemos intentar forzar las OTP o las respuestas a las preguntas de seguridad, siempre que tengan baja entropía o sean fáciles de adivinar (además de que no se implementa la limitación de velocidad).
Prevención
Para mitigar la Broken Authentication vulnerabilidad, el endpoint /api/v1/authentication/customers/sign-in debe implementar una limitación de velocidad para evitar ataques de fuerza bruta. Esto se puede lograr limitando el número de intentos de inicio de sesión desde una sola dirección IP o cuenta de usuario dentro de un plazo específico.
Además, la API web debe implementar una política de contraseñas robusta para las credenciales de usuario (incluyendo clientes y proveedores) durante el registro y las actualizaciones, permitiendo únicamente contraseñas criptográficamente seguras. Esta política debe incluir:
Longitud mínima de contraseña(por ejemplo, al menos 12 caracteres)Requisitos complejos(por ejemplo, una combinación de letras mayúsculas y minúsculas, números y caracteres especiales)Prohibición de contraseñas comunmente usadas o adivinables(como los que se encuentran en bases de datos de contraseñas filtradas)Aplicación del historial de contraseñaspara evitar la reutilización de contraseñas recientesCaducidad regular de contraseñas y cambios obligatorios
Además, el endpoint de la API web debe implementar autenticación multifactor (MFA) para mayor seguridad, solicitando un OTP antes de autenticar completamente a los usuarios.
Caso práctico
Aprovecha otra vulnerabilidad de Broken Authentication para obtener acceso no autorizado al cliente con el correo electrónico "MasonJenkins@ymail.com". Obtén sus datos de pago y reportalo.
Concéntrate en los endpoints POST /api/v1/authentication/customers/passwords/resets junto con /api/v1/authentication/customers/passwords/resets/email-otps o /api/v1/authentication/customers/passwords/resets/sms-otps.
Vamos al endpoint /customers/sing-in y en el request body ponemos nuestras credenciales:
Eso nos genera el JWT Token:

Y en Authorize nos autenticamos con el Token JWT.
El endpoint /api/v1/roles/current-user revela que al usuario se le asignan tres roles: Customers_UpdateByCurrentUser, Customers_Get, y Customers_GetAll:

Identificar error
Customers_GetAll nos permite utilizar el endpoint /api/v1/customers, que devuelve los registros de todos los clientes:

Cuando hacemos un curl:
Nuestro objetivo es MasonJenkins@ymail.com:
Si proporcionamos una contraseña débil como "pass", la API rechaza la actualización, indicando que las contraseñas deben tener al menos seis caracteres y la edad mínima son 17 años:

Usando el siguiente request body:
Vemos que la respuesta es true:

Bruteforce
Primero, necesitamos obtener el mensaje (de error) que devuelve el endpoint /api/v1/authentication/customers/sign-in cuando se le proporcionan credenciales incorrectas, que en este caso es "Invalid Credentials":

Nuestro objetivo es MasonJenkins@ymail.com, por lo que usaremos ffuf para encontrar su contraseña de la siguiente manera:
Última actualización
¿Te fue útil?