Нахождение аварийного завершения OpenSSL-сервера, соответствующего уязвимости CVE-2016-6309.
Демонстрируются следующие возможности фаззера:
-
Описание формата данных с помощью Peach Pit (модифицированного для Crusher).
-
Замена вызовов некоторых функций целевой программы пользовательскими во время фаззинга. Т.к. речь идёт о сетевых функциях, которые работают медленно - обеспечивается ускорение запусков в десятки раз. Более подробно - см. раздел
"PRELOAD"
в документации фаззера.
Ниже представлены все этапы от подготовки к фаззингу до воспроизведения креша.
Включает следующие этапы:
- Сборка компилятора для статической инструментации OpenSSL.
Crusher
совместим со статической инструментацией, реализованной вAFL++
. На этом этапе скачивается и собираетсяAFL++
- в нём будет нужен толькоafl-gcc
. - Сборка OpenSSL со статической инструментацией.
Скачивается (уязвимая) версия OpenSSL v1.1.0a и собирается с помощью
afl-gcc
. - Генерация SSL-сертификата и ключа. Необходимы для работы OpenSSL сервера.
- Компиляция разделяемой библиотеки для замены некоторых сетевых функций (для ускорения фаззинга).
Для выполнения этих действий запустите:
./build.sh
Для правильного детектирования аварийных завершений целевой программы со статической инструментацией выполнить:
sudo su
echo core >/proc/sys/kernel/core_pattern
exit
Запустите фаззинг через fuzz.sh
, указав путь до fuzz_manager
(опция -f
) и число ядер для фаззинга (опция -c
):
ISP_PRELOAD=$PWD/custom_lib/custom_lib.so ./fuzz.sh -f /path/to/crusher/bin_x86-64/fuzz_manager -c 4
Запустите в другом терминале UI фаззера:
/path/to/crusher/bin_x86-64/ui -o out
В правом верхнем углу окна пользовательского интерфейса можно наблюдать окно Stats
. В нём обратите внимание на поле unique_crashes
.
Как только будет найдено аварийное завершение, значение поля unique_crashes
станет ненулевым. Пока значение поля нулевое - не останавливайте фаззинг.
Желательно дождаться, когда значение поля будет больше 1. После этого можно остановить фаззинг:
- в терминале с
UI
(пользовательский интерфейс) - для выхода изUI
нажмите кнопкуq
; - в терминале с запущенным фаззингом завершите фаззинг по комбинации клавиш
Ctrl+C
.
- Получить список креш-файлов:
find out -name id_crash_*
- Запуск сервера (будет слушать порт 4444):
./run_server.sh
- Запуск клиента (в другом терминале):
python run_client.py --ip 127.0.0.1 --port 4444 --crash-path <crash_path>
где <crash_path>
- один из файлов, полученных в п. 1)
- В терминале с сервером наблюдаем его аварийное завершение. Если аварийного завершения не произошло, то повторяем п. 3) с другим файлом из п. 1)