miércoles, 31 de diciembre de 2014

Resolviendo el primer reto de Amateria.smashthestack.org

Hacia mucho tiempo que no escribía, principalmente por falta de tiempo y porque no sabia sobre que hacerlo [...] bla, bla, bla...

Buscando wargames llegué, por recomendación de @TheXC3LL, a Smash The Stack Wargaming Network (donde también se encuentra el wargame IO analizado en anteriores post por el señor antes mentado). De las diversas opciones me decanté por Amateria.


El primer nivel es el 0 que nos proporcionará la contraseña de acceso al siguiente. Como pista para solucionarlo nos dan un enlace a un script en python:


A partir de aquí podemos dilucidar que el servidor tiene el puerto 54321 a la escucha y es donde estableceremos la conexión. La otra peculiaridad es la librería cPickle que desconocía.

Cuando abrimos su documentación nos encontramos con:
Warning: The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source.
Picke nos permite serializar y de-serializar estructuras en python, pero no valida la información con la que trabaja lo que puede llegar a ser peligroso. Ejemplos de esto se encuentran en una entrada del creador del wargame llamada Python cPickle: Allows For Arbitrary Code Execution donde se ahonda mas en el tema.

Por tanto, si conectamos con el puerto 54321 y enviamos determinada "información" podremos ejecutar código en el servidor, por ejemplo, leer el archivo con la clave del siguiente nivel.


Puesto que sabemos que el servidor tiene las contraseñas en /home/<user>/password (no es magia, lo pone en la web de amateria), haremos que el servidor ejecute un cat de dicho archivo en el sistema mediante subprocess. Cuando el servidor responda, nos dará su contenido.


Estos códigos junto con los siguientes niveles y demás relacionado con wargames estarán recogidos en el repositorio GitHub de 0verl0ad:
https://github.com/0verl0ad/PornAetsuWarGames

Fuentes e información extra:

Feliz año y "nos leemos en breve"


5 0verl0ad Labs: diciembre 2014 Hacia mucho tiempo que no escribía, principalmente por falta de tiempo y porque no sabia sobre que h...

sábado, 20 de diciembre de 2014

Resolviendo los retos de io.smashthestack.org con radare2 [7]

¡Saludos!

    Últimamente estoy sin tiempo (y Aetsu parece que igual) asi que el blog está bastante descuidado. Aun así, cuando tengo un hueco, intento publicar algo ;)


Level 7

   Como siempre que nos dejan el source, le pegamos un vistazo


      El programa necesita de dos argumentos. El primero debe de ser un entero menor de 10 y el segundo es una cadena que se copiará a buf. O sea, que necesitamos primero encontrar un numero menor que diez, pero que al mismo tiempo sea mayor (para poder hacer el overflow -buff[10]-). Y después sobreescribir la variable count para que tenga el valor que nos permita llegar a ejecutar el /bin/bash.


    La primera vez que pasé el reto lo hice más por intuición que por conocimiento de causa. Un número negativo siempre será menor que 10, por lo que se me ocurrió que probablemente algún número negativo muy bajo (entorno al int min) pudiera acabar dando positivo al operar con él. Para probar la teoría hice un sencillo script en perl.






 El número agraciado fue el -2147483628. Una vez que sabemos el primer argumento, ahora sólo necesitamos hacer el overflow. Lo abrimos con r2, "aa", para analizarlo, y "afl" para listar todas las funciones.
Vemos que hay un main en 0x08048414. Desansemblémoslo (pd @ 0x08048414). La comparación la hace entre la cadena que se ve en el código fuente del programa y EBP - 0xC:

 Para hacer el cálculo de cuanta basura hay que meter para poder modificar el valor de count usaremos dos de las herramientas de radare2, ragg2 y rax2. Con la primera crearemos un patrón de 200 caracteres y con la segunda lo convertimos de hex a raw. Una vez que tenemos el patrón, volvemos a lanzar r2 en modo debugger pasandole como argumentos el número que habíamos calculado antes y el patrón generado.

   "dc" para que el programa se ejecute, cuando de el sigsegv, miramos los registros con "dr". Anotamos el valor alojado en EBP, y usamos el comando "woO lo-que-habia-en-ebp" para calcular el tamaño del patrón en ese punto (72).

   Con 72 sobreescribimos EBP, pero si recordamos nuestra variable count estaba alojada en EBP - 0xc (12), es decir, tendríamos que usar 72 - 12 = 60 caracteres, y justo a continuación 0x574f4c46.


./level07  -2147483628 $(perl -e 'print "A" x 60; print "\x46\x4c\x4f\x57";')

Byt3z!


5 0verl0ad Labs: diciembre 2014 ¡Saludos!     Últimamente estoy sin tiempo (y Aetsu parece que igual) asi que el blog está bastant...
< >