Ку, киберрекруты. Сегодня статья будет посвящена распараллеливанию фаззера. Думаю, будет интересно посмотреть, в чем суть распараллеливания и почему это так удобно. Наш подопытный - программа 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:
- Распараллеливание в одной системе.
- Multiple -M mains
- Мультисистемное распараллеливание
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
:Если запустить без
-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)
Заключение
В заключении хотелось бы сказать, что параллельный фаззинг действительно ускоряет работу и тест проги. Этот способ фаззинга дает жесткий буст и экономит время. Таск, прокачает скиллы в области фаззинга и поможет в дальнейшем пывне бинаря.
Последнее редактирование модератором: