Файл: Paul Troncone and Carl AlbingCybersecurity Ops with bashAttack, Defend, and Analyze from the.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 464
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
224 Часть III • Тестирование на проникновение экранировали.это.число,.чтобы.сообщить.оболочке,.что.нам.нужен.сам.символ.об- ратного.слеша,.потому.что.это.не.начало.заключенной.в.кавычки.строки..Что.это.
нам.дает?.Вот.что.о.команде.
printf
.говорит.стандарт.POSIX.
Если начальный символ является одинарной или двойной кавычкой, значение в базовом наборе кодов символа должно быть числовым значением, следу- ющим за одинарной или двойной кавычкой. The Open Group Base Specifications
Issue 7, 2018 edition IEEE Std 1003.1-2017 (Revision of IEEE Std 1003.1-2008) (http://
bit.ly/2CKvTqB). Copyright © 2001–2018 IEEE and The Open Group.
Файл.
askey.sh
.предоставляет.нам.две.функции:.
asnum
.и.
aschar
,.с.помощью.которых.
вы.можете.конвертировать.данные.в.символы.ASCII.и.обратно.в.целочисленные.
значения..Эти.функции.могут.быть.полезными.и.в.других.сценариях,.поэтому.
мы.акцентировали.на.них.внимание,.а.не.просто.определили.часть.сценария.
streamcipher.sh
..В.других.сценариях.их.можно.использовать.как.отдельные.
функции.
Выводы
Шифрование.содержимого.сценария.—.важный.шаг,.обеспечивающий.секретность.
во.время.теста.на.проникновение..Чем.более.сложные.методы.вы.используете,.тем.
сложнее.злоумышленнику.будет.провести.анализ.вашего.набора.инструментов.
В.следующей.главе.мы.рассмотрим,.как,.создав.fuzzer,.определить.возможные.уяз- вимости.в.сценариях.и.исполняемых.файлах.
Упражнения
1.. Просмотрите.еще.раз.сценарий.
streamcipher.sh
.и.подумайте:.если.при.ши- фровании.вы.выводите.не.шестнадцатеричное.число,.а.представленный.этим.
шестнадцатеричным.числом.символ.ASCII,.будет.ли.в.выводе.каждому.символу.
ввода.соответствовать.один.символ?.Для.сценария.вам.нужен.отдельный.вари- ант.декодирования.или.вы.можете.просто.запустить.тот.же.алгоритм?.Измените.
код,.чтобы.сделать.это.
В.этом.подходе.есть.основной.недостаток,.который.не.касается.алгоритма.
шифрования..Подумайте.о.том,.что.это.за.недостаток.и.что.и.по.какой.причине.
не.сработает.
Глава 14. Обфускация сценария
1 ... 15 16 17 18 19 20 21 22 23
225
2.. Используя.описанные.ранее.методы,.запутайте.следующий.сценарий,.чтобы.
затруднить.его.выполнение:
#!/bin/bash - for args do echo $args done
3.. Зашифруйте.предыдущий.сценарий.и.создайте.оболочку.с.помощью.OpenSSL.
или.
streamcipher.sh
4.. Напишите.скрипт,.который.считывает.файл.сценария.и.выводит.его.запутанную.
версию.
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
15
Инструмент:
Fuzzer
Фаззинг (fuzzing).—.это.метод,.применяющийся.для.выявления.возможных.уязви- мостей.в.исполняемых.файлах,.протоколах.и.системах..Он.особенно.полезен.при.
идентификации.приложений,.в.которых.проверка.пользовательского.ввода.не.вы- полняется.или.выполняется.некачественно,.а.это,.в.свою.очередь,.может.привести.
к.такой.уязвимости,.как.переполнение.буфера..Bash.идеально.подходит.для.провер- ки.методом.фаззинга.программ,.которые.принимают.аргументы.и.запускаются.из.
командной.строки..Это.объясняется.тем,.что.запуск.программ.в.оболочке.является.
основной.задачей.bash.
В.этой.главе.мы.создадим.инструмент.
fuzzer.sh
,.который.видоизменяет.(fuzzes).
аргументы.командной.строки.исполняемого.файла..Другими.словами,.он.будет.
запускать.исполняемый.файл.снова.и.снова,.каждый.раз.увеличивая.длину.од- ного.из.аргументов.на.один.символ..Далее.перечислены.требования.к.данному.
инструменту.
Аргумент,.который.должен.быть.изменен,.обозначается.вопросительным.зна- ком.(
?
).
Измененный.аргумент.начинается.с.одного.символа,.и.при.каждом.выполне- нии.целевой.программы.к.нему.будет.добавляться.еще.один.дополнительный.
символ.
Fuzzer.остановится.после.того,.как.длина.аргумента.составит.10.000.символов.
При.аварийном.завершении.работы.программы.fuzzer.без.искажений.выведет.
вызвавшую.сбой.команду.и.любые.выходные.данные.программы,.включая.
ошибки.
Например,.если.вы.хотите.использовать.
fuzzer.sh
.для.видоизменения.второго.
аргумента.
fuzzme.exe
,.сделайте.это.следующим.образом:
./fuzzer.sh fuzzme.exe arg1 ?
Глава 15. Инструмент: Fuzzer 227
Как.говорилось.раньше,.аргумент,.который.вы.хотите.изменить,.обозначается.зна- ком.вопроса.(
?
)..
Fuzzer.sh
.будет.выполнять.программу.
fuzzme.exe
.снова.и.снова,.
каждый.раз.добавляя.ко.второ.му.аргументу.еще.один.символ..Если.это.делать.вруч- ную,.вы.увидите.следующее:
$ fuzzme.exe arg1 a
$ fuzzme.exe arg1 aa
$ fuzzme.exe arg1 aaa
$ fuzzme.exe arg1 aaaa
$ fuzzme.exe arg1 aaaaa
Реализация
В.качестве.целевого.приложения.используется.программа.
fuzzme.exe
..Мы.возьмем.
два.аргумента.командной.строки,.объединим.их.и.выведем.объединенную.строку.
на.экран..Вот.пример.выполнения.программы:
$ ./fuzzme.exe 'this is' 'a test'
The two arguments combined is: this is a test
Пример.15.1.предоставляет.исходный.код.для.
fuzzme.exe
,.написанный.на.языке.С.
Пример 15.1. fuzzme.c
#include
#include
// Внимание: эта программа не безопасна и предназначена
// только для демонстрации int main(int argc, char *argv[])
{
char combined[50] = "";
strcat(combined, argv[1]);
strcat(combined, " ");
strcat(combined, argv[2]);
printf("The two arguments combined is: %s\n", combined);
return(0);
}
Программа.использует.функцию.
strcat()
,.которая,.по.своей.сути,.небезопасна.
и.может.привести.к.переполнению.буфера..Кроме.того,.она.не.выполняет.проверку.
ввода.из.командной.строки.
228 Часть III • Тестирование на проникновение
STRCAT
Почему.же.функция.С.
strcat
.может.переполнить.буфер?.Поскольку.
strcat
.копи- рует.одну.строку.(источник).в.конец.другой.строки.(назначение),.функция.не.знает,.
какой.объем.памяти.доступен.в.месте.назначения..Независимо.от.того,.сколько.байт.
находится. или. сколько. места. доступно. в. месте. назначения,. функция. копирует. из.
источника.байт.за.байтом.до.тех.пор,.пока.не.столкнется.с.нулевым.байтом..В.резуль- тате.
strcat
.может.скопировать.в.место.назначения.слишком.много.данных.и.пере- записать.другие.разделы.памяти..Опытный.злоумышленник.может.воспользоваться.
этим.свойством.функции.для.внедрения.в.память.вредоносного.кода,.который.впо- следствии.будет.выполняться.компьютером.
Более.безопасной.функцией.является.
strncat
,.требующая.от.вас.указать.параметр,.
который. ограничивает. количество. копируемых. байтов.. В. этом. случае. вы. будете.
знать,.что.в.строке.назначения.останется.достаточно.места.
Полное.объяснение.механизма.переполнения.буфера.выходит.за.рамки.этой.книги,.
но. мы. вам. настоятельно. рекомендуем. прочитать. статью.Smashing The Stack for Fun
and Profit.(
http://bit.ly/2TAiw1P
).
В.примере.15.1.переменная.
combined[]
.имеет.максимальную.длину.50.байт..
Вот.что.происходит,.если.комбинация.двух.аргументов.программы.слишком.ве- лика.для.хранения.в.переменной:
$ ./fuzzme.exe arg1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
The two arguments combined is: arg1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Segmentation fault (core dumped)(Ошибка сегментации (сбросить ядро))
Как.вы.можете.видеть,.данные.переполнили.пространство,.выделенное.в.памяти.
для.
combined[]
,.и.вызвали.сбой.программы.из-за.ошибки.сегментации..Факт.сбоя.
программы.означает,.что.она.не.выполняет.нормальную.проверку.ввода.и.может.
быть.уязвима.для.атаки.
Метод.
fuzzer
.предназначен.для.автоматизации.процесса.идентификации.областей.
целевой.программы,.выходящих.из.строя.из-за.недопустимого.ввода.
Реализация.этого.метода.показана.в.примере.15.2.
Пример 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
Почему.бы.нам.просто.не.добавить.каждый.аргумент.в.строку,.а.не.хранить.их.
как.элементы.массива?.Все.будет.работать.нормально,.если.ни.один.из.аргумен-
Глава 15. Инструмент: Fuzzer 231
тов.не.содержит.пробелов..При.сохранении.аргументов.в.виде.массива.каждый.
аргумент.будет.сохранен.как.отдельный.элемент;.в.противном.случае.оболочка.
использует.для.разделения.аргументов.пробелы.
.При.пересмотре.аргументов.мы.ищем.литерал.
?
,.которым.пользователь.пометил.
аргумент,.предназначенный.для.изменения..Найдя.его,.мы.сохраняем.индекс.для.
последующего.использования.
.В.этом.цикле.мы.создаем.все.более.длинные.строки.для.видоизменения.(fuzzes).
приложения.и.проверяем,.не.будет.ли.достигнут.указанный.нами.максимум.10.000..
При.очередной.итерации.мы.добавляем.к.
FUZARG
.еще.один.символ,.а.затем.назнача- ем.
FUZARG
.аргументу,.который.был.обозначен.пользователем.с.помощью.
?
.При.вызове.команды.пользователя.следует.предоставить.список.аргументов,.
указывая.все.элементы.массива..Помещая.всю.эту.конструкцию.в.кавычки,.мы.
указываем.цитировать.каждый.аргумент,.тем.самым.сохраняя.любые.пробелы.
(например,.в.имени.файла.
My
File
)..Обратите.особое.внимание.на.приведенные.
здесь.перенаправления..Сначала.мы.отправляем.stderr.по.обычному.направлению.
в.stdout,.а.затем.перенаправляем.stdout.в.
/dev/null
..От.такого.перенаправления.мы.
получаем.следующий.эффект:.сообщения.об.ошибках.сохраняются,.а.нормальный.
вывод.отбрасывается..Очень.важен.порядок.этих.перенаправлений..Если.бы.мы.
отменили.этот.порядок.и.сначала.перенаправили.в.stdout,.то.все.выходные.данные.
были.бы.отброшены.
.Если.работа.команды.завершится.неудачно,.как.указано.ненулевым.возвра- щаемым.значением.(
$?
),.сценарий.отобразит,.какое.значение.аргумента.вызвало.
ошибку..Это.сообщение.направляется.в.stderr,.чтобы.его.можно.было.вывести.
отдельно.от.других.сообщений..Сообщения.об.ошибках.поступают.из.программы.
пользователя.
Выводы
Фаззинг.—.очень.хороший.способ.автоматизировать.процесс.идентификации.
частей.программы,.в.которых.отсутствует.проверка.ввода..В.частности,.вы.ищете.
данные,.вызывающие.сбой..Обратите.внимание:.при.сбое.целевой.программы.будет.
определена.область,.требующая.дальнейшего.исследования..Не.обязательно,.что.
в.этой.области.будет.найдена.уязвимость.
В.следующей.главе.рассматриваются.различные.способы.обеспечения.удаленного.
доступа.к.целевой.системе.
232 Часть III • Тестирование на проникновение
Упражнения
1.. Если.в.приложении.не.предусмотрена.надлежащая.проверка.вводимых.данных,.
указание.пользователем.неправильного.типа.данных.или.слишком.большой.
размер.данных.могут.привести.к.сбою.приложения..Например,.если.программа.
ожидает,.что.аргумент.будет.числовым,.а.вместо.этого.получает.буквенный,.что.
она.будет.делать?
Усовершенствуйте.файл.
fuzzer.sh
.так,.чтобы.он.не.только.увеличивал.длину.
аргумента,.но.и.передавал.в.случайном.порядке.аргументы.с.разными.типами.
данных.(числа,.буквы,.специальные.символы)..Например,.
fuzzer.sh
.может.
выполнить.что-то.вроде.этого:
$ fuzzme.exe arg1 a
$ fuzzme.exe arg1 1q
$ fuzzme.exe arg1 &e1
$ fuzzme.exe arg1 1%dw
$ fuzzme.exe arg1 gh#$1 2.. Доработайте.файл.
fuzzer.sh
.таким.образом,.чтобы.он.мог.одновременно.ото- бражать.несколько.аргументов.
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
16
Создание точки опоры
После.получения.доступа.к.целевой.системе.нужно.создать.точку.опоры..Это.дела- ется.с.помощью.инструмента удаленного доступа.—.важного.компонента.любого.
теста.на.проникновение..Этот.инструмент.позволяет.удаленно.выполнять.команды.
в.целевой.системе..Кроме.того,.в.течение.длительного.времени.он.может.поддер- живать.удаленный.доступ.к.целевой.системе..
Используемые команды
В.этой.главе.мы.рассмотрим.команду.
nc
.для.создания.сетевых.подключений.
nc
Команда.
nc
,.также.известная.как.
netcat
,.может.использоваться.для.создания.
соединений.TCP.и.UDP.и.прослушивателей..По.умолчанию.команда.доступна.
в.большинстве.дистрибутивов.Linux,.но.в.Git.Bash.или.Cygwin.она.отсутствует.
Общие параметры команды
-l
.—.прослушивать.входящие.подключения.(действует.как.сервер).
-n
.—.запретить.выполнение.поиска.DNS.
-p
.—.задать.исходный.порт.для.подключения.или.прослушивания.
-v
.—.установить.подробный.режим.
Пример команды
Для.инициализации.соединения.с.О’Reilly.com.и.конечным.портом.
80
.можно.на- писать.следующее:
nc www.oreilly.com 80
234 Часть III • Тестирование на проникновение
Прослушивание.входящих.соединений.порта.
8080
.выполняется.таким.образом:
$ nc -l -v -n -p 8080
listening on [any] 8080 ...
Бэкдор одной строкой
Нет.лучшего.способа.замаскироваться.во.время.теста.на.проникновение,.чем.ис- пользовать.для.выполнения.ваших.задач.инструменты,.существующие.в.целевой.
системе..Есть.несколько.способов.создания.в.системе.бэкдоров.(backdoor.—.«чер- ный.ход»),.и.для.этого.нужна.только.командная.строка.и.инструменты,.которые.
уже.доступны.в.большинстве.систем.Linux..Созданные.ранее.бэкдоры.позволят.
поддерживать.доступ.к.целевой.системе.
Обратный SSH
Создание.обратного.SSH-соединения.—.это.простой.и.эффективный.способ.под- держания.доступа.к.системе..Настройка.обратного.SSH-соединения.не.требует.
сценариев.и.может.быть.выполнена.простым.запуском.одной.команды.
В.типичном.сетевом.соединении.клиент.—.это.система,.которая.инициирует.со- единение.(рис..16.1).
Рис. 16.1. Нормальное соединение SSH
Обратное.SSH-соединение.отличается.от.прямого.тем,.что.SSH-сервер.в.конечном.
счете.инициирует.соединение.с.клиентом.(целью)..В.этом.сценарии.целевая.систе- ма.сначала.инициирует.соединение.с.атакующей.системой..Затем.SSH.злоумыш- ленника.подключается.к.атакующей.системе..Наконец,.соединение.злоумышлен- ника.перенаправляется.через.существующее.соединение.обратно.к.цели,.создавая.
таким.образом.обратный.сеанс.SSH.