
A Not So Very Intelligent Fuzzer: Un framework de fuzzing avanzado diseñado para encontrar vulnerabilidades en código C/C++.
Un Fuzzer No Tan Inteligente
Marshall Whittaker
oxagast
A medida que aumenta la complejidad de un sistema, también aumenta el potencial de problemas dentro de ese sistema.
--Ley de Whittaker
Dependencias de compilación:
automake autoconf-archive zlib1g-dev g++ gcc (y libgtk2.0-dev si quieres soporte GTK)
Compilación:
Linux:
$ aclocal && autoconf && automake -a && ./configure && make && make check
O, si quieres jugar con el fuzzer de syscalls:
$ aclocal && autoconf && automake -a && ./configure --enable-syscalls && make && make check
Si quieres deshabilitar la interfaz GTK puedes hacer:
$ aclocal && autoconf && automake -a && ./configure --disable-gtk && make && make check
FreeBSD
Asumiendo que instalaste g++ desde ports (como necesitarás para C++11):
$ aclocal && autoconf && automake -a && ./configure && make && make check
OpenBSD:
Asumiendo que instalaste g++ desde ports (como necesitarás para C++11):
$ CXX=$(find / -name 'eg++' 2>/dev/null | grep ports | head -n 1) AUTOCONF_VERSION=2.69 AUTOMAKE_VERSION=1.15 autoreconf -fmi
Windows:
Los binarios de Windows ahora están diseñados para compilarse con MinGW-W64 (ya que usamos hilos, descarga una versión de MinGW-W64 g++ con seh). Puedes intentar compilar después de instalar MinGW-W64 g++ con seh (solamente) haciendo clic en el script make_win.bat incluido. Si falla, probablemente sea debido al entorno, así que prueba lo siguiente.
(Ve a donde instalaste MinGW-W64 y haz clic en mingw-64.bat)
windres metadata.rc -O coff -o metadata.res
g++.exe src/common.cpp src/bin2hex.cpp src/popen2.cpp src/main.cpp src/help.cpp src/match_fault.cpp src/sys_string.cpp src/man_read.cpp src/randomizer.cpp src/trash.cpp src/log.cpp metadata.res src/version.h -I./ -I./include -std=c++11 -lstdc++ -lpthread -O2 -o ansvif.exe -static -static-libgcc -static-libstdc++
gcc src/win/printf.c -o printf.exe
Nota: los archivos externos .dll de cygwin ya no son necesarios ya que ahora compilamos con g++ de MinGW. En Windows 7, Powershell v2 está instalado por defecto, sin embargo, este programa requiere al menos Powershell v5. Windows 10 incluye Powershell v5. Puedes ir al sitio de Microsoft y descargar Windows Management Framework (que incluye versiones más nuevas de Powershell) aquí:
https://www.microsoft.com/en-us/download/details.aspx?id=50395
Pruebas:
Si quieres probar el código de ejemplo, puedes compilar faulty.c con:
$ gcc faulty.c -o faulty
También puedes simplemente ejecutar make check.
Uso:
Nota importante: los usuarios de Windows deberán ejecutar ansvif.exe desde Powershell para que funcione!
$ ./find_suid /usr/bin/ /bin/ /sbin/
$ ./ansvif -[tm] [template/manpage] -c /path/to/executable -b buffersize
Ejemplos:
Linux/BSD:
$ ulimit -c unlimited
$ ./ansvif -m mount -c /bin/mount -e examples/mount_e.txt -x examples/mount_o.txt\
-f 8 -b 2048
$ ./ansvif -t examples/blank.txt -F tmp/tmphtml -x examples/htmltags.txt -c /usr/bin/iceweasel -b\
128 -A "file:///home/username/src/ansvif/tmp/tmphtml" -f 2 -n -R "sleep 3 && killall\
iceweasel" -S ">"
$ cat examples/linux_syscalls_implemented.list | xargs -P \
`cat examples/linux_syscalls_implemented.list | wc -l` -I {calls} ./ansvif -t examples/space.txt \
-B "{calls} " -c ./syscalls -o syscall_crash -f 1 -z -d -b 16
Windows:
PS C:\ansvif\bin\ansvif_win> .\ansvif -t ..\..\examples\space -F ..\..\tmp\tmphtml -x `
..\..\examples\htmltags -c `
'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' `
-b 128 -A "file:///C:\\Users\marsh\OneDrive\Documents\Code\ansvif\tmp\tmphtml" `
-f 2 -n -S ">" -R "sleep 2 ; Stop-Process -Name chrome"
Opciones:
ansvif
-t Este archivo debe contener argumentos de línea de comandos línea por línea como se muestra en el archivo de ejemplo.
-e Este archivo debe contener variables de entorno línea por línea como se muestra en el archivo
de ejemplo. Normalmente puedes obtenerlas haciendo algo como:
$ strings /bin/mount | perl -ne 'print if /[A-Z]=$/' > mount_envs
-c Especifica la ruta del comando.
-p Especifica la ubicación de la página de manual (como un entero, normalmente 1 u 8)
-m Especifica la página de manual del comando.
-D Vuelca lo que se encuentra en la página de manual.
-f Número de hilos a usar. Por defecto es 2.
-b Especifica el tamaño del buffer para fuzzear. 256-2048 suele ser suficiente.
-r Usa solo datos basura aleatorios.
-o Escribe la salida en un archivo de registro.
-z Aleatoriza el tamaño del buffer desde 1 hasta lo especificado por -b.
-x Otras cosas para poner. Nombres de usuario y similares pueden ir aquí.
-S Separador entre opciones.
-s Especificación de caracteres omitidos. Los valores predeterminados son <>\\n |&\[]\()\{}:;\ y la nueva línea es obligatoria.
-T Tiempo de espera para los hilos.
-W Tiempo de espera para los hilos.
-L Usuario no privilegiado para ejecutar como si fuera root.
-A Siempre poner lo que sigue después del comando a ejecutar.
-B Siempre poner lo que sigue antes del comando a ejecutar.
-F Archivo para alimentar al programa donde se pondrán -x junto con datos de fuzzing normales.
-n Nunca usar datos aleatorios en el fuzz.
-R Ejecutar este comando después de cada fuzz.
-C Un código de error no estándar para detectar.
-V Usar Valgrind si está instalado.
-1 Intentar que falle una vez, si no sucede, lanzar código de error 64. Útil para scripts.
-P Usar % para representar binario en el fuzz.
-M Máximo de argumentos a usar en el fuzz.
-y Abreviatura de -b 0 y normalmente solo útil con -A o -B.
-K Seguir fuzzeando después de un fallo en el objetivo.
-E Un comando a ejecutar antes del programa fuzzeado.
-0 Sin caracteres NULL en el fuzz.
-N Abreviatura de -R "pkill prog".
-v Verboso.
-d Datos de depuración.
-h Muestra la página de ayuda.
-i Imprime información de la versión.
ansvif_gtk
-l Atajo para -p ./ansvif
-p La ubicación del binario ansvif
Recomendaciones: Se recomienda que si estás haciendo fuzzes largos o fuzzing de archivos, si es posible, coloques los archivos (incluyendo el binario que estás fuzzeando si es posible) en memoria. Esto significa, ponerlos en algún lugar como /var/run/shm donde el golpeteo del disco será mínimo, y el fuzzing será algo más rápido, especialmente si se manejan archivos grandes. Sin embargo, ten cuidado: perderás tus archivos fuzzeados si están en shm y reinicias la máquina!
¡NO EJECUTES ESTE CÓDIGO EN UN ENTORNO DE PRODUCCIÓN! Si intentas establecer la salida de faulty.c a suid(0), entonces POR FAVOR hazlo en una máquina virtual. o al menos en una máquina que no te importe. Aparte de eso, solo juega y diviértete!
Notas:
Los usuarios de Windows deben tener ansvif ejecutándose desde Powershell. El código de Linux y Windows debería ser relativamente estable. El fuzzing de syscalls bajo linux está en desarrollo activo.
Agradecimientos
Gracias a dll999 por las ideas de fuzzing de syscalls. Gracias a moo de #2600 en 2600net por algunas recomendaciones en el wiki. Gracias a Dios sabe cuántas personas en IRC y StackOverflow. Gracias a DarkSt0rm por arreglar un error en el Makefile.