
Автоматизируйте повторяющиеся задачи для фаззинга.
Сейчас полностью переписывается. Основное внимание будет уделено интерактивным приложениям Linux, которые принимают ввод только из stdin для начала. Пытаюсь использовать функциональность Driller и Fuzzer от Shellphish.
autoPwn в его текущем состоянии будет делать это в ограниченной форме. Просто запустите autoPwn ./binary, затем выберите опцию Start.
Учитывая все проблемы с зависимостями, самый простой способ запустить autoPwn — использовать Docker-сборку. Обратите внимание, вы можете удалить параметры --security-opt и --cap-add, но некоторые аспекты фаззинга могут не работать.
$ sudo docker pull bannsec/autoPwn
$ sudo docker run -it -v $PWD:/mount --security-opt="apparmor=unconfined" --cap-add=SYS_PTRACE -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix/ bannsec/autopwn
В Docker-сборке всё должно быть готово к работе. Вы можете просто запустить инструмент командой:
$ autoPwn ./file
autoPwn пытается упростить компиляцию исходного кода для фаззинга проекта. Для этого был создан autoPwnCompile. Просто укажите ему ваш исходный код, задайте параметры, и он выдаст исполняемый файл, готовый к фаззингу.
usage: autoPwnCompile [-h] [--file FILE] [--ASAN | --MSAN] [--UBSAN]
[--fuzzer FUZZER]
Compile source to binaries for use in autoPwn.
optional arguments:
-h, --help show this help message and exit
--file FILE Single file to compile.
--ASAN Enable ASAN (default off)
--MSAN Enable MSAN (default off)
--UBSAN Enable UBSAN (default off)
--fuzzer FUZZER (optional) What fuzzer to compile for. Options are:
['AFL']. Default is AFL.
Ниже приведено из СТАРОЙ версии autoPwn..
autoPwn — громкое имя для простого скрипта. При работе с фаззингом и afl-fuzz я заметил, что мне приходится выполнять одни и те же задачи снова и снова. С учётом этого я хотел создать скрипт, который бы делал следующее:
На данный момент скрипт справляется с первыми пятью пунктами. Пункт 6 находится в стадии разработки и предположительно будет использовать механизм символьного выполнения angr для создания возможных начальных путей. На этом этапе скрипт теоретически сможет полностью автоматизировать простые задачи фаззинга.
Давайте рассмотрим недавнее задание TUCTF под названием "WoO2". Хотя оно не обязательно находит нужный эксплойт, оно показывает, как autoPwn можно использовать для упрощения поиска путей.
Вот базовый запуск программы:
$ ./e67eb287f23011a40ef5bd5c2ad2f48ca97834cf
Welcome! I don't think we're in Kansas anymore.
We're about to head off on an adventure!
Select some animals you want to bring along.
Menu Options:
1: Bring a lion
2: Bring a tiger
3: Bring a bear
4: Delete Animal
5: Exit
Enter your choice:
1
Choose the type of lion you want:
1: Congo Lion
2: Barbary Lion
1
Enter name of lion:
Test
Menu Options:
1: Bring a lion
2: Bring a tiger
3: Bring a bear
4: Delete Animal
5: Exit
Enter your choice:
5
Создадим простой входной тестовый пример:
$ cat in/1
1
1
Test
5
Теперь мы можем легко запустить фаззер:
$ autoPwn
Setting up fuzz configuration
Target Binary (full or relative path): e67eb287f23011a40ef5bd5c2ad2f48ca97834cf
Command line args:
Number of cores (default: 8):
Test Case Dir (default: 'in/'):
Test Case Dir (default: 'out/'):
Max memory (default: 200): 4096
Starting fuzz
autoPwn> s
status check tool for afl-fuzz by <[email protected]>
Individual fuzzers
==================
>>> SESSION007 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION000 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION002 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION006 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION004 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION001 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION005 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
>>> SESSION003 (0 days, 0 hrs) <<<
cycle 1, lifetime speed 1 execs/sec, path 0/1 (0%)
pending 1/1, coverage 0.15%, no crashes yet
Summary stats
=============
Fuzzers alive : 8
Total run time : 0 days, 0 hours
Total execs : 0 million
Cumulative speed : 8 execs/sec
Pending paths : 8 faves, 8 total
Pending per fuzzer : 1 faves, 1 total (on average)
Crashes found : 0 locally unique
autoPwn> h
autoPwn
s == fuzzer (s)tatus
e == collect (e)xploits
a == collect (a)ll paths
m == (m)inimize corpus
q == (q)uit
Итак, что произошло: скрипт создал некоторые значения по умолчанию (включая определение количества доступных ядер). Мы изменили одно значение по умолчанию из-за необходимости дополнительной памяти для запуска в QEMU. autoPwn создал конфигурационный файл, который затем передал afl-utils (https://github.com/rc0r/afl-utils). В этом конфигурационном файле также были настроены привязки к CPU, чтобы фаззинг был оптимальным по умолчанию.
На этом этапе ваш компьютер вовсю занимается фаззингом. Однако одним из ключевых аспектов фаззинга является минимизация корпуса. С учётом этого autoPwn следит за экземпляром afl-fuzz, чтобы отслеживать завершение серии мутаций. Когда это происходит, он останавливает фаззинг (неоптимально, но пока сойдёт), минимизирует корпус, а затем перезапускает фаззинг. Всё это происходит без вмешательства человека, так что вы можете запустить и забыть.
В какой-то момент вам может захотеться посмотреть, какие пути нашёл afl. Выполнив команду "a", autoPwn скопирует все известные пути, минимизирует корпус, а затем минимизирует сами входные данные и предоставит их в выходном каталоге.