
A Not So Very Intelligent Fuzzer: продвинутый фреймворк для фаззинга, предназначенный для поиска уязвимостей в коде на C/C++.
Не очень умный фаззер
Marshall Whittaker
oxagast
С ростом сложности системы растёт и потенциал проблем внутри неё.
--Закон Уиттакера
Зависимости для сборки:
automake autoconf-archive zlib1g-dev g++ gcc (и libgtk2.0-dev, если нужна поддержка GTK)
Сборка:
Linux:
$ aclocal && autoconf && automake -a && ./configure && make && make check
Или, если хотите поиграться с фаззером системных вызовов:
$ aclocal && autoconf && automake -a && ./configure --enable-syscalls && make && make check
Если хотите отключить GTK-интерфейс, выполните:
$ aclocal && autoconf && automake -a && ./configure --disable-gtk && make && make check
FreeBSD
Предполагая, что вы установили g++ из портов (он понадобится для C++11):
$ aclocal && autoconf && automake -a && ./configure && make && make check
OpenBSD:
Предполагая, что вы установили g++ из портов (он понадобится для 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:
Бинарные файлы Windows теперь предназначены для компиляции с помощью MinGW-W64 (поскольку мы используем многопоточность, скачайте версию MinGW-W64 g++ с seh). Вы можете попробовать скомпилировать после установки MinGW-W64 g++ с seh (только), запустив включённый скрипт make_win.bat. Если это не удаётся, скорее всего, проблема в окружении, поэтому попробуйте способ ниже.
(Перейдите туда, где установлен MinGW-W64, и запустите 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
Примечание: внешние файлы .dll cygwin больше не требуются, так как теперь мы компилируем с помощью g++ из MinGW. В Windows 7 по умолчанию установлен Powershell v2, однако эта программа требует как минимум Powershell v5. Windows 10 включает Powershell v5. Вы можете перейти на сайт Microsoft и скачать Windows Management Framework (который включает новые версии Powershell) здесь:
https://www.microsoft.com/en-us/download/details.aspx?id=50395
Тестирование:
Если вы хотите попробовать пример кода, скомпилируйте faulty.c с помощью:
$ gcc faulty.c -o faulty
Вы также можете просто выполнить make check.
Использование:
Важное примечание: пользователям Windows необходимо запускать ansvif.exe из Powershell, чтобы он работал!
$ ./find_suid /usr/bin/ /bin/ /sbin/
$ ./ansvif -[tm] [шаблон/man-страница] -c /путь/к/исполняемому -b размер_буфера
Примеры:
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"
Опции:
ansvif
-t Этот файл должен содержать аргументы командной строки построчно, как показано в примере.
-e Этот файл должен содержать переменные окружения построчно, как показано в примере.
Обычно их можно получить, выполнив что-то вроде:
$ strings /bin/mount | perl -ne 'print if /[A-Z]=$/' > mount_envs
-c Указывает путь к команде.
-p Указывает местоположение man-страницы (как целое число, обычно 1 или 8)
-m Указывает man-страницу команды.
-D Выводит содержимое man-страницы.
-f Количество используемых потоков. По умолчанию 2.
-b Указывает размер буфера для фаззинга. 256-2048 обычно достаточно.
-r Использует только случайные мусорные данные.
-o Записывает вывод в файл журнала.
-z Случайный размер буфера от 1 до указанного в -b.
-x Другой мусор для вставки. Сюда можно поместить имена пользователей и т.п.
-S Разделитель между опциями.
-s Спецификация пропущенных символов. По умолчанию <>\\n |&\[]\()\{}:; и новая строка обязательна.
-T Тайм-аут для потоков.
-W Тайм-аут для потоков.
-L Непривилегированный пользователь для запуска, если запуск от root.
-A Всегда помещать указанное после команды для запуска.
-B Всегда помещать указанное перед командой для запуска.
-F Файл для передачи в программу, в который будут помещены данные из -x вместе с обычными фаззинговыми данными.
-n Никогда не использовать случайные данные в фаззинге.
-R Выполнить эту команду после каждого фазза.
-C Нестандартный код ошибки для обнаружения.
-V Использовать Valgrind, если установлен.
-1 Попытаться вызвать ошибку один раз; если это не произойдёт, вернуть код ошибки 64. Полезно для скриптов.
-P Использовать % для представления двоичных данных в фаззинге.
-M Максимальное количество аргументов в фаззинге.
-y Сокращение для -b 0 и обычно полезно только с -A или -B.
-K Продолжать фаззинг после сбоя целевой программы.
-E Команда, выполняемая перед фаззируемой программой.
-0 Без нулевых символов в фаззинге.
-N Сокращение для -R "pkill prog".
-v Подробный вывод.
-d Отладочные данные.
-h Показать страницу справки.
-i Вывести информацию о версии.
ansvif_gtk
-l Сокращение для -p ./ansvif
-p Расположение бинарного файла ansvif
Рекомендации: Рекомендуется при длительных фаззах или фаззинге файлов, если возможно, помещать файлы (включая фаззируемый бинарный файл, если возможно) в память. То есть помещать их куда-то вроде /var/run/shm, где нагрузка на диск будет минимальна, а фаззинг будет несколько быстрее, особенно при работе с большими файлами. Однако предупреждаем: вы потеряете фаззированные файлы, если они находятся в shm, и вы перезагрузите машину!
НЕ ЗАПУСКАЙТЕ ЭТОТ КОД В ПРОДУКЦИОННОЙ СРЕДЕ! Если вы попытаетесь установить вывод faulty.c в suid(0), то, ПОЖАЛУЙСТА, делайте это на виртуальной машине. Или хотя бы на машине, которой вам не жалко. В остальном — просто играйтесь и получайте удовольствие!
Примечания:
Пользователи Windows должны запускать ansvif из Powershell. Код для Linux и Windows должен быть относительно стабильным. Фаззинг системных вызовов под Linux находится в активной разработке.
Благодарности
Спасибо dll999 за идеи по фаззингу системных вызовов. Спасибо moo из #2600 на 2600net за несколько рекомендаций для wiki-статьи. Спасибо богу знает скольким людям в IRC и на StackOverflow. Спасибо DarkSt0rm за исправление ошибки в Makefile.