
Manul è un fuzzatore parallelo guidato dalla copertura per binari open-source e blackbox su Windows, Linux e MacOS

Manul è un fuzzer parallelo guidato dalla copertura per binari open-source e black-box su Windows, Linux e macOS (beta) scritto in puro 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
Non è necessario installare radamsa su Windows, Manul è distribuito con la libreria nativa di radamsa su questa piattaforma.
| CVE IDs | Prodotto | Rilevatore |
|---|---|---|
| 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 |
Se sei riuscito a trovare un nuovo bug usando Manul, contattami e ti aggiungerò all'elenco.

pip install pywin32) su piattaforma Windows (richiesto solo per la modalità di persistenza DBI).Attualmente, Manul supporta due tipi di strumentazione: basata su AFL (afl-gcc, afl-clang e afl-clang-fast) e DBI.
Strumenta il tuo target con afl-gcc o afl-clang-fast e Address Sanitizer (raccomandato per risultati migliori). Ad esempio:
CC=afl-gcc CXX=afl-g++ CFLAGS=-fsanitize=address CXXFLAGS=-fsanitize=address cmake <percorso_al_target>
make -j 8
USE_ASAN=1 CC=afl-clang-fast CXX=afl-clang-fast++ cmake <percorso_al_target>
make -j 8
Vedi queste istruzioni per maggiori dettagli.
In questa modalità non è necessario strumentare il target, ma è necessario scaricare l'ultima versione del framework DynamoRIO per Windows o Linux.
Manul è distribuito con client x86/x64 precompilati per Linux e Windows. Puoi trovarli nelle seguenti cartelle:
linux/dbi_32|dbi_64/libbinafl.so (client DynamoRIO)
win/dbi_32|dbi_64/binafl.dll
Purtroppo DynamoRIO non è ufficialmente supportato su MacOS.
Puoi trovare i pacchetti di rilascio più recenti di DynamoRIO alla pagina di download di DynamoRIO.
Devi decommentare le seguenti righe nel file manul.config e fornire il percorso corretto al launcher e al client di DynamoRIO.
# Scegli il framework DBI per fornire la copertura a Manul ("dynamorio" o "pin"). Esempio dbi = dynamorio
dbi = dynamorio
# Se il parametro dbi non è None, devono essere specificati il percorso del launcher del motore DBI e del client DBI.
dbi_root = /home/max/DynamoRIO/bin64/drrun
dbi_client_root = /home/max/manul/linux/dbi_64/libbinafl.so
dbi_client_libs = None
Inoltre, puoi aumentare le prestazioni della tua campagna di fuzzing black-box utilizzando il fuzzing persistente in memoria. In questa modalità, dovresti istruire Manul a strumentare una particolare funzione (sì, devi trovarla disassemblando il tuo binario) e la eseguirà in un ciclo decommentando le seguenti righe:
dbi_persistence_mode = 1
dbi_target_module = afl_test
dbi_target_method = open_file
#dbi_target_offset = 0x3198 # opzionalmente puoi fornire l'offset di questa funzione invece del nome
dbi_fuzz_iterations = 1000
Gli autori di winAFL forniscono una spiegazione molto chiara su come funziona effettivamente qui. Manul utilizza una larga porzione del codice della libreria di strumentazione di winAFL per comunicare e strumentare un target.
NOTA IMPORTANTE: Dovresti usare il launcher a 32 bit e il client a 32 bit per fare fuzzing di binari a 32 bit, e il launcher a 64 bit e il client a 64 bit per binari a 64 bit!
Per compilare la libreria di strumentazione, devi usare l'ultima versione di DynamoRIO. Il codice sorgente della libreria di strumentazione si trova in dbi_clients_src nella cartella principale di Manul.
Linux a 64 bit
cd dbi_clients_src
wget <DynamoRIO-x86_64-Linux-X.XX.XXXX-X.tar.gz> - scarica l'ultimo 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 a 32 bit
cd dbi_clients_src
wget <DynamoRIO-i386-Linux-X.XX.XXXX-X.tar.gz> - scarica l'ultimo 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
Su Windows, il modo più semplice per compilare la libreria è installare Visual Studio (testato su versioni 2017 e 2013), avviare il Prompt dei comandi degli strumenti incrociati VS20XX ed eseguire i seguenti comandi:
Windows a 64 bit
cd dbi_clients_src
<Scarica ed estrai l'ultima versione di 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 (o Debug se necessario)
Windows a 32 bit
cd dbi_clients_src
<Scarica ed estrai l'ultima versione di 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 (o Debug se necessario)
Manul inizialmente supportava il fuzzing guidato dalla copertura con Intel PIN, ma a causa delle basse prestazioni e dell'elevato overhead di manutenzione, questo non è più supportato.
Le opzioni più frequentemente utilizzate possono essere fornite tramite riga di comando. Ulteriori opzioni sono supportate tramite file di configurazione (manul.config).
Esempio: python3 manul.py -i corpus -o out_dir -n 40 "target @@"
argomenti posizionali:
target_binary Il binario target e le opzioni da eseguire (non dimenticare le virgolette, es. "target e @@").
argomenti opzionali:
-h, --help mostra questo messaggio di aiuto ed esce
-n NFUZZERS Numero di fuzzer paralleli
-s Esegui fuzzing stupido (nessuna strumentazione del codice)
-c CONFIG Percorso del file di configurazione con opzioni aggiuntive (vedi la sezione Opzioni del File di Configurazione sotto)
-r Ripristina sessione precedente
Parametri richiesti:
-i INPUT Percorso della directory con il corpus iniziale
-o OUTPUT Percorso della directory di output