
A Not So Very Intelligent Fuzzer: Um framework avançado de fuzzing projetado para encontrar vulnerabilidades em código C/C++.
Um Fuzzer Não Tão Inteligente
Marshall Whittaker
oxagast
À medida que a complexidade de um sistema aumenta, também aumenta o potencial para problemas dentro desse sistema.
--Lei de Whittaker
Dependências de Compilação:
automake autoconf-archive zlib1g-dev g++ gcc (e libgtk2.0-dev se desejar suporte GTK)
Compilação:
Linux:
$ aclocal && autoconf && automake -a && ./configure && make && make check
Ou, se quiser brincar com o fuzzer de chamadas de sistema:
$ aclocal && autoconf && automake -a && ./configure --enable-syscalls && make && make check
Se quiser desabilitar a interface GTK, pode fazer:
$ aclocal && autoconf && automake -a && ./configure --disable-gtk && make && make check
FreeBSD
Supondo que você instalou o g++ a partir dos ports (necessário para C++11):
$ aclocal && autoconf && automake -a && ./configure && make && make check
OpenBSD:
Supondo que você instalou o g++ a partir dos ports (necessário para C++11):
$ CXX=$(find / -name 'eg++' 2>/dev/null | grep ports | head -n 1) AUTOCONF_VERSION=2.69 AUTOMAKE_VERSION=1.15 autoreconf -fmi
Windows:
Os binários do Windows agora são projetados para serem compilados com MinGW-W64 (já que usamos threading, baixe uma versão do MinGW-W64 g++ com seh). Você pode tentar compilar após instalar o MinGW-W64 g++ com seh (apenas) clicando no script make_win.bat incluído. Se falhar, provavelmente é devido ao ambiente, então tente o abaixo.
(Vá para onde instalou o MinGW-W64 e clique em mingw-64.bat)
windres metadata.rc -O coff -o metadata.res
g++.exe src/common.cpp src/bin2hex.cpp src/popen2.cpp src/main.cpp src/help.cpp src/match_fault.cpp src/sys_string.cpp src/man_read.cpp src/randomizer.cpp src/trash.cpp src/log.cpp metadata.res src/version.h -I./ -I./include -std=c++11 -lstdc++ -lpthread -O2 -o ansvif.exe -static -static-libgcc -static-libstdc++
gcc src/win/printf.c -o printf.exe
Nota: arquivos .dll externos do cygwin não são mais necessários, pois agora compilamos com g++ do MinGW. No Windows 7, o Powershell v2 é instalado por padrão, no entanto, este programa requer pelo menos o Powershell v5. O Windows 10 inclui o Powershell v5. Você pode acessar o site da Microsoft e baixar o Windows Management Framework (que inclui versões mais recentes do Powershell) aqui:
https://www.microsoft.com/en-us/download/details.aspx?id=50395
Testes:
Se quiser experimentar o código de exemplo, pode compilar o faulty.c com:
$ gcc faulty.c -o faulty
Você também pode simplesmente executar make check.
Uso:
Nota importante: Usuários do Windows devem executar ansvif.exe a partir do Powershell para que funcione!
$ ./find_suid /usr/bin/ /bin/ /sbin/
$ ./ansvif -[tm] [template/manpage] -c /path/to/executable -b buffersize
Exemplos:
Linux/BSD:
$ ulimit -c unlimited
$ ./ansvif -m mount -c /bin/mount -e examples/mount_e.txt -x examples/mount_o.txt\
-f 8 -b 2048
$ ./ansvif -t examples/blank.txt -F tmp/tmphtml -x examples/htmltags.txt -c /usr/bin/iceweasel -b\
128 -A "file:///home/username/src/ansvif/tmp/tmphtml" -f 2 -n -R "sleep 3 && killall\
iceweasel" -S ">"
$ cat examples/linux_syscalls_implemented.list | xargs -P \
`cat examples/linux_syscalls_implemented.list | wc -l` -I {calls} ./ansvif -t examples/space.txt \
-B "{calls} " -c ./syscalls -o syscall_crash -f 1 -z -d -b 16
Windows:
PS C:\ansvif\bin\ansvif_win> .\ansvif -t ..\..\examples\space -F ..\..\tmp\tmphtml -x `
..\..\examples\htmltags -c `
'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' `
-b 128 -A "file:///C:\\Users\marsh\OneDrive\Documents\Code\ansvif\tmp\tmphtml" `
-f 2 -n -S ">" -R "sleep 2 ; Stop-Process -Name chrome"
Opções:
ansvif
-t Este arquivo deve conter argumentos de linha de comando linha por linha, conforme mostrado no arquivo de exemplo.
-e Este arquivo deve conter variáveis de ambiente linha por linha, conforme mostrado no arquivo de
exemplo. Você geralmente pode obtê-las fazendo algo como:
$ strings /bin/mount | perl -ne 'print if /[A-Z]=$/' > mount_envs
-c Especifica o caminho do comando.
-p Especifica a localização da manpage (como um inteiro, geralmente 1 ou 8)
-m Especifica a manpage do comando.
-D Despeja o que é encontrado na manpage.
-f Número de threads a serem usados. O padrão é 2.
-b Especifica o tamanho do buffer para fuzzar. 256-2048 geralmente é suficiente.
-r Usa apenas dados aleatórios de lixo.
-o Escreve a saída em um arquivo de log.
-z Randomiza o tamanho do buffer de 1 até o especificado por -b.
-x Outros itens a serem inseridos. Nomes de usuário e afins podem ir aqui.
-S Separador entre opções.
-s Especificação de caracteres omitidos. Os padrões são <>\\n |&\[]\()\{}:;\ e a nova linha é obrigatória.
-T Timeout para threads.
-W Timeout para threads.
-L Usuário não privilegiado para executar como root.
-A Sempre coloca o que está depois disso após o comando a ser executado.
-B Sempre coloca o que está depois disso antes do comando a ser executado.
-F Arquivo para alimentar o programa onde -x juntamente com dados normais de fuzzing serão colocados.
-n Nunca usa dados aleatórios no fuzz.
-R Executa este comando após cada fuzz.
-C Um código de erro não padrão para detectar.
-V Usa Valgrind se instalado.
-1 Tenta fazer com que falhe uma vez; se não acontecer, retorna código de erro 64. Útil para scripts.
-P Usa % para representar binário no fuzz.
-M Número máximo de argumentos a serem usados no fuzz.
-y Atalho para -b 0 e geralmente útil apenas com -A ou -B.
-K Continua fuzzing após uma falha no alvo.
-E Um comando a ser executado antes do programa fuzzeado.
-0 Nenhum caractere NULL no fuzz.
-N Abreviação para -R "pkill prog".
-v Verboso.
-d Dados de depuração.
-h Mostra a página de ajuda.
-i Exibe informações da versão.
ansvif_gtk
-l Atalho para -p ./ansvif
-p A localização do binário ansvif
Recomendações: Recomenda-se que, se você estiver realizando fuzzes longos ou fuzzing de arquivos, se possível, coloque os arquivos (incluindo o binário que está sendo fuzzeado, se possível) na memória. Isso significa colocá-los em algum lugar como /var/run/shm, onde o thrash de disco será mínimo, e o fuzzing será um pouco mais rápido, especialmente se arquivos grandes estiverem sendo manipulados. No entanto, esteja avisado: você perderá seus arquivos fuzzeados se eles estiverem em shm e você reiniciar a máquina!
NÃO EXECUTE ESTE CÓDIGO EM UM AMBIENTE DE PRODUÇÃO! Se você tentar definir a saída de faulty.c para suid(0), então, POR FAVOR, faça isso em uma máquina virtual. ou pelo menos em uma máquina que não lhe importe. Fora isso, apenas brinque e divirta-se!
Notas:
Usuários do Windows devem executar ansvif a partir do Powershell. O código do Linux e do Windows deve ser relativamente estável. O fuzzing de chamadas de sistema no Linux está em desenvolvimento intenso.
Agradecimentos
Agradecimentos a dll999 pelas ideias de fuzzing de chamadas de sistema. Agradecimentos a moo do #2600 na 2600net por algumas recomendações no artigo da wiki. Agradecimentos a não sei quantas pessoas no IRC e no StackOverflow. Agradecimentos a DarkSt0rm por corrigir um bug no Makefile.