
Manul es un fuzzer paralelo guiado por cobertura para binarios de código abierto y de caja negra en Windows, Linux y MacOS

Manul es un fuzzer paralelo guiado por cobertura para binarios de código abierto y caja negra en Windows, Linux y macOS (beta) escrito en Python puro.
pip3 install psutil
git clone https://github.com/mxmssh/manul
cd manul
mkdir in
mkdir out
echo "AAAAAA" > in/test
python3 manul.py -i in -o out -n 4 "linux/test/test_afl @@"
sudo apt-get install gcc make git wget
git clone https://gitlab.com/akihe/radamsa.git && cd radamsa && make && sudo make install
No es necesario instalar radamsa en Windows, Manul se distribuye con la biblioteca nativa de radamsa en esta plataforma.
| CVE IDs | Producto | Descubridor |
|---|---|---|
| CVE-2019-9631 CVE-2019-7310 CVE-2019-9959 | Poppler | Maksim Shudrak |
| CVE-2018-17019 CVE-2018-16807 CVE-2019-12175 | Bro/Zeek | Maksim Shudrak |
Si encontraste un nuevo error usando Manul, por favor contáctame y te agregaré a la lista.

pip install pywin32) en la plataforma Windows (requerido solo para el modo de persistencia DBI).Actualmente, Manul soporta dos tipos de instrumentación: basada en AFL (afl-gcc, afl-clang y afl-clang-fast) y DBI.
Instrumenta tu objetivo con afl-gcc o afl-clang-fast y Address Sanitizer (recomendado para mejores resultados). Por ejemplo:
CC=afl-gcc CXX=afl-g++ CFLAGS=-fsanitize=address CXXFLAGS=-fsanitize=address cmake <path_to_your_target>
make -j 8
USE_ASAN=1 CC=afl-clang-fast CXX=afl-clang-fast++ cmake <path_to_your_target>
make -j 8
Consulta estas instrucciones para más detalles.
No necesitas instrumentar tu objetivo en este modo, pero necesitas descargar la última versión del framework DynamoRIO para Windows o Linux.
Manul se distribuye con clientes precompilados x86/x64 para Linux y Windows. Puedes encontrarlos en las siguientes carpetas:
linux/dbi_32|dbi_64/libbinafl.so (DynamoRIO client)
win/dbi_32|dbi_64/binafl.dll
Desafortunadamente, DynamoRIO no es compatible oficialmente en macOS.
Puedes encontrar los paquetes de la última versión de DynamoRIO en la página de descarga de DynamoRIO.
Tienes que descomentar las siguientes líneas en el archivo manul.config y proporcionar la ruta correcta al lanzador y cliente de DynamoRIO.
# Choose DBI framework to provide coverage back to Manul ("dynamorio" or "pin"). Example dbi = dynamorio
dbi = dynamorio
# If dbi parameter is not None the path to dbi engine launcher and dbi client should be specified.
dbi_root = /home/max/DynamoRIO/bin64/drrun
dbi_client_root = /home/max/manul/linux/dbi_64/libbinafl.so
dbi_client_libs = None
Además, puedes aumentar el rendimiento de tu campaña de fuzzing de caja negra usando fuzzing persistente en memoria. En este modo, debes indicarle a Manul que instrumente una función particular (sí, necesitas encontrarla desensamblando tu binario) y la ejecutará en un bucle descomentando las siguientes líneas:
dbi_persistence_mode = 1
dbi_target_module = afl_test
dbi_target_method = open_file
#dbi_target_offset = 0x3198 # optionally you can provide offset of this function instead of name
dbi_fuzz_iterations = 1000
Los autores de winAFL proporcionan una muy buena explicación de cómo funciona realmente aquí. Manul usa una gran parte del código de la biblioteca de instrumentación de winAFL para comunicarse e instrumentar un objetivo.
NOTA IMPORTANTE: ¡Debes usar un lanzador de 32 bits y un cliente de 32 bits para fuzzear binarios de 32 bits, y un lanzador de 64 bits y un cliente de 64 bits para binarios de 64 bits!
Para compilar la biblioteca de instrumentación, necesitas usar la última versión de DynamoRIO. El código fuente de la biblioteca de instrumentación se puede encontrar en dbi_clients_src ubicado en la carpeta principal de Manul.
64-bit Linux
cd dbi_clients_src
wget <DynamoRIO-x86_64-Linux-X.XX.XXXX-X.tar.gz> - download the latest DynamoRIO
tar xvf DynamoRIO-x86_64-X.XX.XXXX-X.tar.gz
mkdir client_64
cd client_64
cmake ../dr_cov/ -DDynamoRIO_DIR=/home/max/manul/dbi_clients_src/DynamoRIO-x86_64-Linux-X.XX.XXXX-X.tar.gz/cmake
make
32-bit Linux
cd dbi_clients_src
wget <DynamoRIO-i386-Linux-X.XX.XXXX-X.tar.gz> - download the latest DynamoRIO
tar xvf DynamoRIO-x86_64-X.XX.XXXX-X.tar.gz
mkdir client_64
cd client_64
CFLAGS=-m32 CXXFLAGS=-m32 cmake ../dr_cov/ -DDynamoRIO_DIR=/home/max/manul/dbi_clients_src/DynamoRIO-i386-Linux-X.XX.XXXX-X.tar.gz/cmake
make
On Windows, the easiest way to compile the library would be to install Visual Studio (tested on 2017 & 2013 versions), launch VS20XX Cross Tools Command Prompt and run the following commands:
64-bit Windows
cd dbi_clients_src
<Download and extract the latest version of DynamoRIO>
mkdir client_64
cd client_64
cmake -G"Visual Studio 15 Win64" ..\dr_cov\ -DDynamoRIO_DIR=C:\Users\max\manul\dbi_clients_src\DynamoRIO-Windows-XXXX.XX.X.X\cmake
cmake --build . --config RelWithDebInfo (or just Debug if needed)
32-bit Windows
cd dbi_clients_src
<Download and extract the latest version of DynamoRIO>
mkdir client_32
cd client_32
cmake -G"Visual Studio 15" ..\dr_cov\ -DDynamoRIO_DIR=C:\Users\max\manul\dbi_clients_src\DynamoRIO-Windows-XXXX.XX.X.X\cmake
cmake --build . --config RelWithDebInfo (or just Debug if needed)
Manul inicialmente soportaba fuzzing guiado por cobertura con Intel PIN, pero debido al bajo rendimiento y la alta sobrecarga de mantenimiento, ya no es compatible.
Example: python3 manul.py -i corpus -o out_dir -n 40 "target @@"
positional arguments:
target_binary The target binary and options to be executed (don't forget to include quotes e.g. "target e @@").
optional arguments:
-h, --help show this help message and exit
-n NFUZZERS Number of parallel fuzzers
-s Run dumb fuzzing (no code instrumentation)
-c CONFIG Path to config file with additional options (see Configuration File Options section below)
-r Restore previous session
Required parameters:
-i INPUT Path to directory with initial corpus
-o OUTPUT Path to output directory
Manul se distribuye con el archivo manul.config predeterminado donde el usuario puede encontrar todas las opciones compatibles y ejemplos de uso. Las opciones deben especificarse en el siguiente formato Formato: <nombre_opción> = <valor>. El símbolo # se puede usar para ignorar una línea.