Underc0de

[In]Seguridad Informática => Bugs y Exploits => Mensaje iniciado por: Jimeno en Junio 26, 2015, 06:20:36 PM

Título: Encontrando crashes en bibliotecas [Fuzzing] AFL
Publicado por: Jimeno en Junio 26, 2015, 06:20:36 PM
Buenas a todos.

Como muchos de vosotros sabréis habitualmente se utilizan herramientas denominadas "fuzzers" para encontrar diferentes crashes en bibliotecas y después analizarlos en busca de uno explotable.
Me gustaría presentaros y hacer una pequeña demo con uno de los mejores fuzzers conocidos: American Fuzzy Lop (+ info y descarga: http://lcamtuf.coredump.cx/afl/)

Una vez instaladas las dependencias necesarias y AFL podemos pasar a fuzzear la biblioteca en cuestión.
Para ello necesitaremos (aunque no es imprescindible) el código fuente de la misma. En caso de no tenerlo deberemos hacer uso del flag "-n", lo que hará que seguramente no encontremos crashes o que tardemos demasiado porque vamos a ciegas.

Para este post yo usaré bmp2tiff, que es parte de libtiff. Para facilitar las cosas voy a utilizar una de las versiones más viejas, en concreto la versión 3.7.0 (descarga de cualquier versión antigua en http://download.osgeo.org/libtiff/old/)


Tras descomprimir el paquete en la ruta que queramos debemos indicar al compilador que usaremos el gcc y el g++ pertenecientes a American Fuzzy Lop en vez de los habituales y preparar la compilación.
Código (bash) [Seleccionar]
export CC=afl-gcc
export CXX=afl-g++
./configure --disable-shared


Limpiamos compilaciones anteriores y compilamos con los nuevos gcc y g++:
Código (bash) [Seleccionar]
make clean
make


Como siguiente paso comprobamos que se haya instalado correctamente la biblioteca:
Código (bash) [Seleccionar]
./tools/bmp2tiff

¡Bien! Está instalada correctamente.

Ahora deberemos conseguir varias entradas (cuantas más y más diversas mejor). En el caso de este tutorial bajaremos unas 57 imágenes con extensión .bmp y las meteremos en el directorio input/
Ahora dejaremos que AFL elija las entradas más apropiadas:
Código (bash) [Seleccionar]
afl-cmin -i input -o input_final -- /rutabiblioteca/bmp2tiff @@ /dev/null

(http://i.imgur.com/2bHe69Q.png)

Nuestra entrada quedará ahora reducida a menos archivos.
Como siguiente paso comenzaremos el proceso de fuzzing mediante afl-fuzz:
Código (bash) [Seleccionar]
afl-fuzz -i input_final -o output -- /rutabiblioteca/bmp2tiff @@ /dev/null

Comenzará así el proceso de fuzzing, que, naturalmente, depende de las capacidades de nuestro equipo y del buen desarrollo del ejecutable que queramos fuzzear.
Una vez obtengamos unos pocos crashes diferentes (unique) podremos utilizar variaciones de los mismos para obtener otros crashes nuevos y completamente diferentes.

Código (bash) [Seleccionar]
afl-fuzz -i output/crashes/ -o output_final -C /rutabiblioteca/bmp2tiff @@ /dev/null

Tras un determinado tiempo comenzaremos a obtener crashes (o no).
(http://i.imgur.com/91lFjGE.png)

Nota: si no especificamos otra cosa se utilizan 50 MB para cada test durante el fuzzeo.


Ahora deberemos analizar cada crash para comprobar si es o no explotable, pero eso queda para un futuro post (:

[+ info] ---> https://alexgaynor.net/2015/apr/13/introduction-to-fuzzing-in-python-with-afl/
[+ info] ---> http://lcamtuf.blogspot.com.es/2014/08/a-bit-more-about-american-fuzzy-lop.html
[+ info] ---> http://floyd.ch/download/introduction-fuzzing-with-afl.pdf


¡Saludos!



Título: Re:Encontrando crashes en bibliotecas [Fuzzing] AFL
Publicado por: .:UND3R:. en Junio 27, 2015, 10:54:58 PM
Excelente aporte, que bueno encontrar alguien muy interesado en el tema de fallos de seguridad, saludos y gracias.
Título: Re:Encontrando crashes en bibliotecas [Fuzzing] AFL
Publicado por: Alvares97 en Julio 09, 2015, 05:38:48 PM
que interesante