Ir al contenido principal
BlogComputeDefensa contra un ataque de fuerza bruta a la API de inicio de sesión

Defensa contra un ataque de fuerza bruta a la API de inicio de sesión

Un símbolo de bloque rojo con el siguiente texto "Defensa contra un ataque de fuerza bruta a la API de inicio de sesión: Porque tomar atajos puede paralizarte"

Reconozcámoslo, cuando tienes prisa por cumplir un gran plazo de lanzamiento, cortas por lo sano. La cobertura de las pruebas se vuelve irregular, el código no es tan DRY y la gestión de las excepciones se envía al cementerio de la deuda tecnológica, es decir, al backlog. A todos nos ha pasado.

Pero cuando llegue el momento de tomar atajos, no dejes de implementar la salvaguarda del "máximo intento fallido de inicio de sesión". Si tu API de inicio de sesión no cuenta con las salvaguardas adecuadas, acceder a una cuenta de usuario por fuerza bruta es relativamente fácil hoy en día.

En este artículo, le mostraremos cómo un atacante puede forzar una API de inicio de sesión. A continuación, hablaremos de las contramedidas que puedes poner en marcha para defender tus sistemas.

Un ejemplo de API de inicio de sesión

Para demostrarlo, hemos construido un servidor API muy básico utilizando Node.js y Express. Escucha peticiones POST a un único punto final, /login. Se espera que el cuerpo de la solicitud tenga un username y un password. Cuando se proporcionan las credenciales correctamente, la API devuelve 200 OK. En caso contrario, devuelve 401 UNAUTHORIZED.

Este es el código de nuestro sencillo servidor Express:

const express = require('express');
const users = require('./users.json');

const app = express();
const PORT = 3000;

// Middleware to parse JSON bodies
app.use(express.json());

app.post('/login', (req, res) => {
    const { username, password } = req.body;

    // Check if the username exists and the password matches
    if (users[username] && users[username] === password) {
        return res.status(200).send('OK');
    } else {
        return res.status(401).send('UNAUTHORIZED');
    }
});

// Start the server
app.listen(PORT, () => {
    console.log(`Server is listening on port ${PORT}`);
});

Para esta sencilla demostración, guardamos la lista de nombres de usuario y contraseñas en un archivo llamado users.json.

Hemos desplegado nuestro servidor en un Linode, escuchando en el puerto 3000. Probemos una petición:

~$ curl -i \        -X POST \        --header "Content-type:application/json" \        --data '{"username":"user08","password":"testpassword"}' \         172.233.153.34:3000/login

HTTP/1.1 401 UnauthorizedX-Powered-By: ExpressContent-Type: text/html; charset=utf-8Content-Length: 12ETag: W/"c-MvHJP5yPj49I/9tX+wGrvHWbTRk"Date: Sat, 25 May 2024 19:17:34 GMTConnection: keep-aliveKeep-Alive: timeout=5
UNAUTHORIZED

Nuestra API de inicio de sesión ya está en funcionamiento.

Ahora, si quisiéramos forzar nuestra API, podríamos escribir un script como este:

#!/bin/sh

API_ENDPOINT="http://172.233.153.34:3000/login"

USERNAME="user5"

echo "Attempting to login at $API_ENDPOINT as \"$USERNAME\""

for i in {1..8}
do
  PASS="password${i}"
  RESULT=$(curl --silent -X POST --header "Content-type:application/json" --data "{\"username\":\"$USERNAME\",\"password\":\"$PASS\"}" $API_ENDPOINT)
  echo "\"$PASS\": $RESULT"

  if [[ $RESULT == 'OK' ]]; then
    echo "!!! Password for \"$USERNAME\" found: \"$PASS\""
    break
  else
    sleep 1
  fi
done

Cuando ejecutamos nuestro rudimentario script de fuerza bruta, se ve así:

$ source bruteforce.sh
Attempting to login at http://172.233.153.34:3000/login as "user5"
"password1": UNAUTHORIZED
"password2": UNAUTHORIZED
"password3": UNAUTHORIZED
"password4": UNAUTHORIZED
"password5": OK
!!! Password for user5 found: "password5"

¿Puede un atacante adivinar realmente una contraseña?

Así que, hemos visto lo fácil que es escribir un script que pueda al menos recorrer algunas contraseñas para un nombre de usuario dado. Podrías decir, "Ok, ese es un ejemplo artificial interesante. Pero, ¿puede un atacante realmente adivinar una contraseña?".

Aquí tienes una lista de las 10.000 contraseñas más comunes. Es un buen comienzo para cualquier atacante. Piénsalo: ¿te has encontrado alguna vez con alguien que utilice "password123" o "qwerty"? Incluso podrías ser tú.

