Gissningslek - Hack.luCTF2025

Reto basado en vulnerar un código en bash mediante el uso de variables mal sanitizadas

Gissningslek - Hack.luCTF2025

Autor del reto: msanft

Dificultad: Fácil

Enunciado

1
Casino? CS cases? Pff. Now this game is really unfair.

Archivos

  • nc xn--gissningslek-5wa.solven.jetzt 1024 : Conexión por netcat al servidor.
  • gissningslek.zip : Código fuente del servidor.
1
2
3
4
5
6
7
8
9
gissningslek.zip
|
├── docker-compose.yml
├── Dockerfile
├── docker-stuff
│   ├── readflag
│   └── ynetd
├── flag.txt
└── gissningslek.sh

Archivos utilizados en mi repositorio de GitHub.

Analizando el código

La funcionalidad principal del código reside en gissningslek.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env bash

echo "Låt oss spela en gissningslek!"
echo "Varning: Du får inte ändra din gissning. :("

read -r user_guess

function guess() {
  rand=$(( ( RANDOM % 10000 )  + 1337 ))
  if [[ "${1}" -eq "${rand}" ]];
  then
    echo "Rätta"
  else
    echo "Fel"
    exit 1
  fi
}

for _ in {1..1000}; do
  guess "${user_guess}"
done

/readflag

El código en bash implementa un juego de adivinanza donde el usuario deberá adivinar 1000 veces el número aleatorio en cada ronda para leer la variable FLAG. Si el usuario introduce un número que no se corresponde con el generado, el programa se cierra.

Solver

El código anterior tiene varias vulnerabilidades críticas:

1. Evaluación aritmética

1
if [[ "${1}" -eq "${rand}" ]];

En bash, -eq fuerza la evaluación aritmética, no la comparación de cadenas. Esto significa que "${1}" se interpreta como una expresión aritmética y no como texto.

Un ejemplo válido sería el siguiente:

1
2
[[ 2+2 -eq 4 ]]      # true
[[ foo -eq foo ]]    # true si foo es una variable numérica

2. Variable rand accesible:

1
rand=$(( ( RANDOM % 10000 )  + 1337 ))

rand es una variable accesible desde la comparación aritmética, ya que si introducimos como usuario el nombre de la variable rand, desde bash se evaluará como:

1
[[ rand -eq rand ]]

Esto provoca que la expresión siempre sea verdadera.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌──(kesero㉿kali)-[~]
└─$ nc xn--gissningslek-5wa.solven.jetzt 1024

    Låt oss spela en gissningslek!
    Varning: Du får inte ändra din gissning. :(
    rand

    (...)
    Rätta
    Rätta
    Rätta
    Rätta
    Rätta
    Rätta
    Rätta
    Rätta
    Rätta
    Rätta
    Rätta
    flag{w0w_Byp4ss_B4shh_1snt_diff1cUlT!!}  

Flag

flag{w0w_Byp4ss_B4shh_1snt_diff1cUlT!!}

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