
Descripción
This lab’s login mechanism uses rate limiting to defend against brute-force attacks. However, this can be bypassed due to a race condition.
To solve the lab:
- Work out how to exploit the race condition to bypass the rate limit.
- Successfully brute-force the password for the user
carlos
. - Log in and access the admin panel.
- Delete the user
carlos
.
You can log in to your account with the following credentials: wiener:peter
.
You should use the following list of potential passwords:
Bypassing rate limits via race conditions writeup
Necesitaremos la extensión ‘Turbo Intruder’ descargada e instalada en Burp Suite. Al entrar al laboratorio veremos un Blog y un contador de 15 minutos.
Encontrar la condición de carrera
Si vamos a ‘My account’ e intentamos iniciar sesión varias veces con un usuario o contraseña incorrectos no nos permitirá volver a intentarlo en 1 minuto. Tomaremos una petición del ‘Logger’ y la llevaremos al ‘Repeater’ con Ctrl + R o Click derecho -> Send to Repeater:

Crearemos un grupo pulsando en la pestaña 1 con Click derecho -> Add tab to group -> Create tab group. Le daremos un nombre y crearemos varias copias de la misma petición (en torno a 20). Ahora en el desplegable de ‘Send’, podremos seleccionar ‘Send group (parallel)’. Al hacerlo veremos que todas las peticiones han pasado el filtro de máximos intentos.
Es con esto que podremos realizar un ataque de fuerza bruta.
Realizar un ataque de fuerza bruta con Turbo Intruder
Daremos Click derecho en la petición -> Extensions -> Turbo intruder. Se nos abrirá una ventana que configuraremos de la siguiente forma:

Los cambios realizados han sido los siguientes:
- Se ha dado a ‘username’ el valor de ‘carlos’
- Se ha cambiado el valor de ‘password’ por ‘%s’ para que el script de python lo sustituya por nuestra wordlist.
- Se ha selecionado el script de ‘race-single-packet-attack.py’, dado que estamos trabajando con una conexión HTTP2.
- Se ha modificado el bucle por el siguiente código, que toma de nuestro portapapeles las contraseñas (será necesario copiar las contraseñas proporcionadas en el enunciado antes):
for word in wordlists.clipboard:
engine.queue(target.req, word, gate='race1')
El resultado será el siguiente, lo ordenaremos por código HTTP y buscaremos el 302:

En este caso la contraseña para el usuario ‘carlos’ es ‘qwertyuiop’. Volveremos al navegador, iniciaremos sesión con estas credenciales y nos aparecerá en el menú la opción de ‘Admin panel’. Al acceder podremos borrar al usuario ‘carlos’ y completar el laboratorio:
