|
1 | | -Нахождение аварийного завершения OpenSSL-сервера, соответствующего уязвимости `CVE-2016-6309`. |
2 | | - |
3 | | -Демонстрируются следующие возможности фаззера: |
4 | | - |
5 | | -1) Описание формата данных с помощью `Peach Pit` (модифицированного для `Crusher`); |
6 | | - |
7 | | -2) Замена вызовов некоторых функций целевой программы пользовательскими во время фаззинга. |
8 | | -Т.к. речь идёт о сетевых функциях, которые работают медленно - обеспечивается ускорение запусков в десятки раз. |
9 | | -Более подробно - см. раздел `"PRELOAD"` в документации фаззера. |
10 | | - |
11 | | -Ниже представлены все этапы от подготовки к фаззингу до воспроизведения креша. |
12 | | - |
13 | | -# Сборка OpenSSL со статической инструментацией |
14 | | -Выполните команды в терминале (обратите внимание, что нужно указать актуальный путь до фаззера): |
15 | | -```bash |
16 | | -wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_0a.tar.gz |
17 | | -tar xvf OpenSSL_1_1_0a.tar.gz |
18 | | -mkdir openssl |
19 | | -cd openssl-OpenSSL_1_1_0a |
20 | | -CC=/path/to/crusher/bin_x86-64/isp-gcc ./config --prefix=$PWD/../openssl/ |
21 | | -make -j 4 |
22 | | -make install |
23 | | -cd .. |
24 | | -``` |
25 | | - |
26 | | -# Генерация SSL-сертификатов |
27 | | -```bash |
28 | | -mkdir keys |
29 | | -./openssl/bin/openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout keys/key.pem -out keys/cert.pem -batch |
30 | | -``` |
31 | | - |
32 | | -# Фаззинг |
33 | | -Скомпилировать разделяемую библиотеку для замены некоторых сетевых функций (для ускорения фаззинга): |
34 | | -```bash |
35 | | -cd custom_lib/ |
36 | | -make |
37 | | -cd .. |
38 | | -``` |
39 | | - |
40 | | -Для правильного детектирования аварийных завершений целевой программы со статической инструментацией выполнить: |
41 | | -```bash |
42 | | -sudo su |
43 | | -echo core >/proc/sys/kernel/core_pattern |
44 | | -exit |
45 | | -``` |
46 | | - |
47 | | -Запустить фаззинг (`"-c 4"` - запуск на 4 ядрах): |
48 | | -```bash |
49 | | -ISP_PRELOAD=$PWD/custom_lib/custom_lib.so ./fuzz.sh -f /path/to/crusher/bin_x86-64/fuzz_manager -c 4 |
50 | | -``` |
51 | | - |
52 | | -Запустить в другом терминале UI фаззера: |
53 | | -```bash |
54 | | -/path/to/crusher/bin_x86-64/ui -o out |
55 | | -``` |
56 | | - |
57 | | -В правом верхнем углу окна пользовательского интерфейса можно наблюдать окно `Stats`. В нём обратите внимание на поле `unique_crashes`. |
58 | | -Как только будет найдено аварийное завершение, значение поля `unique_crashes` станет ненулевым. Пока значение поля нулевое - не останавливайте фаззинг. |
59 | | -Желательно дождаться, когда значение поля будет больше 1. После этого можно остановить фаззинг: |
60 | | - |
61 | | -* в терминале с `UI` (пользовательский интерфейс) - для выхода из `UI` нажмите кнопку `q`; |
62 | | -* в терминале с запущенным фаззингом завершите фаззинг по комбинации клавиш `Ctrl+C`. |
63 | | - |
64 | | -# Воспроизведение аварийного завершения |
65 | | -1) Получить список креш-файлов: |
66 | | -```bash |
67 | | -find out -name id_crash_* |
68 | | -``` |
69 | | - |
70 | | -2) Запуск сервера (будет слушать порт 4444): |
71 | | -````bash |
72 | | -./run_server.sh |
73 | | -```` |
74 | | - |
75 | | -3) Запуск клиента (в другом терминале): |
76 | | -```bash |
77 | | -python run_client.py --ip 127.0.0.1 --port 4444 --crash-path <crash_path> |
78 | | -``` |
79 | | - |
80 | | -где `<crash_path>` - один из файлов, полученных в п. 1) |
81 | | - |
82 | | -4) В терминале с сервером наблюдаем его аварийное завершение. |
83 | | -Если аварийного завершения не произошло, то повторяем п. 3) с другим файлом из п. 1) |
| 1 | +Нахождение аварийного завершения OpenSSL-сервера, соответствующего уязвимости CVE-2016-6309. |
| 2 | + |
| 3 | +Демонстрируются следующие возможности фаззера: |
| 4 | + |
| 5 | +1) Описание формата данных с помощью Peach Pit (модифицированного для Crusher). |
| 6 | + |
| 7 | +2) Замена вызовов некоторых функций целевой программы пользовательскими во время фаззинга. |
| 8 | +Т.к. речь идёт о сетевых функциях, которые работают медленно - обеспечивается ускорение запусков в десятки раз. |
| 9 | +Более подробно - см. раздел `"PRELOAD"` в документации фаззера. |
| 10 | + |
| 11 | +Ниже представлены все этапы от подготовки к фаззингу до воспроизведения креша. |
| 12 | + |
| 13 | +# Подготовка OpenSSL сервера для фаззинга |
| 14 | +Включает следующие этапы: |
| 15 | +1) Сборка компилятора для статической инструментации OpenSSL. |
| 16 | + `Crusher` совместим со статической инструментацией, реализованной в `AFL++`. |
| 17 | + На этом этапе скачивается и собирается `AFL++` - в нём будет нужен только `afl-gcc`. |
| 18 | +2) Сборка OpenSSL со статической инструментацией. |
| 19 | + Скачивается (уязвимая) версия OpenSSL v1.1.0a и собирается с помощью `afl-gcc`. |
| 20 | +3) Генерация SSL-сертификата и ключа. |
| 21 | + Необходимы для работы OpenSSL сервера. |
| 22 | +4) Компиляция разделяемой библиотеки для замены некоторых сетевых функций (для ускорения фаззинга). |
| 23 | + |
| 24 | +Для выполнения этих действий запустите: |
| 25 | +```shell |
| 26 | +./build.sh |
| 27 | +``` |
| 28 | + |
| 29 | +# Запуск фаззинга |
| 30 | +Для правильного детектирования аварийных завершений целевой программы со статической инструментацией выполнить: |
| 31 | +```shell |
| 32 | +sudo su |
| 33 | +echo core >/proc/sys/kernel/core_pattern |
| 34 | +exit |
| 35 | +``` |
| 36 | + |
| 37 | +Запустите фаззинг через `fuzz.sh`, указав путь до `fuzz_manager` (опция `-f`) и число ядер для фаззинга (опция `-c`): |
| 38 | +```shell |
| 39 | +ISP_PRELOAD=$PWD/custom_lib/custom_lib.so ./fuzz.sh -f /path/to/crusher/bin_x86-64/fuzz_manager -c 4 |
| 40 | +``` |
| 41 | + |
| 42 | +# Мониторинг фаззинга |
| 43 | +Запустите в другом терминале UI фаззера: |
| 44 | +```shell |
| 45 | +/path/to/crusher/bin_x86-64/ui -o out |
| 46 | +``` |
| 47 | + |
| 48 | +В правом верхнем углу окна пользовательского интерфейса можно наблюдать окно `Stats`. В нём обратите внимание на поле `unique_crashes`. |
| 49 | +Как только будет найдено аварийное завершение, значение поля `unique_crashes` станет ненулевым. Пока значение поля нулевое - не останавливайте фаззинг. |
| 50 | +Желательно дождаться, когда значение поля будет больше 1. После этого можно остановить фаззинг: |
| 51 | + |
| 52 | +* в терминале с `UI` (пользовательский интерфейс) - для выхода из `UI` нажмите кнопку `q`; |
| 53 | +* в терминале с запущенным фаззингом завершите фаззинг по комбинации клавиш `Ctrl+C`. |
| 54 | + |
| 55 | +# Воспроизведение аварийного завершения |
| 56 | +1) Получить список креш-файлов: |
| 57 | +```shell |
| 58 | +find out -name id_crash_* |
| 59 | +``` |
| 60 | + |
| 61 | +2) Запуск сервера (будет слушать порт 4444): |
| 62 | +````shell |
| 63 | +./run_server.sh |
| 64 | +```` |
| 65 | + |
| 66 | +3) Запуск клиента (в другом терминале): |
| 67 | +```shell |
| 68 | +python run_client.py --ip 127.0.0.1 --port 4444 --crash-path <crash_path> |
| 69 | +``` |
| 70 | + |
| 71 | +где `<crash_path>` - один из файлов, полученных в п. 1) |
| 72 | + |
| 73 | +4) В терминале с сервером наблюдаем его аварийное завершение. |
| 74 | +Если аварийного завершения не произошло, то повторяем п. 3) с другим файлом из п. 1) |
0 commit comments