
Manul é um fuzzer paralelo guiado por cobertura para binários de código aberto e blackbox no Windows, Linux e MacOS.

O Manul é um fuzzer paralelo guiado por cobertura para binários de código aberto e caixa-preta no Windows, Linux e macOS (beta) escrito em 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
Não há necessidade de instalar o radamsa no Windows, o Manul é distribuído com a biblioteca nativa do radamsa nesta plataforma.
| CVE IDs | Produto | Descobridor |
|---|---|---|
| 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 você conseguiu encontrar um novo bug usando o Manul, entre em contato comigo e eu o adicionarei na lista.

pip install pywin32) na plataforma Windows (necessário apenas para o modo de persistência DBI).Atualmente, o Manul suporta dois tipos de instrumentação: baseada em AFL (afl-gcc, afl-clang e afl-clang-fast) e DBI.
Instrumente seu alvo com afl-gcc ou afl-clang-fast e Address Sanitizer (recomendado para melhores resultados). Por exemplo:
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
Veja estas instruções para mais detalhes.
Você não precisa instrumentar seu alvo neste modo, mas precisa baixar a versão mais recente do framework DynamoRIO para Windows ou Linux.
O Manul é distribuído com clientes pré-compilados x86/x64 para Linux e Windows. Você pode encontrá-los nas seguintes pastas:
linux/dbi_32|dbi_64/libbinafl.so (DynamoRIO client)
win/dbi_32|dbi_64/binafl.dll
Infelizmente, o DynamoRIO não é oficialmente suportado no MacOS.
Você pode encontrar os pacotes de lançamento mais recentes do DynamoRIO na página de download do DynamoRIO.
Você precisa descomentar as seguintes linhas no arquivo manul.config e fornecer o caminho correto para o lançador e cliente do 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
Além disso, você pode aumentar o desempenho da sua campanha de fuzzing caixa-preta usando fuzzing persistente em memória. Neste modo, você deve instruir o Manul a instrumentar uma função específica (sim, você precisa encontrá-la desmontando seu binário) e ele a executará em um loop descomentando as seguintes linhas:
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
Os autores do winAFL fornecem uma explicação muito boa sobre como isso realmente funciona aqui. O Manul usa uma grande parte do código da biblioteca de instrumentação do winAFL para se comunicar e instrumentar um alvo.
NOTA IMPORTANTE: Você deve usar o lançador de 32 bits e o cliente de 32 bits para fuzzear binários de 32 bits e o lançador de 64 bits e o cliente de 64 bits para binários de 64 bits!
Para compilar a biblioteca de instrumentação, você precisa usar a versão mais recente do DynamoRIO. O código fonte da biblioteca de instrumentação pode ser encontrado em dbi_clients_src localizado na pasta principal do 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
No Windows, a maneira mais fácil de compilar a biblioteca seria instalar o Visual Studio (testado nas versões 2017 e 2013), iniciar o VS20XX Cross Tools Command Prompt e executar os seguintes comandos:
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)
O Manul inicialmente suportava fuzzing guiado por cobertura com Intel PIN, mas devido ao baixo desempenho e alta sobrecarga de manutenção, isso não é mais suportado.
As opções mais usadas podem ser fornecidas via linha de comando. Mais opções são suportadas usando o arquivo de configuração (manul.config).
Example: python3 manul.py -i corpus -o out_dir -n 40 "target @@"
argumentos posicionais:
target_binary O binário alvo e opções a serem executados (não esqueça de incluir aspas, ex.: "target e @@").
argumentos opcionais:
-h, --help mostra esta mensagem de ajuda e sai
-n NFUZZERS Número de fuzzers paralelos
-s Executar fuzzing burro (sem instrumentação de código)
-c CONFIG Caminho para o arquivo de configuração com opções adicionais (veja a seção Opções do Arquivo de Configuração abaixo)
-r Restaurar sessão anterior
Parâmetros obrigatórios:
-i INPUT Caminho para o diretório com o corpus inicial
-o OUTPUT Caminho para o diretório de saída