Добро пожаловать обратно, мои начинающие кибервоины!
Поиск уязвимостей в приложениях и сервисах — первый шаг к разработке собственного эксплойта для уязвимости нулевого дня. Сканеры уязвимостей отлично подходят для поиска ИЗВЕСТНЫХ уязвимостей, но для поиска неизвестных или уязвимостей нулевого дня фаззер — отличный инструмент, с которым вам стоит ознакомиться. Как известно, фаззинг — это процесс отправки случайных или псевдослучайных входных данных в приложение с целью выяснить, нарушают ли они его работу. Если приложение выходит из строя, вы можете изучить и проанализировать причину этого, а затем определить, можно ли эксплуатировать эту уязвимость. Кроме того, обнаружение входных данных, нарушающих работу приложения, может привести к атаке типа «отказ в обслуживании» (DoS).
Безопасное программирование — очень сложная практика. Обычно при разработке программного обеспечения программисты стремятся к тому, чтобы оно работало, а не ломалось. При этом могут возникнуть уязвимости, если устаревшая функция используется вместо новой, более безопасной. К сожалению, это часто делается для ускорения разработки. Следовательно, устаревшее программное обеспечение особенно уязвимо. Это означает, что если программист хорошо знаком с методами безопасного программирования, его программа, скорее всего, будет безопасной. С другой стороны, для менее опытного программиста устаревшие функции часто составляют значительную часть кода.
Проверка всего исходного кода программы на предмет выявления уязвимостей, таких как переполнение буфера, может быть эффективным, но трудоёмким процессом. Этот подход, несмотря на свою тщательность, не всегда является наиболее практичным способом выявления критических, но простых уязвимостей. Быстрое решение таких проблем крайне важно, и одним из наиболее эффективных методов их обнаружения является метод, известный как фаззинг .
В этой статье я хочу поделиться пошаговым руководством по запуску American Fuzzy Lop ++ (AFL++) для фаззинга цели с открытым исходным кодом.
AFL++ (American Fuzzy Lop Plus Plus) разработан на основе AFL, высоко оцененного инструмента фаззинга для программ на C, C++ и Objective-C. AFL++ дополняет знаменитую скорость AFL и интеллектуальный выбор тестовых случаев дополнительными функциями и оптимизациями, которые делают его ещё более эффективным в обнаружении уязвимостей. Как и его предшественник, AFL++ остаётся простым в использовании, доступным для новичков и предлагающим расширенные возможности для опытных пользователей.
Оригинальный American Fuzzy Lop был разработан Михалом Залевски (известным как автор нескольких книг издательства No Starch Press) и впервые выпущен в ноябре 2013 года. Он сразу же был признан, пожалуй, лучшим из доступных фаззеров и стал фактическим стандартом для исследований безопасности. AFL++ — это форк исходного кода AFL. Он обеспечивает лучшую производительность и более продвинутые функции, поэтому мы будем использовать его здесь.
AFL++ — это фаззер, ориентированный на покрытие, который методично исследует пути выполнения программ для выявления уязвимостей. Он сохраняет основные принципы AFL, но при этом вносит несколько ключевых улучшений:
В этой статье мы сосредоточимся на фаззинге средства просмотра PDF-файлов Xpdf для выявления сбоя или подтверждения концепции (PoC) для CVE-2019-13288 . Целевая версия — Xpdf 3.02 , которая содержит соответствующую уязвимость. Благодарим Антонио Моралеса за публикацию исходных материалов на GitHub.
Для начала фаззинга нам необходимо организовать наше рабочее пространство и подготовить целевую программу:
kali> mkdir fuzzing_xpdf && cd fuzzing_xpdf/
Загрузить Xpdf 3.02:
Кали> wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz
Кали> tar -xvzf xpdf-3.02.tar.gz
Далее собираем Xpdf:
кали> cd xpdf-3.02
kali> sudo apt update && sudo apt install build-essential gcc -y
кали> ./configure –prefix="$HOME/fuzzing_xpdf/install/"
кали> сделать
кали> сделать установку
Загрузите примеры PDF-файлов: получите набор PDF-файлов для использования в качестве исходных данных при тестировании нашей сборки. Вы можете найти бесплатные примеры в Интернете или использовать следующую команду для загрузки:
kali> mkdir pdf_examples && cd pdf_examples
Кали> wget https://github.com/mozilla/pdf.js-sample-files/raw/master/helloworld.pdf
Теперь мы можем протестировать двоичный файл pdfinfo с помощью:
kali> /home/kali/fuzzing_xpdf/install/bin/pdfinfo -box -meta /home/kali/fuzzing_xpdf/pdf_examples/helloworld.pdf
Вы должны увидеть что-то вроде этого:
Это означает, что мы успешно выполнили все шаги и установка работает корректно. Теперь мы можем приступить к установке AFL++.
kali> git clone https://github.com/AFLplusplus/AFLplusplus
kali> cd AFLplusplus
kali> сделать дистрибутив
kali> sudo make install
Если все прошло хорошо, теперь вы сможете запустить AFL++.
Просто введите:
kali> afl-fuzz
Прежде всего, мы собираемся очистить все ранее скомпилированные объектные файлы и исполняемые файлы:
kali> rm -r fuzzing_xpdf/install
kali> cd fuzzing_xpdf/xpdf-3.02
кали> сделать чистым
А теперь мы соберем xpdf с помощью компилятора afl-clang-fast :
kali> экспорт LLVM_CONFIG="llvm-config-16″
kali> CC=/home/kali/AFLplusplus/afl-clang-fast CXX=/home/kali/AFLplusplus/afl-clang-fast++ ./configure –prefix="/home/kali/fuzzing_xpdf/install/"
кали> сделать
кали> сделать установку
Теперь вы можете запустить фаззер с помощью следующей команды:
kali> afl-fuzz -i /home/kali/fuzzing_xpdf/pdf_examples/ -o /home/kali/fuzzing_xpdf/out/ -s 123 — /home/kali/fuzzing_xpdf/install/bin/pdftotext @@ /home/kali/fuzzing_xpdf/output
Пояснение к каждому варианту:
По сути, фаззер выполнит: /home/kali /fuzzing_xpdf/install/bin/pdftotext <input-file-name> /home/kali /fuzzing_xpdf/output для каждого входного файла.
Через несколько секунд вы должны увидеть вывод, подобный этому:
В зависимости от мощности вашей виртуальной машины, со временем вы увидите первые зависания и сбои. Значение «uniq. crashes» будет выделено красным цветом, что указывает на количество найденных уникальных сбоев. Эти файлы сбоев хранятся в каталоге /home/kali/fuzzing_xpdf/out/. Вы можете остановить фаззер после обнаружения первого сбоя, на котором мы и сосредоточимся. Это может занять от одного до двух часов, в зависимости от производительности вашей машины.
Как воспроизвести сбой
Чтобы воспроизвести сбой, найдите файл, соответствующий сбою, в каталоге /home/kali/fuzzing_xpdf/out/default/crashes.
В моем случае имя файла: id:000000,sig:11,src:000972,time:4417804,execs:2703585,op:havoc,rep:2.
Используйте GDB, чтобы определить, почему программа аварийно завершает работу при таком вводе.
Во-первых, пересоберите Xpdf с включенной отладочной информацией, чтобы получить символьную трассировку стека.
кали> rm -r /home/kali/fuzzing_xpdf/install
Кали> cd /home/kali/fuzzing_xpdf/xpdf-3.02/
кали> сделать чистым
kali> CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure –prefix="$HOME/fuzzing_xpdf/install/"
кали> сделать
кали> сделать установку
Теперь вы можете запустить GDB:
kali> gdb –args /home/kali/fuzzing_xpdf/install/bin/pdftotext /home/kali/fuzzing_xpdf/out/default/crashes/id:000000,sig:11,src:000972,time:4417804,execs:2703585,op:havoc,rep:2 /home/kali/fuzzing_xpdf/output
И затем введите в GDB:
(gdb) запустить
Похоже, мы перезаписываем адрес возврата командой getchar, что приводит к ошибке сегментации. Это приводит к сбою. Как минимум, такое поведение может привести к отказу в обслуживании, если ситуация повторяется циклически.
Фаззинг часто используется для выявления неизвестных уязвимостей (угрозы нулевого дня) в программном обеспечении. Он часто является первым шагом к разработке эксплойта нулевого дня.
AFL++ — невероятно мощный инструмент, который при этом остаётся удивительно простым в использовании. Он упрощает процесс фаззинга до нескольких простых шагов, управляя всеми сложными задачами в фоновом режиме.
Чтобы узнать больше о разработке Exploit, станьте подписчиком Pro и присоединитесь к нашему предстоящему тренингу по разработке Exploit.
Поиск уязвимостей в приложениях и сервисах — первый шаг к разработке собственного эксплойта для уязвимости нулевого дня. Сканеры уязвимостей отлично подходят для поиска ИЗВЕСТНЫХ уязвимостей, но для поиска неизвестных или уязвимостей нулевого дня фаззер — отличный инструмент, с которым вам стоит ознакомиться. Как известно, фаззинг — это процесс отправки случайных или псевдослучайных входных данных в приложение с целью выяснить, нарушают ли они его работу. Если приложение выходит из строя, вы можете изучить и проанализировать причину этого, а затем определить, можно ли эксплуатировать эту уязвимость. Кроме того, обнаружение входных данных, нарушающих работу приложения, может привести к атаке типа «отказ в обслуживании» (DoS).
Безопасное программирование — очень сложная практика. Обычно при разработке программного обеспечения программисты стремятся к тому, чтобы оно работало, а не ломалось. При этом могут возникнуть уязвимости, если устаревшая функция используется вместо новой, более безопасной. К сожалению, это часто делается для ускорения разработки. Следовательно, устаревшее программное обеспечение особенно уязвимо. Это означает, что если программист хорошо знаком с методами безопасного программирования, его программа, скорее всего, будет безопасной. С другой стороны, для менее опытного программиста устаревшие функции часто составляют значительную часть кода.
Проверка всего исходного кода программы на предмет выявления уязвимостей, таких как переполнение буфера, может быть эффективным, но трудоёмким процессом. Этот подход, несмотря на свою тщательность, не всегда является наиболее практичным способом выявления критических, но простых уязвимостей. Быстрое решение таких проблем крайне важно, и одним из наиболее эффективных методов их обнаружения является метод, известный как фаззинг .
В этой статье я хочу поделиться пошаговым руководством по запуску American Fuzzy Lop ++ (AFL++) для фаззинга цели с открытым исходным кодом.
Почему AFL++?
AFL++ (American Fuzzy Lop Plus Plus) разработан на основе AFL, высоко оцененного инструмента фаззинга для программ на C, C++ и Objective-C. AFL++ дополняет знаменитую скорость AFL и интеллектуальный выбор тестовых случаев дополнительными функциями и оптимизациями, которые делают его ещё более эффективным в обнаружении уязвимостей. Как и его предшественник, AFL++ остаётся простым в использовании, доступным для новичков и предлагающим расширенные возможности для опытных пользователей.
Оригинальный American Fuzzy Lop был разработан Михалом Залевски (известным как автор нескольких книг издательства No Starch Press) и впервые выпущен в ноябре 2013 года. Он сразу же был признан, пожалуй, лучшим из доступных фаззеров и стал фактическим стандартом для исследований безопасности. AFL++ — это форк исходного кода AFL. Он обеспечивает лучшую производительность и более продвинутые функции, поэтому мы будем использовать его здесь.
Что делает AFL++?
AFL++ — это фаззер, ориентированный на покрытие, который методично исследует пути выполнения программ для выявления уязвимостей. Он сохраняет основные принципы AFL, но при этом вносит несколько ключевых улучшений:
- Инструментирование кода : AFL++ расширяет возможности оригинального инструментария AFL, поддерживая различные режимы (например, классический, постоянный и режимы QEMU) для более широкой совместимости и лучшей производительности.
- Отслеживание покрытия : отслеживает пути выполнения для каждого ввода и определяет приоритетность вводов, которые приводят к новому или уникальному покрытию.
- Расширенные стратегии мутаций : AFL++ включает в себя расширенные стратегии мутаций, в том числе детерминированные и стохастические методы, а также новейшие мутаторы для лучшей генерации тестовых случаев.
- Генетический алгоритм : Как и AFL, AFL++ использует генетический алгоритм для мутации входных данных, которые запускают новые пути, развивая их для максимального охвата.
- Фильтрация входных данных : избыточные или малозначимые входные данные эффективно отфильтровываются, оптимизируя процесс фаззинга.
- Графики питания : AFL++ предлагает расширенные графики питания для эффективного балансирования приоритетов входных данных и усилий по мутации.
- Словари : поддерживает пользовательские словари для проверки «магических значений» (например, определенных строк или шаблонов), что повышает его способность находить определенные типы уязвимостей.
- Расширяемость : AFL++ разработан с учетом расширяемости, что позволяет пользователям легко интегрировать пользовательские компоненты или экспериментировать с новыми методами фаззинга.
Загрузите и создайте свою цель
В этой статье мы сосредоточимся на фаззинге средства просмотра PDF-файлов Xpdf для выявления сбоя или подтверждения концепции (PoC) для CVE-2019-13288 . Целевая версия — Xpdf 3.02 , которая содержит соответствующую уязвимость. Благодарим Антонио Моралеса за публикацию исходных материалов на GitHub.
Для начала фаззинга нам необходимо организовать наше рабочее пространство и подготовить целевую программу:
kali> mkdir fuzzing_xpdf && cd fuzzing_xpdf/
Загрузить Xpdf 3.02:
Кали> wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz
Кали> tar -xvzf xpdf-3.02.tar.gz
Далее собираем Xpdf:
кали> cd xpdf-3.02
kali> sudo apt update && sudo apt install build-essential gcc -y
кали> ./configure –prefix="$HOME/fuzzing_xpdf/install/"
кали> сделать
кали> сделать установку
Загрузите примеры PDF-файлов: получите набор PDF-файлов для использования в качестве исходных данных при тестировании нашей сборки. Вы можете найти бесплатные примеры в Интернете или использовать следующую команду для загрузки:
kali> mkdir pdf_examples && cd pdf_examples
Кали> wget https://github.com/mozilla/pdf.js-sample-files/raw/master/helloworld.pdf
Теперь мы можем протестировать двоичный файл pdfinfo с помощью:
kali> /home/kali/fuzzing_xpdf/install/bin/pdfinfo -box -meta /home/kali/fuzzing_xpdf/pdf_examples/helloworld.pdf
- pdfinfo: двоичный файл для извлечения информации из PDF-файлов
- -box: отображает информацию о размерах страницы и медиа-боксах
- -meta: показывает встроенные метаданные о документе
Вы должны увидеть что-то вроде этого:
Это означает, что мы успешно выполнили все шаги и установка работает корректно. Теперь мы можем приступить к установке AFL++.
Установить AFL++
kali> git clone https://github.com/AFLplusplus/AFLplusplus
kali> cd AFLplusplus
kali> сделать дистрибутив
kali> sudo make install
Если все прошло хорошо, теперь вы сможете запустить AFL++.
Просто введите:
kali> afl-fuzz
Начало работы с фаззингом
Прежде всего, мы собираемся очистить все ранее скомпилированные объектные файлы и исполняемые файлы:
kali> rm -r fuzzing_xpdf/install
kali> cd fuzzing_xpdf/xpdf-3.02
кали> сделать чистым
А теперь мы соберем xpdf с помощью компилятора afl-clang-fast :
kali> экспорт LLVM_CONFIG="llvm-config-16″
kali> CC=/home/kali/AFLplusplus/afl-clang-fast CXX=/home/kali/AFLplusplus/afl-clang-fast++ ./configure –prefix="/home/kali/fuzzing_xpdf/install/"
кали> сделать
кали> сделать установку
Теперь вы можете запустить фаззер с помощью следующей команды:
kali> afl-fuzz -i /home/kali/fuzzing_xpdf/pdf_examples/ -o /home/kali/fuzzing_xpdf/out/ -s 123 — /home/kali/fuzzing_xpdf/install/bin/pdftotext @@ /home/kali/fuzzing_xpdf/output
Пояснение к каждому варианту:
- -i: Указывает каталог для входных данных (файлов примеров).
- -o: Указывает каталог, в котором AFL++ будет хранить мутированные файлы.
- -s: Устанавливает статическое случайное начальное число для воспроизводимости.
- @@: Заполнитель в командной строке цели, который AFL заменяет каждым именем входного файла.
По сути, фаззер выполнит: /home/kali /fuzzing_xpdf/install/bin/pdftotext <input-file-name> /home/kali /fuzzing_xpdf/output для каждого входного файла.
Через несколько секунд вы должны увидеть вывод, подобный этому:
В зависимости от мощности вашей виртуальной машины, со временем вы увидите первые зависания и сбои. Значение «uniq. crashes» будет выделено красным цветом, что указывает на количество найденных уникальных сбоев. Эти файлы сбоев хранятся в каталоге /home/kali/fuzzing_xpdf/out/. Вы можете остановить фаззер после обнаружения первого сбоя, на котором мы и сосредоточимся. Это может занять от одного до двух часов, в зависимости от производительности вашей машины.
Как воспроизвести сбой
Чтобы воспроизвести сбой, найдите файл, соответствующий сбою, в каталоге /home/kali/fuzzing_xpdf/out/default/crashes.
В моем случае имя файла: id:000000,sig:11,src:000972,time:4417804,execs:2703585,op:havoc,rep:2.
Используйте GDB, чтобы определить, почему программа аварийно завершает работу при таком вводе.
Во-первых, пересоберите Xpdf с включенной отладочной информацией, чтобы получить символьную трассировку стека.
кали> rm -r /home/kali/fuzzing_xpdf/install
Кали> cd /home/kali/fuzzing_xpdf/xpdf-3.02/
кали> сделать чистым
kali> CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure –prefix="$HOME/fuzzing_xpdf/install/"
- -g: Включает отладочную информацию (символы и сопоставления на уровне исходного кода) в двоичные файлы.
- -O0: Отключает оптимизацию компилятора, делая сгенерированный код более предсказуемым и более простым для отладки.
кали> сделать
кали> сделать установку
Теперь вы можете запустить GDB:
kali> gdb –args /home/kali/fuzzing_xpdf/install/bin/pdftotext /home/kali/fuzzing_xpdf/out/default/crashes/id:000000,sig:11,src:000972,time:4417804,execs:2703585,op:havoc,rep:2 /home/kali/fuzzing_xpdf/output
И затем введите в GDB:
(gdb) запустить
Похоже, мы перезаписываем адрес возврата командой getchar, что приводит к ошибке сегментации. Это приводит к сбою. Как минимум, такое поведение может привести к отказу в обслуживании, если ситуация повторяется циклически.
Краткое содержание
Фаззинг часто используется для выявления неизвестных уязвимостей (угрозы нулевого дня) в программном обеспечении. Он часто является первым шагом к разработке эксплойта нулевого дня.
AFL++ — невероятно мощный инструмент, который при этом остаётся удивительно простым в использовании. Он упрощает процесс фаззинга до нескольких простых шагов, управляя всеми сложными задачами в фоновом режиме.
Чтобы узнать больше о разработке Exploit, станьте подписчиком Pro и присоединитесь к нашему предстоящему тренингу по разработке Exploit.