Encontrando crashes en bibliotecas [Fuzzing] AFL

Iniciado por Jimeno, Junio 26, 2015, 06:20:36 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Junio 26, 2015, 06:20:36 PM Ultima modificación: Junio 26, 2015, 06:28:19 PM por Jimeno
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: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta)

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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta)


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
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
make clean
make


Como siguiente paso comprobamos que se haya instalado correctamente la biblioteca:
Código: bash
./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
afl-cmin -i input -o input_final -- /rutabiblioteca/bmp2tiff @@ /dev/null 




Nuestra entrada quedará ahora reducida a menos archivos.
Como siguiente paso comenzaremos el proceso de fuzzing mediante afl-fuzz:
Código: bash
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
afl-fuzz -i output/crashes/ -o output_final -C /rutabiblioteca/bmp2tiff @@ /dev/null


Tras un determinado tiempo comenzaremos a obtener crashes (o no).


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] ---> No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
[+ info] ---> No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
[+ info] ---> No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


¡Saludos!



Contacto: @migueljimeno96 -

Excelente aporte, que bueno encontrar alguien muy interesado en el tema de fallos de seguridad, saludos y gracias.