autoPwn - Automatizar tareas repetitivas para Fuzzing


Advertencia
Completamente reescribiendo esto ahora mismo. El enfoque estará en las aplicaciones interactivas de Linux que solo reciben información de stdin para empezar. Intentando usar las funciones de Shellphish's Driller y Fuzzer .
AutoPwn en su estado actual hará esto en forma limitada. Simplemente ejecute y autoPwn ./binaryluego seleccione la opción Iniciar.


Instalación
Teniendo en cuenta todos los problemas de dependencia aquí, la forma más fácil de auto-crear y ejecutar es usar la compilación Docker. Tenga en cuenta, se puede quitar la --security-opt y la declaración --cap-añadir, pero algunos de fuzzing aspectos no será del todo.
$ sudo docker pull bannsec/autoPwn
$ sudo docker run -it -v $PWD:/mount --security-opt="apparmor=unconfined" --cap-add=SYS_PTRACE bannsec/autoPwn
En la compilación Docker, todo debería estar listo para funcionar. Simplemente puede iniciar la herramienta con:
$ autoPwn ./file

La fuente de
compilación para fuzzing autoPwn intenta hacer que la fuente de compilación para fuzzing un proyecto sea más fácil. Para ayudar con esto,autoPwnCompilefue creado. Simplemente apúntelo a su código fuente y asígnele opciones que generarán un ejecutable listo para ser difuso.
usage: autoPwnCompile [-h] [--file FILE] [--ASAN | --MSAN] [--UBSAN]
                      [--fuzzer FUZZER]

Compile source to binaries for use in autoPwn.

optional arguments:
  -h, --help       show this help message and exit
  --file FILE      Single file to compile.
  --ASAN           Enable ASAN (default off)
  --MSAN           Enable MSAN (default off)
  --UBSAN          Enable UBSAN (default off)
  --fuzzer FUZZER  (optional) What fuzzer to compile for. Options are:
                   ['AFL']. Default is AFL.
El siguiente es de la versión antigua de autoPwn .. 

Descripción
autoPwn es un nombre elevado para un script simple. Cuando trabajaba con fuzzing y afl-fuzz, noté que haría las mismas tareas una y otra vez. Con esto en mente, quería crear un script que lograra lo siguiente:
  1. Automatice y simplifique la tarea de iniciar el fuzzer a través de indicaciones inteligentes
  2. Automatice y simplifique la tarea de reiniciar el fuzzer a través de un archivo de configuración
  3. Automatizar completamente el proceso de minimizaciones de colas de afl.
  4. Automatice completamente el proceso de extracción y minimización de todas las rutas explotables posibles.
  5. Automatice completamente el proceso de extracción y minimización de todas las rutas posibles en general.
  6. Automatice total o parcialmente la generación de valores de ruta iniciales.
Hasta ahora, el script es capaz de los primeros 5. La parte 6 es especulativa y está intentando desarrollarse ahora mismo. Se aprovecharía el motor de ejecución simbólica de angr para crear posibles rutas iniciales. En ese punto, el script podría, en teoría, automatizar completamente las tareas de fuzzing simples .

Ejemplo
Echemos un vistazo a un desafío reciente de TUCTF llamado "WoO2". Si bien no necesariamente encuentra la vulnerabilidad necesaria, muestra cómo se puede usar autoPwn para simplificar el descubrimiento de rutas.
Aquí hay una ejecución básica a través 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
Vamos a crear un caso de prueba de entrada simple:
$ cat in/1 
1
1
Test
5
Ahora podemos arrancar fácilmente el fuzzer:
$ 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 

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 == fuzzer (s)tatus
     e == collect (e)xploits
     a == collect (a)ll paths
     m == (m)inimize corpus
     q == (q)uit

Entonces, lo que ocurrió aquí fue que el script creó algunos valores predeterminados (incluida la determinación del número de núcleos disponibles). Cambiamos un valor predeterminado debido a la necesidad de memoria adicional para ejecutar esto en QEMU. autoPwn creó un archivo de configuración que luego le dio a afl-utils ( https://github.com/rc0r/afl-utils ). En el archivo de configuración, también configura las afinidades de la CPU, por lo que el fuzzing sería óptimo por defecto.
En este punto, tu computadora se está deshaciendo de la confusión. Sin embargo, un aspecto clave de fuzzing es minimizar el corpus. Con esto en mente, autoPwn está observando la instancia de afl-fuzz para monitorear cuando se completa una serie de mutaciones. Cuando esto suceda, dejará de fuzzing (no es óptimo, pero está bien por ahora), minimiza el cuerpo y luego reinicia fuzzing. Lo hace sin ninguna intervención humana para que puedas disparar y olvidar.
En algún momento es posible que desee echar un vistazo a los caminos que ha encontrado afl. Al ejecutar el comando "a", autoPwn copiará todas las rutas conocidas, minimizará el cuerpo y luego minimizará los casos y los proporcionará en un directorio de salida.


Comentarios