flagCrack the Gate 2 PicoCTF (Intermediate)

Contexto de la maquina

Trayectoria Crack the Gate 2

Descripción

Crack the Gate 2 es un reto de tipo Web centrado en la evasión de mecanismos básicos de protección contra fuerza bruta, específicamente un sistema de rate limiting aplicado al endpoint de autenticación.

El desafío consiste en analizar el comportamiento del login, comprender cómo se aplica la restricción por múltiples intentos fallidos y desarrollar un método para evadir dicha limitación con el objetivo de obtener la flag final.

Objetivo del reto

  • Analizar el sistema de autenticación.

  • Comprender el mecanismo de limitación de intentos (rate limit).

  • Evadir la restricción utilizando manipulación de peticiones HTTP.

  • Realizar un ataque de fuerza bruta con el diccionario proporcionado.

  • Obtener la flag final tras autenticación exitosa.

Tipo de máquina

  • Web

  • Aplicación Node.js (Express)

  • Fuerza bruta con evasión de rate limiting

Habilidades y técnicas evaluadas

  • Interceptación y análisis de tráfico HTTP

  • Comprensión de códigos de estado HTTP (429 Too Many Requests)

  • Manipulación de respuestas del servidor

  • Automatización de ataques con Python

  • Uso de diccionarios de contraseñas

  • Evasión básica de mecanismos de rate limiting

Análisis de vulnerabilidades

Despliegue del CTF

Dentro de la propia página del reto, localizaremos el CTF. Al acceder a él, encontraremos un enlace el cual nos propociona un dominio en el que si accdemos veremos una pagina web, a partir de este punto tendremos que explotarla de alguna forma.

El objetivo principal de este tipo de CTFs es conseguir obtener la flag final.

Bypass Rate limit web

La descripcion del reto es la siguiente:

En este caso se nos indica que:

  • Debemos autenticarnos con el correo ctf-player@picoctf.org.

  • Existe un mecanismo de rate limiting que bloquea múltiples intentos fallidos desde la misma fuente.

  • El sistema podría confiar en headers controlados por el usuario.

Esto ya nos orienta a un posible bypass basado en manipulación de cabeceras HTTP (por ejemplo, X-Forwarded-For u otras similares).

Al acceder a la web observamos el formulario de login, y además se nos proporciona un diccionario de contraseñas que debemos descargar:

Análisis del comportamiento del rate limit

Procedemos a capturar una petición de login con cualquier credencial usando Burp Suite para analizar la respuesta del servidor.

Al visualizar la respuesta obtenemos:

Observaciones clave:

  • El servidor devuelve 429 Too Many Requests.

  • El mensaje de error indica bloqueo temporal tras múltiples intentos fallidos.

  • La respuesta sigue el mismo patrón JSON con el campo success.

Primer intento de bypass: Manipulación de la respuesta

Al igual que en el reto anterior, intentamos interceptar la respuesta del servidor y modificar el campo:

a:

Para ello:

  • Capturamos la petición de login.

  • Click derecho → Do intercept → Response to this request.

  • Modificamos la respuesta antes de que llegue al navegador.

Tras forzar "success": true, la aplicación nos permite avanzar, pero solicita la flag, la cual no se muestra.

Análisis del código JavaScript

Revisando el código fuente encontramos lo siguiente:

Aquí está la clave:

  • Si data.success es verdadero → muestra data.flag.

  • Si existe data.error → muestra alerta.

  • Si no hay ninguno → credenciales inválidas.

Cuando forzamos "success": true, el backend realmente no envía flag, por lo que data.flag queda vacío.

Observación interesante

En el primer intento fallido, la respuesta contiene el campo:

Sin embargo, si eliminamos el campo error de la respuesta antes de que llegue al navegador, el frontend no interpreta que haya habido un fallo previo.

Es decir:

  • El rate limit se refleja en la respuesta.

  • Pero el frontend toma decisiones únicamente basadas en el JSON recibido.

  • Si manipulamos la respuesta adecuadamente, podemos simular que el bloqueo no existe.

Esto confirma que el control de rate limit depende parcialmente de lógica expuesta al cliente. Automatización del bypass

Para explotar correctamente el sistema y realizar un ataque de fuerza bruta controlado, desarrollamos un script en Python 3 que:

  • Genera headers aleatorios en cada petición.

  • Crea nuevas sesiones para evitar persistencia.

  • Introduce delays aleatorios.

  • Maneja respuestas 429.

  • Permite ejecución multihilo.

El objetivo es evadir el mecanismo básico de rate limiting mientras probamos el diccionario proporcionado.

bruteForce.py

Ejecución del script

Resultado:

Tras varios intentos y gestión de bloqueos temporales, el script consigue credenciales válidas, y obtenemos la flag, por lo que daremos por terminado este reto.

flag.txt

Last updated