Si un atacante conociera algunos nombres de usuario de su sistema y ejecutara un script para recorrer estas contraseñas comunes, podría obtener un resultado.

Con cada intento permitido de una combinación de nombre de usuario y contraseña, aumentan las posibilidades de violar una cuenta.

Este es un caso clásico de autenticación rota, que es el #2 en el Top 10 de Riesgos de Seguridad de API de OWASP. Si su aplicación no se protege adecuadamente contra los ataques automatizados, se está buscando problemas. Sin salvaguardas, las cuentas de tus usuarios corren un riesgo significativo.

Las contraseñas suelen ser el eslabón más débil de la seguridad de un sistema:

  • Los usuarios reutilizan contraseñas en varios sitios.
  • Los usuarios eligen contraseñas fáciles de recordar (y de adivinar).
  • Los usuarios rara vez actualizan sus contraseñas.

Todos estos factores hacen que los ataques de fuerza bruta sean terriblemente eficaces.

Así que volvamos a nuestra pregunta: ¿Puede un atacante adivinar realmente una contraseña? Por supuesto que sí. Y si no tomas las precauciones adecuadas, podría ocurrir antes de lo que crees.

¿Cómo protejo mi API?

Hay varias maneras de defenderse contra un ataque de fuerza bruta en su API de inicio de sesión.

Establecer un número máximo de intentos fallidos de inicio de sesión

Establezca un límite en el número de intentos fallidos de inicio de sesión que permitirá para cada usuario. A medida que se produzcan intentos de inicio de sesión de un usuario, lleve un recuento de los intentos fallidos. Si llegas a ese límite, bloquea la cuenta temporalmente o bloquea las solicitudes posteriores desde la dirección IP del remitente. De este modo, a un atacante le resultará mucho más difícil entrar por fuerza bruta.

Utilizar un cortafuegos de aplicaciones web (WAF)

Un WAF puede ayudar a proteger su API detectando y bloqueando la actividad maliciosa.

  • Actividad de bots: Un buen WAF puede distinguir entre usuarios legítimos y bots, bloqueando los ataques automatizados de fuerza bruta.
  • Solicitudes de inicio de sesión sospechosas desde detrás de Tor: Muchos atacantes utilizan la red Tor para ocultar su identidad. Bloquear o cuestionar las solicitudes de los nodos Tor puede reducir el riesgo de ataques.

Haltdos, que es un WAF disponible en Linode Marketplace , ofrece estas protecciones y más. Al integrar estas herramientas, puedes reforzar significativamente las defensas de tu API.

Aplicar la limitación de velocidad

Limite el número de solicitudes de API procedentes de una misma dirección IP en un plazo determinado. Esto ralentiza los ataques de fuerza bruta y los hace menos factibles. La limitación de la tasa es una buena práctica para todas sus API y puntos finales, no solo para su API de inicio de sesión.

Activar la autenticación multifactor (MFA)

Si añades una capa adicional de seguridad, como MFA, puedes frustrar los ataques de fuerza bruta incluso cuando el atacante adivina la contraseña correctamente. Superar con éxito todo el flujo de autenticación requiere algo que el usuario conoce (la contraseña) y algo que tiene (un teléfono o un token de hardware).

Supervisar y analizar los intentos de inicio de sesión

Configure una solución de supervisión de solicitudes de API para vigilar los intentos de inicio de sesión. Busque patrones que puedan indicar un ataque. Esto puede ayudarte a responder rápidamente a actividades sospechosas.

La aplicación de estas medidas puede ayudar a proteger su API de ataques de fuerza bruta y mantener seguras las cuentas de sus usuarios.

Conclusión

Proteger su API de inicio de sesión de los ataques de fuerza bruta es crucial. Adivinar una contraseña no es tan difícil como podría pensarse, y automatizar las adivinanzas es un juego de niños. ¿Es vulnerable su sistema? Hemos tratado varias cosas que puede hacer para apuntalar sus sistemas. Estos pasos mejorarán significativamente su postura de seguridad.

En la frenética carrera por crear aplicaciones y API, le perdonaremos que tome atajos aquí y allá. Todo el mundo lo hace. Pero no deje su API de inicio de sesión sin protección. No espere a que se produzca un ataque: actúe ahora para proteger su sistema y a sus usuarios. Para obtener información más detallada sobre el registro y la supervisión del sistema, consulta la documentación deLinode . Si planeas utilizar Apache para servir tus aplicaciones, puedes consultar esta guía sobre cómo configurar mod_evasive para ayudar a tu servidor a sobrevivir a ataques DoS/DDoS.

¡Cuídate!

Comentarios

Dejar una respuesta

Su dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *.