HackDef 2017 Quals Round - Pwning 200

By Egresados_MISTI

Download singboard here

Encuentra la vulnerabilidad en el binario adjunto y manda el exploit a hackdef.net:5040

1. Al revisar la función main, hacia el final vemos una comparación que nos puede llevar a dos posibles caminos. En uno de ellos se imprime un mensaje y en el otro se llama a la función gotcha. Si revisamos la función gotcha podemos ver que ejecuta el comando “/bin/sh -i” para iniciar una shell interactiva, la cual nos puede dar acceso para leer la bandera guardada en el host objetivo. 

 Figura 1: Funcion Main

  1. Para lograr llevar la ejecución hacia la llamada a gotcha tenemos que hacer que se cumpla la comparación en la dirección 0x080485c8, que compara el valor de la variable global passwd (almacenada en 0x0804a03c) contra la constante 184 (0xb8). 

    Figura 2: Variable global

    Si ponemos atención en el printf previo a la comparación vemos que no hace uso de ninguna cadena de especificador de formato, sino únicamente imprime de manera directa la misma cadena que previamente se lee desde entrada estándar con la función fgets. Esto quiere decir que podemos llevar a cabo un ataque de cadena de formato. 
     
    Figura 3: Encontrando la vulnerabilidad


    3. Al introducir la cadena "AAAA" seguida de varias repeticiones del especificador de formato "%x" podemos ver a que número de argumento corresponde el inicio de nuestra cadena dentro de la pila. En nuestro caso está en la posicion 6
    Figura 4: Identificando nuestro parametro en el stack

    4. El siguiente paso consiste en escribir en memoria, Esto lo podemos lograr con ayuda del especificador "%n", el cual escribe en memoria la cantidad de caracteres que se han imprido hasta el momento que se encuentra este especificador. Para completar el ataque tenemos que indicar en que dirección queremos escribir, esto lo hacemos con ayuda del especificador de acceso directo a argumento "n$", donde n indica el número de argumento de la pila. En nuestro caso sabemos que controlamos el argumento 6

    5. Si recordamos el otro posible camino cuando la comparación no se cumple, vemos que existe un printf que imprime el valor de la variable passwd, lo que nos sirve de guía para saber si vamos logrando nuestro objetivo. En la Figura 5 podemos ver que es posible colocar el valor 4 en la variable, que corresponde a los 4 bytes que se imprimen que corresponden a la dirección de dicha variable.
    Figura 5: Controlando el valor de la variable passwd 


    6. El objetivo es colocar en la variable passwd el valor 184, por lo que nos hace falta incrementar la cantidad de caracteres en 180. Podríamos directamente imprimir esta cantidad, pero podemos tomar un atajo y usar el especificador de formato de anchura. En la Figura 6 vemos que al usar un ancho de 179 el mensaje nos indica que el valor de la variable es 183, por lo que estamos un byte cortos. Al incrementar el ancho logramos establecer el valor requerido y ejecutar la funcón gotcha.

     
    Figura 6: Ajustando el valor de la variable passwd

    7. Al momento de escribir este reporte ya no se tiene acceso al servidor objetivo, pero el código que suso fue el siguiente: 

     Figura 7: Codigo para enviar exploit a servidor

    Shell Remota by FinalBoss Team

    Tambien es posible enviar el exploit directamente desde la linea de comandos, como nos enseña el equipo de FinalBoss en la figura de abajo, quienes obtuvieron una shell remota!!!!


    Comments