Fuzzer — Обзор инструмента

Team zBrain
zBrain
Published in
5 min readJul 8, 2020

https://github.com/WiIs0n/Fuzzer

Fuzzer — это простой инструмент командной строки, предназначенный для частичной автоматизации процесса фаззинга (одна из стадий аудита веб-приложений) GET и POST параметров запроса к веб-приложению.

В чем идея?

Частично автоматизировать, ускорить и облегчить процесс фаззинга параметров в больших запросах с использованием стандартных полезных нагрузок.

Что такое фаззинг?

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

Принцип работы программы

На текущий момент программа позволяет фаззить GET и POST параметры, POST параметры в формате одномерного JSON.

Fuzzer ориентируется на длину ответа от веб-сервера. При запуске Fuzzer делает обычный запрос без внедрения полезных нагрузок с целью получения длины ответа от веб-сервера. Если в процессе фаззинга длина ответа изменяется, Fuzzer сообщает об этом.

Fuzzer определяет тип данных значения каждого параметра, подвергающегося фаззингу. Всего он может определить 4 типа данных (integer, float, string, boolean). В зависимости от типа данных будут подключаться наиболее подходящие полезные нагрузки для фаззинга.

По умолчанию для фаззинга используется стандартный набор полезных нагрузок (‘, “, [], %00, \, true, false, -1 и.тд), которые каждый пользователь может расширить самостоятельно (немного дальше в статье мы рассмотрим данный процесс).

Также Fuzzer поддерживает точечный фаззинг параметров по пользовательскому словарю. В данном случае, используя параметр « — payloads”, необходимо передать путь к файлу с полезными нагрузками и указать параметр в запросе, который необходимо фаззить, используя * или **, в зависимости от того, нужно ли сохранять значение параметра при фаззинге.

- parameter=1234* 🡪 parameter=1234PAYLOAD

- parameter=1234** 🡪 parameter=PAYLOAD

Fuzzer может принимать полный запрос из Burp Suite. Это удобно использовать при больших запросах и необходимости использовать специальные куки и заголовки. Для этого используя флаг « — file», передайте программе путь до файла с полным запросом из Burp Suite. Помимо принятия запроса из Burp Suite, флаг « — burp» позволяет вернуть результаты фаззинга обратно в Burp Suite, что позволит их моментально проанализировать.

Примеры работы Fuzzer:

При запросе к веб-ресурсу передается два параметра: id и mod, попробуем передать их программе на фаззинг. Для начала поместим следующий запрос в файл:

Для запуска будем использовать следующую команду:

python fuzzer.py — url “http://localhost" — file /home/request.txt

Как можно заметить из результатов работы программы, многие полезные нагрузки вызвали изменения в длине ответа от веб-сервера. Опираясь на ответ программы, пробуем отправить одинарную кавычку в параметр id и проанализировать ответ от веб-сервера:

Если мы хотим получать сразу полные результаты фаззинга, то можно использовать флаг — burp, который будет проксировать запросы через приложение Burp Suite. Это позволит сразу же проанализировать результаты в Burp.

python fuzzer.py — url “http://localhost" — file /home/request.txt — burp 127.0.0.1:8080

Если нет необходимости использовать файл с запросом, все необходимые параметры, заголовки и куки можно передать программе следующим образом:

python fuzzer.py — url “http://localhost/index.php?id=1&mod=test" — cookies “1P_JAR=2020–07–04–14; rgb=dkfk34eq3o4o5jw5k3mr” — headers “User-Agent: Mozilla/5.0”

Особенности программы:

- фаззит GET параметры, POST параметры, POST параметры в JSON формате;

- Fuzzer определяет тип данных каждого переданного параметра, всего он может определить 4 типа данных (integer, float, string, boolean). В зависимости от типа данных будут подключаться наиболее подходящие полезные нагрузки для фаззинга;

- каждый пользователь может самостоятельно расширять свои полезные нагрузки и указывать куда именно в параметр или в его значение подставлять полезную нагрузку;

- можно передать весь запрос из Burp Suite (на случай если нужно использовать определенные cookies и headers), Fuzzer самостоятельно его распарсит и проффазит;

- помимо принятия запроса из Burp Suite, флаг — burp позволяет вернуть результаты фаззинга обратно в Burp Suite, что позволит их моментально проанализировать;

- поддержка многопоточности и проксирование;

- используя параметр — payloads, имеется возможность передавать программе пользовательский словарь с полезными нагрузками для фаззинга. Для указания параметра, который необходимо фаззить по пользовательскому словарю используются * или **, в зависимости от того, нужно ли сохранять значение параметра при фаззинге.

Поддерживаемые флаги: (примеры использования каждого из флагов можно найти на Github)

— url — используется для передачи URL адреса в корень веб-ресурса;

— data — используется для передачи POST параметров для фаззинга;

— threads — используется для указания количества потоков;

— headers — используется для передачи заголовков, которые необходимо использовать в запросе при фаззинге;

— cookies — используется для передачи cookies, которые необходимо использовать в запросе при фаззинге;

— burp — используется для проксирования запросов через Burp Suite, это позволит моментально просматривать результаты фаззинга в программе Burp Suite (не сочетается с флагом — proxy);

— proxy — используется для указания socks proxy (не сочетается с флагом — burp);

— file — используется для указания пути к файлу с полным запросом из Burp Suite. Данный флаг позволяет максимально упростить использование программы. Программа самостоятельно распарсит весь запрос из файла и профазит параметры;

— payloads — используется для передачи пути до файла с пользовательскими полезными нагрузками. Для указания параметра, который необходимо фаззить, используйте * или **, в зависимости от потребности в сохранении значения параметра, который подвергается фаззингу (param1=1234* 🡪 param1=1234PAYLOAD, param1=1234** 🡪 param1=PAYLOAD);

Как добавить собственные полезные нагрузки?

В папке Payloads вы можете найти файлы с шаблонами для разных типов данных. Выберите, к какому типу данных относится ваша полезная нагрузка, и добавьте его в файл с помощью шаблона. Используйте один из двух шаблонов, в зависимости от необходимости в сохранении значения параметра (key[]=value или key=EMPTYvalue%0A%0D).

Пример 1 (с сохранением значения параметра):

Полезная нагрузка: []
Шаблон который необходимо добавить: key[]=value

Результат фаззинга: param1=1234 -> param1[]=1234

Пример 2 (с сохранением значения параметра):

Полезная нагрузка: %00
Шаблон который необходимо добавить: key=value%00
Результат фаззинга: param1=1234 -> param1=1234%00

Пример 3 (без сохранения значения параметра):

Полезная нагрузка: %0A%0D
Шаблон который необходимо добавить: key=EMPTYvalue%0A%0D
Результат фаззинга: param1=1234 -> param1=%0A%0D

Планы развития на будущее:

- добавить фаззинг заголовков;

- добавить фаззинг cookies;

- добавить возможность рандомного User-agent при фаззинге;

- добавить модуль, который будет анализировать ответы от веб-сервера и сообщать об предположительных уязвимостях.

****

Наш телеграм: https://t.me/zbrain

Мы в яндекс дзен: https://zen.yandex.ru/id/5e66aeb2576bb763c4ffd74a

Наш сайт: https://zbrain.org

Вебинары: https://webinars.zbrain.org

--

--

Team zBrain
zBrain
Editor for

zBrain— онлайн школа для специалистов по кибербезопасности