Skip to content

Latest commit

 

History

History

OpenSSL

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Нахождение аварийного завершения OpenSSL-сервера, соответствующего уязвимости CVE-2016-6309.

Демонстрируются следующие возможности фаззера:

  1. Описание формата данных с помощью Peach Pit (модифицированного для Crusher).

  2. Замена вызовов некоторых функций целевой программы пользовательскими во время фаззинга. Т.к. речь идёт о сетевых функциях, которые работают медленно - обеспечивается ускорение запусков в десятки раз. Более подробно - см. раздел "PRELOAD" в документации фаззера.

Ниже представлены все этапы от подготовки к фаззингу до воспроизведения креша.

Подготовка OpenSSL сервера для фаззинга

Включает следующие этапы:

  1. Сборка компилятора для статической инструментации OpenSSL. Crusher совместим со статической инструментацией, реализованной в AFL++. На этом этапе скачивается и собирается AFL++ - в нём будет нужен только afl-gcc.
  2. Сборка OpenSSL со статической инструментацией. Скачивается (уязвимая) версия OpenSSL v1.1.0a и собирается с помощью afl-gcc.
  3. Генерация SSL-сертификата и ключа. Необходимы для работы OpenSSL сервера.
  4. Компиляция разделяемой библиотеки для замены некоторых сетевых функций (для ускорения фаззинга).

Для выполнения этих действий запустите:

./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.

Воспроизведение аварийного завершения

  1. Получить список креш-файлов:
find out -name id_crash_*
  1. Запуск сервера (будет слушать порт 4444):
./run_server.sh
  1. Запуск клиента (в другом терминале):
python run_client.py --ip 127.0.0.1 --port 4444 --crash-path <crash_path>

где <crash_path> - один из файлов, полученных в п. 1)

  1. В терминале с сервером наблюдаем его аварийное завершение. Если аварийного завершения не произошло, то повторяем п. 3) с другим файлом из п. 1)