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.
export CC=afl-gcc
export CXX=afl-g++
./configure --disable-shared
Limpiamos compilaciones anteriores y compilamos con los nuevos gcc y g++:
make clean
make
Como siguiente paso comprobamos que se haya instalado correctamente la biblioteca:
./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:
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:
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.
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!
Excelente aporte, que bueno encontrar alguien muy interesado en el tema de fallos de seguridad, saludos y gracias.
que interesante