• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Наденьте на ноги мои стальные кандалы. Параллельный фаззинг AFL++.

PoC_Netperf_260.png

Ку, киберрекруты. Сегодня статья будет посвящена распараллеливанию фаззера. Думаю, будет интересно посмотреть, в чем суть распараллеливания и почему это так удобно. Наш подопытный - программа Netperf 2.6.0 . В этой проге была найдена уязвимость переполнения буфера 17 июня 2019 год хакером Juan Sacco. Само переполнение приводит к отказу в обслуживании. Нашел эту прогу и вообще данные на сайте . Сам бинарь скачал там же. Основной упор сделаю на это:


Netperf это бесплатная утилита, которая была разработана компанией Hewlett-Packard. Она позволяет получить мгновенную информацию о пропускной способности сети.

Дисклеймер: Все данные, предоставленные в данной статье, взяты из открытых источников, не призывают к действию и являются только лишь данными для ознакомления, и изучения механизмов используемых технологий.

Подготовка стенда

Скачал прогу с exploit-db и распаковал командами ниже:

Код:
gunzip netperf.tar.gz
tar -xvf netperf.tar

Дальше собираю проект sudo make и жду сборки. Результатом сборки был бинарь netperf и запустив его увидел следующее:

Код:
$ ./netperf -h                                                                 

Usage: netperf [global options] -- [test options]

Global options:
    -a send,recv      Set the local send,recv buffer alignment
    -A send,recv      Set the remote send,recv buffer alignment
    -B brandstr       Specify a string to be emitted with brief output
    -c [cpu_rate]     Report local CPU usage
    -C [cpu_rate]     Report remote CPU usage
    -d                Increase debugging output
    -D time,[units] * Display interim results at least every time interval
                      using units as the initial guess for units per second
                      A negative value for time will make heavy use of the
                      system's timestamping functionality
 ... ... ... ... .. ... ... ... ... ... ... ... ... ... ... ... ... ... ...

Правда это еще не все. Придется еще немного потанцевать с бубном , чтобы это испражнение... Ой, простите! Произведение искусства, инженерная идея завеласть, как старенькая дедушкина шаха в лучшие годы. Честно говоря, не знаю с чем это связано. Когда собрал прогу он выдавал ошибки по типу:

Код:
establish control: are you sure there is a netserver listening on localhost at port 12865?
establish_control could not establish the control connection from 0.0.0.0 port 0 address family AF_UNSPEC to localhost port 12865 address family AF_UNSPEC

Когда установил .deb пакет netperf и в результате удалось победить этого мостра. Запускать буду просто netperf -a somedata. Сначала пробовал запускать сервер и использовать конструкцию, которую написал ранее, но как оказалось, можно и без запуска сервера работать. Настало время физзить.

Фаззинг

Как устанавливать и запускать фаззер описал в статье Среди ублюдков шел артист. PoC CVE-2023-2663. Тесткейсы будут обычными символами. Тут ничего сложно нет. Однако, для ускорения фаззинга буду использовать распараллеливание. Параллельный фаззинг - это когда мы хотим распараллелить одно задание на нескольких ядрах локальной системы. Существует примерно три вида (самые популярные) параллельного фаззинга в AFL:

  1. Распараллеливание в одной системе.
  2. Multiple -M mains
  3. Мультисистемное распараллеливание
Так как все действия происходят на одной пекарне, поэтому и буду использовать распараллеливание на одной системе. Принцип такого распараллеливания в том, что есть два режима -M и -S и основной экземпляр(Master) по-прежнему будет выполнять детерминированные проверки, а второстепенные экземпляры(Slave) перейдут к случайным подстройкам. Всегда должен быть один главный экземпляр -M. Можно следить за ходом выполнения заданий из командной строки с помощью тулзы afl-whatsup. Когда экземпляры перестанут находить новые пути, вероятно, пора остановиться.

Для реализации этого мяса нужно создать каталог для выхлопа фаззера - это каталог синхронизации (напиример sync). Он будет использоваться всеми слэйвами(экзамплярами) афлки. Последний шаг, он такой креативный. Нужно придумать названия для каждого экземпляра. Например: fuz01, fuz02, fuz03....

Все шаги запуска фаззера аналогичны как и в статье о pdfimages. Дальше переходим дирикторию с таргетом и создаем две дириктории /in и /sync . В /in помещаем тесткейсы соответственно.
Перед запуском в каждом терминале, на которых будут запущены фаззеры пропишу заветные строчки:

Код:
export AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1
export AFL_SKIP_CPUFREQ=1

Запускать фаззер в режиме мастера буду так:

Код:
afl-fuzz -Q -D -i $PWD/in -o $PWD/sync -M fuz01 ./netperf -a @@

Его экземпляры так:

Код:
afl-fuzz -Q -D -i $PWD/in -o $PWD/sync -S fuz02 ./netperf -a @@
afl-fuzz -Q -D -i $PWD/in -o $PWD/sync -S fuz03 ./netperf -a @@
afl-fuzz -Q -D -i $PWD/in -o $PWD/sync -S fuz04 ./netperf -a @@

И запускаю. Промониторить можно используя тулзу afl-whatsup :

1689187127817.png


Если запустить без -s, то увидим подробную информацию о работе фаззера.

Немного погодя, удалось получить краш. И время, потраченное на физзинг, значительно сократилось. Если бы юзал этот способ для фаззига pdfimages, то на тестирование потратил бы меньше часа наверно. Размер переполнения
примерно равен 8224 символа. Прогоним через GDB этот краш и обнаружим место падения.

Обнаружение краша

Запускаю также как и в прошлый раз:

Код:
gdb --args ./netperf -a | cat crash.txt
...
(gdb) run

Затем прописал команду bt, что означает backtrace, для просмотра краша и наблюдаю примерно такую же картину как и у хакера Juan Sacco:

Код:
EIP  0x60453980
Invalid address 0x60453980
Program received signal SIGSEGV (fault address 0x60453980)

Заключение

В заключении хотелось бы сказать, что параллельный фаззинг действительно ускоряет работу и тест проги. Этот способ фаззинга дает жесткий буст и экономит время. Таск, прокачает скиллы в области фаззинга и поможет в дальнейшем пывне бинаря.
 
Последнее редактирование модератором:
  • Нравится
Реакции: crew, Crazy Jack и szybnev

szybnev

Green Team
19.07.2018
101
135
BIT
8
Спасибо за статью! Она вышла понятной и информативной)
 
  • Нравится
Реакции: AFANX
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!