Пример 15.2.
fuzzer.sh
#!/bin/bash -
#
Глава 15. Инструмент: Fuzzer
229
# Bash и кибербезопасность
# fuzzer.sh
#
# Описание:
# Изменение указанного аргумента программы
#
# Использование:
# bash fuzzer.sh [?] ...
# Целевая исполняемая программа/скрипт
# Статические аргументы для исполняемого файла
# '?' Аргумент, который должен быть изменен
# пример: fuzzer.sh ./myprog -t '?' fn1 fn2
#
#
function usagexit ()
{
echo "usage: $0 executable args"
echo "example: $0 myapp -lpt arg \?"
exit 1
} >&2
if (($# < 2))
then
usagexit
fi
# приложение, которое мы будем изменять, — это первый аргумент
THEAPP="$1"
shift
# действительно здесь?
type -t "$THEAPP" >/dev/null || usagexit
# какой аргумент нужно изменять?
# найти ? и пометить его позицию
declare -i i
for ((i=0; $# ; i++))
do
ALIST+=( "$1" )
if [[ $1 == '?' ]]
then
NDX=$i
fi
shift
done
# printf "Executable: %s Arg: %d %s\n" "$THEAPP" $NDX "${ALIST[$NDX]}"
# теперь изменить:
MAX=10000
FUZONE="a"
FUZARG=""
230
Часть III • Тестирование на проникновение
for ((i=1; i <= MAX; i++))
do
FUZARG="${FUZARG}${FUZONE}" # то есть +=
ALIST[$NDX]="$FUZARG"
# порядок >s важен
$THEAPP "${ALIST[@]}" 2>&1 >/dev/null
if (( $? )) ; then echo "Caused by: $FUZARG" >&2 ; fi
done
.Мы.определяем.функцию.
usagexit
,.чтобы.выдать.пользователю.сообщение.об.
ошибке,.которая.укажет.правильный.способ.использования.сценария..После.печати.
сообщения.сценарий.завершит.работу.и.будет.вызван.при.ошибочной.активации.
(в.нашем.случае,.если.аргументов.станет.недостаточно).(см..
)..Аргумент.
-lpt
.
в.примере.сообщения.является.аргументом.для.пользовательской.программы.
myapp
,.а.не.для.сценария.
fuzzer.sh
.
.Поскольку.эта.функция.выдает.сообщение.об.ошибке,.а.не.предполагаемый.
вывод.программы,.мы.хотим,.чтобы.сообщение.перешло.в.stderr..После.этого.весь.
вывод.из.функции,.который.был.направлен.в.stdout,.перенаправляется.в.stderr.
.Если.аргументов.недостаточно,.следует.завершить.работу.сценария;.мы.вызы-
ваем.эту.функцию,.чтобы.объяснить.пользователю,.как.ее.правильно.использовать.
(функция.выйдет.из.сценария.и.не.возвратится).
.Сохранив.в.приложении.первый.аргумент,.мы.смещаем.аргументы..Таким.об-
разом,.
$2
.становится.
$1
,.
$3
.становится.
$2
.и.т..д.
.Тип.встроенного.приложения.определяет.тип.исполняемого.файла.(псевдоним,.
ключевое.слово,.функция,.встроенный.файл)..Поскольку.вывод.нас.не.интересует,.
мы.перенаправляем.его.в.
/dev/null
.и.отбрасываем..Нам.необходимо.получить.
возвращаемое.значение.
type
..Если.пользовательское.приложение.(один.из.пере-
численных.типов).может.быть.запущено,.возвращается.значение.
0
..Если.нет.—.
возвращается.значение.
1
.и.выполняется.второе.условие.этой.строки:.вызывается.
функция.
usagexit
,.а.работа.сценария.завершается.
.Этот.цикл.
for
.будет.перебирать.количество.аргументов.(
$#
),.хотя.это.количе-
ство.с.каждым.сдвигом.будет.уменьшаться..Данные.аргументы.предназначены.для.
пользовательской.программы,.то.есть.программы,.к.которой.мы.применяем.метод.
фаззинга.
.Мы.сохраняем.каждый.аргумент,.добавляя.его.в.переменную.массива.
ALIST
..
Почему.бы.нам.просто.не.добавить.каждый.аргумент.в.строку,.а.не.хранить.их.
как.элементы.массива?.Все.будет.работать.нормально,.если.ни.один.из.аргумен-
Do'stlaringiz bilan baham: |