
Manul est un fuzzer parallèle guidé par la couverture pour binaires open-source et blackbox sur Windows, Linux et MacOS

Manul est un fuzzer parallèle guidé par couverture pour les binaires open-source et boîte noire sur Windows, Linux et macOS (bêta) écrit en pur Python.
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
Il n'est pas nécessaire d'installer radamsa sur Windows, Manul est distribué avec la bibliothèque native radamsa sur cette plateforme.
| Identifiants CVE | Produit | Découvreur |
|---|---|---|
| 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 vous avez réussi à trouver un nouveau bogue en utilisant Manul, veuillez me contacter et je vous ajouterai à la liste.

pip install pywin32) sur la plateforme Windows (nécessaire uniquement pour le mode persistance DBI).Actuellement, Manul prend en charge deux types d'instrumentation : basée sur AFL (afl-gcc, afl-clang et afl-clang-fast) et DBI.
Instrumentez votre cible avec afl-gcc ou afl-clang-fast et Address Sanitizer (recommandé pour de meilleurs résultats). Par exemple :
CC=afl-gcc CXX=afl-g++ CFLAGS=-fsanitize=address CXXFLAGS=-fsanitize=address cmake <chemin_vers_votre_cible>
make -j 8
USE_ASAN=1 CC=afl-clang-fast CXX=afl-clang-fast++ cmake <chemin_vers_votre_cible>
make -j 8
Voir ces instructions pour plus de détails.
Vous n'avez pas besoin d'instrumenter votre cible dans ce mode mais vous devez télécharger la dernière version du framework DynamoRIO pour Windows ou Linux.
Manul est distribué avec des clients x86/x64 précompilés pour Linux et Windows. Vous pouvez les trouver dans les dossiers suivants :
linux/dbi_32|dbi_64/libbinafl.so (client DynamoRIO)
win/dbi_32|dbi_64/binafl.dll
Malheureusement, DynamoRIO n'est pas officiellement pris en charge sur MacOS.
Vous pouvez trouver les derniers paquets de version de DynamoRIO sur la page de téléchargement de DynamoRIO.
Vous devez décommenter les lignes suivantes dans le fichier manul.config et fournir le chemin correct vers le lanceur et le client DynamoRIO.
# Choisir le framework DBI pour fournir la couverture à Manul ("dynamorio" ou "pin"). Exemple dbi = dynamorio
dbi = dynamorio
# Si le paramètre dbi n'est pas None, le chemin vers le lanceur du moteur DBI et le client DBI doivent être spécifiés.
dbi_root = /home/max/DynamoRIO/bin64/drrun
dbi_client_root = /home/max/manul/linux/dbi_64/libbinafl.so
dbi_client_libs = None
De plus, vous pouvez augmenter les performances de votre campagne de fuzzing en boîte noire en utilisant le fuzzing persistant en mémoire. Dans ce mode, vous devez indiquer à Manul d'instrumenter une fonction particulière (oui, vous devez la trouver en désassemblant votre binaire) et il l'exécutera en boucle en décommentant les lignes suivantes :
dbi_persistence_mode = 1
dbi_target_module = afl_test
dbi_target_method = open_file
#dbi_target_offset = 0x3198 # optionnellement, vous pouvez fournir l'offset de cette fonction au lieu du nom
dbi_fuzz_iterations = 1000
Les auteurs de winAFL fournissent une très bonne explication sur son fonctionnement ici. Manul utilise une grande partie du code de la bibliothèque d'instrumentation de winAFL pour communiquer et instrumenter une cible.
NOTE IMPORTANTE : Vous devez utiliser un lanceur 32 bits et un client 32 bits pour fuzzer les binaires 32 bits et un lanceur 64 bits et un client 64 bits pour les binaires 64 bits !
Pour compiler la bibliothèque d'instrumentation, vous devez utiliser la dernière version de DynamoRIO. Le code source de la bibliothèque d'instrumentation se trouve dans dbi_clients_src situé dans le dossier principal de Manul.
Linux 64 bits
cd dbi_clients_src
wget <DynamoRIO-x86_64-Linux-X.XX.XXXX-X.tar.gz> - télécharger la dernière version de 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
Linux 32 bits
cd dbi_clients_src
wget <DynamoRIO-i386-Linux-X.XX.XXXX-X.tar.gz> - télécharger la dernière version de 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
Sur Windows, la façon la plus simple de compiler la bibliothèque serait d'installer Visual Studio (testé sur les versions 2017 et 2013), de lancer VS20XX Cross Tools Command Prompt et d'exécuter les commandes suivantes :
Windows 64 bits
cd dbi_clients_src
<Télécharger et extraire la dernière version de 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 (ou Debug si nécessaire)
Windows 32 bits
cd dbi_clients_src
<Télécharger et extraire la dernière version de 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 (ou Debug si nécessaire)
Manul prenait initialement en charge le fuzzing guidé par couverture Intel PIN mais en raison de faibles performances et d'une surcharge de maintenance élevée, ce n'est plus pris en charge.
Les options les plus fréquemment utilisées peuvent être fournies via la ligne de commande. Davantage d'options sont prises en charge via le fichier de configuration (manul.config).
Exemple : python3 manul.py -i corpus -o out_dir -n 40 "cible @@"
arguments positionnels :
target_binary Le binaire cible et les options à exécuter (n'oubliez pas d'inclure les guillemets, par exemple "cible e @@").