
Automatizar tareas repetitivas para fuzzing
Actualmente se está reescribiendo por completo. Inicialmente, el enfoque estará en aplicaciones Linux interactivas que solo toman entrada de stdin. Se intentará utilizar la funcionalidad Driller y Fuzzer de Shellphish.
autoPwn en su estado actual hará esto de forma limitada. Simplemente ejecute autoPwn ./binary y luego seleccione la opción Iniciar.
Dados todos los problemas de dependencias aquí, la forma más fácil de poner en marcha autoPwn es usar la compilación Docker. Tenga en cuenta que puede eliminar --security-opt y --cap-add, pero algunos aspectos del fuzzing podrían no funcionar.
$ sudo docker pull bannsec/autoPwn
$ sudo docker run -it -v $PWD:/mount --security-opt="apparmor=unconfined" --cap-add=SYS_PTRACE -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix/ bannsec/autopwn
En la compilación Docker, todo debería estar listo para usar. Puede iniciar la herramienta simplemente con:
$ autoPwn ./file
autoPwn intenta facilitar la compilación de código fuente para fuzzing de un proyecto. Para ayudar con esto, se creó autoPwnCompile. Solo hay que apuntarlo al código fuente, darle opciones y generará un ejecutable listo para ser fuzzeado.
uso: autoPwnCompile [-h] [--file FILE] [--ASAN | --MSAN] [--UBSAN]
[--fuzzer FUZZER]
Compila código fuente a binarios para usar en autoPwn.
argumentos opcionales:
-h, --help muestra este mensaje de ayuda y sale
--file FILE Archivo único a compilar.
--ASAN Habilita ASAN (desactivado por defecto)
--MSAN Habilita MSAN (desactivado por defecto)
--UBSAN Habilita UBSAN (desactivado por defecto)
--fuzzer FUZZER (opcional) Para qué fuzzer compilar. Opciones:
['AFL']. Por defecto es AFL.
Lo siguiente es de la versión ANTIGUA de autoPwn..
autoPwn es un nombre ambicioso para un script simple. Al trabajar con fuzzing y afl-fuzz, noté que realizaba las mismas tareas una y otra vez. Con esto en mente, quería crear un script que lograra lo siguiente:
Hasta ahora, el script es capaz de hacer los primeros 5. La parte 6 es especulativa y se está intentando desarrollar actualmente. Aprovecharía el motor de ejecución simbólica angr para crear posibles rutas iniciales. En ese punto, el script podría teóricamente automatizar completamente tareas de fuzzing simples.
Veamos un desafío reciente de TUCTF llamado "WoO2". Aunque no encuentra necesariamente el exploit necesario, muestra cómo autoPwn puede usarse para simplificar el descubrimiento de rutas.
Aquí hay un recorrido básico del programa:
$ ./e67eb287f23011a40ef5bd5c2ad2f48ca97834cf
Welcome! I don't think we're in Kansas anymore.
We're about to head off on an adventure!
Select some animals you want to bring along.
Menu Options:
1: Bring a lion
2: Bring a tiger
3: Bring a bear
4: Delete Animal
5: Exit
Enter your choice:
1
Choose the type of lion you want:
1: Congo Lion
2: Barbary Lion
1
Enter name of lion:
Test
Menu Options:
1: Bring a lion
2: Bring a tiger
3: Bring a bear
4: Delete Animal
5: Exit
Enter your choice:
5
Creemos un caso de prueba de entrada simple:
$ cat in/1
1
1
Test
5
Ahora podemos iniciar el fuzzer fácilmente:
$ autoPwn
Setting up fuzz configuration
Target Binary (full or relative path): e67eb287f23011a40ef5bd5c2ad2f48ca97834cf
Command line args:
Number of cores (default: 8):
Test Case Dir (default: 'in/'):
Test Case Dir (default: 'out/'):
Max memory (default: 200): 4096
Starting fuzz
autoPwn> s
status check tool for afl-fuzz by <[email protected]>
Individual fuzzers
==================
>>> SESSION007 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION000 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION002 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION006 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION004 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION001 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION005 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION003 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
Summary stats
=============
Fuzzers alive : 8
Total run time : 0 days, 0 hours
Total execs : 0 million
Cumulative speed : 8 execs/sec
Pending paths : 8 faves, 8 total
Pending per fuzzer : 1 faves, 1 total (on average)
Crashes found : 0 locally unique
autoPwn> h
autoPwn
s == (s)tatus del fuzzer
e == recopilar (e)xploits
a == recopilar (a)ll paths (todas las rutas)
m == (m)inimizar corpus
q == (q)uit (salir)
Entonces, lo que sucedió aquí fue que el script creó algunos valores predeterminados (incluyendo la determinación de la cantidad de núcleos disponibles). Cambiamos un valor predeterminado debido a la necesidad de memoria extra para ejecutar esto en QEMU. autoPwn creó un archivo de configuración que luego le pasó a afl-utils (https://github.com/rc0r/afl-utils). En el archivo de configuración, también configuró afinidades de CPU, por lo que el fuzzing sería óptimo por defecto.
En este punto, su computadora está trabajando en el fuzzing. Sin embargo, un aspecto clave del fuzzing es minimizar el corpus. Con esto en mente, autoPwn está vigilando la instancia de afl-fuzz para monitorear cuándo se completa una serie de mutaciones. Cuando esto sucede, detiene el fuzzing (no es óptimo, pero está bien por ahora), minimiza el corpus y luego reinicia el fuzzing. Lo hace sin intervención humana, por lo que puede configurarlo y olvidarse.
En algún momento, es posible que desee echar un vistazo a las rutas que ha encontrado afl. Al ejecutar el comando "a", autoPwn copiará todas las rutas conocidas, minimizará el corpus y luego minimizará los casos mismos y los proporcionará en un directorio de salida.