Файл: Paul Troncone and Carl AlbingCybersecurity Ops with bashAttack, Defend, and Analyze from the.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 460
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
#
#
exec 3<>/dev/tcp/"$1"/25
echo -e 'quit\r\n' >&3
cat <&3
При.запуске.этого.сценария.мы.получим.следующий.вывод:
$ ./smtpconnect.sh 192.168.0.16 220 localhost.localdomain ESMTP Postfix (Ubuntu)
В.примере.13.2.показано,.как.это.все.объединить.для.автоматического.извлечения.
баннеров.с.серверов.FTP,.SMTP.и.HTTP.
Пример 13.2. bannergrabber.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# bannergrabber.sh
#
# Описание:
# Автоматическое извлечение баннеров с HTTP-, SMTP- и FTP-серверов
#
# Использование: ./bannergrabber.sh hostname [scratchfile]
# scratchfile используется во время обработки, но удаляется;
# по умолчанию: "scratch.file" или сгенерированное имя
#
Глава 13. Разведка 203
#
function isportopen ()
{
(( $# < 2 )) && return 1
local host port host=$1
port=$2
echo >/dev/null 2>&1 < /dev/tcp/${host}/${port}
return $?
}
function cleanup ()
{
rm -f "$SCRATCH"
}
ATHOST="$1"
SCRATCH="$2"
if [[ -z $2 ]]
then if [[ -n $(type -p tempfile) ]]
then
SCRATCH=$(tempfile)
else
SCRATCH='scratch.file'
fi fi trap cleanup EXIT
touch "$SCRATCH"
if isportopen $ATHOST 21 # FTP
then
# например, ftp -n $ATHOST
exec 3<>/dev/tcp/${ATHOST}/21
echo -e 'quit\r\n' >&3
cat <&3 >> "$SCRATCH"
fi if isportopen $ATHOST 25 # SMTP
then
# например, telnet $ATHOST 25
exec 3<>/dev/tcp/${ATHOST}/25
echo -e 'quit\r\n' >&3
cat <&3 >> "$SCRATCH"
fi if isportopen $ATHOST 80 # HTTP
then curl -LIs "https://${ATHOST}" >> "$SCRATCH"
fi cat "$SCRATCH"
204 Часть III • Тестирование на проникновение
Как.было.показано.в.главе.9,.этот.сценарий.при.попытке.открытия.или.при.
удачном.открытии.TCP-порта.на.хосте.также.использует.специальное.имя.файла.
/dev/tcp
.и.номер.порта,.указанный.как.часть.этого.имени.файла.(например,.
/dev/
tcp/127.0.0.1/631
).
.Сценарий.начинается.функцией.
isportopen
,.которая.проверяет.ошибки,.что- бы.убедиться,.что.нам.было.передано.правильное.количество.параметров..Хотя.
в.программировании.полезно.проверять.ошибки,.в.предыдущих.сценариях.мы.
этого.не.делали..Проверки.не.проводились,.чтобы.в.процессе.обучения.избежать.
чрезмерного.усложнения.сценариев..При.реальном.использовании.в.производ- ственных.средах.обязательно.проводите.такую.проверку.ошибок,.чтобы.при.от- ладке.сэкономить.время.
.Это.основа.всего.сценария..Здесь.мы.можем.посмотреть,.открыт.ли.порт..На.пер- вый.взгляд.три.перенаправления.могут.показаться.странными..Но.давайте.их.раз- берем..Команда.
echo
.без.аргументов.выведет.на.экран.новую.строку.—.пусть.нас.это.
не.беспокоит..Мы.ее.отфильтровываем.и.отправляем.в.
/dev/null
..Все.остальные.
сообщения.об.ошибках.(stderr).также.будут.направлены.в.этот.каталог..По.суще- ству,.нам.нужно.только.перенаправить.ввод..Вы.можете.подумать,.что.команда.
echo
.ничего.не.читает.из.stdin..Тем.не.менее.bash.попытается.открыть.файл,.на- званный.как.перенаправление.stdin,.и.в.зависимости.от.результата.(получилось.
открыть.или.нет).мы.сможем.определить.состояние.порта.—.открыт.или.закрыт..
Если.перенаправление.не.получится,.общая.команда.также.не.будет.выполнена.
и,.следовательно,.переменной.
$?
.будет.присвоено.значение,.отличающееся.от.нуля..
При.успешном.перенаправлении.переменной.
$?
.будет.присвоено.значение.
0
.Ловушка.устанавливается.так,.чтобы.при.выходе.из.сценария.с.помощью.функ- ции.очистки.наш.рабочий.файл.был.обязательно.удален.
.Теперь.с.помощью.команды.
touch
.мы.создаем.пустой.файл.и.убеждаемся,.что.он.
находится.в.целевой.системе.и.готов.к.использованию..Если.в.файл.ничего.не.за- писывать,.никакой.ошибки.не.будет.(см..).
.Эта.проверка.использует.нашу.вспомогательную.функцию,.в.результате.чего.
мы.можем.увидеть,.открыт.ли.порт.FTP.(21).на.хосте,.имя.которого.было.указано.
пользователем.при.вызове.сценария.
.Здесь,.чтобы.дескриптор.файла.3.был.открыт.для.чтения.и.записи.(
<>
),.исполь- зуется.команда.
exec
..Файл,.к.которому.мы.обращаемся,.—.это.стандартный.порт.
FTP.номер.21.
.Чтобы.FTP-порт.не.оставлять.открытым,.записывается.короткое.сообще- ние..Поскольку.в.наши.намерения.не.входит.передача.файлов,.мы.даем.коман-
Глава 13. Разведка 205
ду.на.выход..Параметр.
-e
.указывает.команде.
echo
.интерпретировать.escape- последовательность.(
\r\n
).как.символы,.необходимые.сокету.TCP.для.завершения.
строки.
.Здесь.происходит.считывание.из.файлового.дескриптора.3.нашего.TCP- соединения.и.запись.данных,.возвращенных.в.файл.
SCRATH
..Обратите.внимание.
на.использование.символов.
>>
,.определяющих,.что.файл.не.перезаписывается,.
а.добавляется..В.первый.раз,.когда.мы.выполняем.запись.в.файл,.этого.делать.
не.нужно..Добавление.файла.предусмотрено.на.случай,.если.понадобится.переупо- рядочить.код.(это.параллельная.конструкция,.когда.все.перенаправления.в.
$SCRATH
выглядят.одинаково).
.Поскольку.для.HTTP-соединения.и.добавления.вывода.в.файл.
scratch
.мы.можем.
использовать.команду.
curl
,.
/dev/tcp
.нам.не.понадобится.
.На.последнем.этапе.нам.предстоит.сбросить.весь.найденный.вывод..Если.бы.
ни.один.из.портов.не.был.открыт,.в.файл.
scratch
.ничего.не.было.бы.записано..
В.начале.мы.специально.с.помощью.команды.
touch
.создаем.новый.файл,.чтобы.
после.объединения,.выполняемого.командой.
cat
,.не.появлялась.ошибка.«Файл.
не.найден».
Выводы
Разведка.—.один.из.самых.важных.шагов.в.любом.тесте.на.проникновение..
Чем.больше.данных.о.цели.вы.получите,.тем.легче.будет.запустить.успешный.
эксплойт..При.выполнении.разведки.будьте.осторожны,.чтобы.слишком.рано.
не.раскрыть.свои.карты..Постарайтесь.узнать,.какие.методы.разведки.могут.быть.
обнаружены.целью,.а.какие.—.нет.
В.следующей.главе.мы.рассмотрим.методы.обфускации.сценариев,.которые.
делают.скрипты.более.трудными.для.анализа.или.выполнения,.если.они.будут.за- хвачены.сетевыми.защитниками.(defender).
Упражнения
1.. Создайте.конвейер.команд,.использующих.для.извлечения.веб-страницы.коман- ду.
curl
,.а.затем.выведите.на.экран.все.адреса.электронной.почты,.найденные.на.
этой.странице.
206 Часть III • Тестирование на проникновение
2.. Измените.сценарий.
smtpconnect.sh
.так,.чтобы.сетевой.порт,.использу- емый.для.подключения,.задавался.аргументом.командной.строки.(например,.
./smtpconnect.sh
192.168.0.16 25
).
3.. Измените.сценарий.
bannergrabber.sh
.так,.чтобы.вместо.одного.имени.хоста,.
указанного.в.командной.строке,.он.считывал.из.файла.список.нескольких.це- левых.IP-адресов.
4.. Измените.сценарий.
bannergrabber.sh
.так,.чтобы.список.всех.обнаруженных.
баннеров.выводился.в.одном.файле.в.виде.таблицы.HTML.
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
14
Обфускация сценария
Сценарий.bash.может.быть.легко.прочитан.человеком.—.это.определено.особен- ностью.языка..Желательно,.чтобы.большинство.приложений.легко.читались,.но.
для.сценариев.тестирования.на.проникновение.это.неприемлемо..В.большинстве.
случаев.при.выполнении.атак.не.требуется,.чтобы.цель.могла.легко.прочесть.или.
перенастроить.применяемые.инструменты..Для.затруднения.чтения.и.анализа.кода.
можно.использовать.обфускацию.
Обфускация,.или.запутывание,.—.это.набор.методов,.позволяющих.намеренно.
сделать.сценарий,.инструмент,.приложение.или.файл.трудным.для.чтения.или.
понимания..Существует.три.основных.способа.обфускации.сценариев:
обфускация.синтаксиса;
обфускация.логики;
кодирование.или.шифрование.
В.следующих.разделах.мы.подробно.рассмотрим.каждый.из.них.
Используемые команды
Для.преобразования.данных.мы.воспользуемся.командой.
base64
,.а.для.выполнения.
произвольных.командных.операторов.—.командой.
eval base64
Команда.
base64
.предназначена.для.кодирования.данных.в.формате.Base64.
Дополнительные сведения о стандарте кодирования двоичных данных Base64 вы найдете по адресу http://bit.ly/2Wx5VOC.
208 Часть III • Тестирование на проникновение
Общие параметры команды
-d
.—.декодировать.данные,.закодированные.в.формате.Base64.
Пример команды
Для.кодирования.строки.в.Base64.можно.написать.следующее:
$ echo 'Rapid Cybersecurity Ops' | base64
UmFwaWQgQ3liZXJzZWN1cml0eSBPcHMK
Для.декодирования.из.Base64:
$ echo 'UmFwaWQgQ3liZXJzZWN1cml0eSBPcHMK' | base64 -d
Rapid Cybersecurity Ops eval
Команда.
eval
.выполняет.аргументы,.заданные.ей.в.контексте.текущей.оболочки..
Например,.команде.
eval
.можно.предоставить.команды.оболочки.и.аргументы.
в.формате.строки.и.
eval
.выполнится.так,.как.если.бы.это.была.команда.оболочки..
Это.особенно.полезно.в.сценарии.при.динамическом.построении.команд.оболочки.
Пример команды
В.этом.примере.команда.оболочки.динамически.объединяется.с.аргументом,.после.
чего.с.помощью.команды.
eval
.в.оболочке.выполняется.результат:
$ commandOne="echo"
$ commandArg="Hello World"
$ eval "$commandOne $commandArg"
Hello World
Обфускация синтаксиса
Обфускация синтаксиса.сценария.направлена.на.то,.чтобы.затруднить.чтение.—.
другими.словами,.сделать.так,.чтобы.сценарий.был.испорчен.и.из-за.этого.труд- ночитаем..Для.написания.такого.сценария.не.используйте.свои.навыки.написания.
хорошо.отформатированного.и.легкочитаемого.кода.
Начнем.с.правильного.хорошо.отформатированного.кода.(пример.14.1).
Глава 14. Обфускация сценария 209
Пример 14.1. readable.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# readable.sh
#
# Описание:
# Простой скрипт для обфускации
#
if [[ $1 == "test" ]]
then echo "testing"
else echo "not testing"
fi echo "some command"
echo "another command"
В.bash.вы.можете.поместить.весь.сценарий.в.одну.строку..Обратите.внимание:.
вместо.того.чтобы.начинать.каждую.команду.с.новой.строки,.введите.весь.сценарий.
одной.строкой,.разделяя.команды.точкой.с.запятой.(
;
)..В.примере.14.2.показан.
тот.же.сценарий,.записанный.в.одну.строку.(в.книге.он.будет.напечатан.в.две.стро- ки,.так.как.в.одну.строку.сценарий.на.странице.не.помещается).
Пример 14.2. oneline.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# oneline.sh
#
# Описание:
# Пример обфускации однострочного скрипта
#
if [[ $1 == "test" ]]; then echo "testing"; else echo "not testing"; fi; echo "some command"; echo "another command"
В.примере.14.2.сценарий.из.примера.14.1,.записанный.одной.строкой,.выглядит.
не.так.уж.и.плохо..Но.представьте.себе.сценарий,.состоящий.из.нескольких.сотен.
или.нескольких.тысяч.строк.кода,.который.мы.записали.в.одну.строку..В.этом.
случае.было.бы.затруднительно.понять.такой.сценарий.без.переформатирования.
Другой.метод.обфускации.синтаксиса.—.сделать.имена.переменных.и.функций.
как.можно.более.невзрачными.и.не.привлекающими.к.себе.внимания..Кроме.того,.
имена.для.различных.типов.и.областей.можно.использовать.повторно..В.приме- ре.14.3.показан.образец.
210 Часть III • Тестирование на проникновение
Пример 14.3. synfuscate.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# synfuscate.sh
#
# Описание:
# Пример обфускации синтаксиса скрипта
#
a ()
{
local a="Local Variable a"
echo "$a"
}
a="Global Variable a"
echo "$a"
a
Пример.14.3.включает.три.различных.элемента:
.функцию.с.именем.
a
;
.локальную.переменную.с.именем.
а
;
.глобальную.переменную.с.именем.
а
Применение.трудноопределимых.соглашений.об.именах.и,.где.это.возможно,.по- вторное.использование.имен.затрудняют.анализ.кода,.особенно.при.больших.его.
объемах..Чтобы.сделать.код.еще.более.запутанным,.вы.можете.объединить.этот.
метод.с.ранее.описанной.техникой.размещения.всего.кода.в.одной.строке:
#!/bin/bash - a(){ local a="Local Variable a";echo "$a";};a="Global Variable a";echo "$a";a
Наконец,.при.обфускации.синтаксиса.сценария.обязательно.удалите.все.коммен- тарии..Не.нужно.давать.подсказки.аналитику,.занимающемуся.разработкой.кода.
Обфускация логики
Другой.метод.заключается.в.том,.чтобы.запутать логику.сценария.так,.чтобы.ее.
было.трудно.понять..Сценарий.выполняет.требуемую.функцию,.но.делает.это.
окольным.путем..При.применении.этого.метода.действительно.уменьшается.
эффективность.данного.сценария.и.увеличивается.его.размер.
Глава 14. Обфускация сценария 211
Вот.несколько.приемов,.которыми.можно.воспользоваться.для.обфускации.логики:
используйте.вложенные.функции;
добавьте.функции.и.переменные,.которые.не.вредят.функциональности.сценария;
напишите.операторы.
if
.с.несколькими.условиями,.где.только.одно.условие.
может.иметь.верное.значение;
используйте.вложенные.операторы.
if
.и.циклы.
В.примере.14.4.показан.сценарий,.реализующий.некоторые.логические.методы.
обфускации..Просмотрите.его.и,.не.читая.пояснений,.попробуйте.понять,.что.он.
делает.
Пример 14.4. logfuscate.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# logfuscate.sh
#
# Описание:
# Пример запутывания логики
#
f="$1"
a() (
b()
{
f="$(($f+5))"
g="$(($f+7))"
c
}
b
)
c() (
d()
{
g="$(($g-$f))"
f="$(($f-2))" echo "$f"
}
f="$(($f-3))"
d
)
f="$(($f+$2))"
a
212 Часть III • Тестирование на проникновение
Вот.построчное.объяснение.того,.что.делает.данный.сценарий.
.Значение.первого.аргумента.хранится.в.переменной.
f
.Значение.второго.аргумента.добавляется.к.текущему.значению.
f
,.и.результат.
сохраняется.в.
f
.Вызывается.функция.
a
.Вызывается.функция.
b
.Добавляет.5.к.значению.
f
.и.сохраняет.результат.в.
f
.Добавляет.7.к.значению.
f
.и.сохраняет.результат.в.переменной.
g
.Вызывается.функция.
c
.Вычитает.3.из.значения.
f
.и.сохраняет.результат.в.
f
.Вызывается.функция.
d
.Вычитает.значение.
f
.из.значения.
g
.и.сохраняет.результат.в.
g
.Вычитает.2.из.значения.
f
.и.сохраняет.результат.в.
f
.Выводит.на.экран.значение.
f
Итак,.что.же.делает.сценарий.в.целом?.Он.просто.принимает.два.аргумента.ко- мандной.строки.и.складывает.их..Весь.сценарий.может.быть.заменен.следующей.
строкой:
echo "$(($1+$2))"
Сценарий.применяется.вложенные.функции,.которые.не.делают.ничего,.кроме.
вызова.дополнительных.функций..Используются.также.бесполезные.вычисления.
и.переменные..Несколько.вычислений.выполняются.с.переменной.
g
,.но.это.никак.
не.влияет.на.вывод.сценария.
Существуют.неограниченные.способы.запутать.логику.вашего.сценария..Чем.более.
запутанным.будет.сценарий,.тем.сложнее.окажется.его.анализ.
Обфускация.синтаксиса.и.логики,.как.правило,.выполняется.после.того,.как.сцена- рий.написан.и.протестирован..Чтобы.упростить.обфускацию,.подумайте.о.создании.
скрипта,.который.будет.выполнять.запутывание.других.сценариев.
После обфускации обязательно протестируйте свои сценарии, чтобы убедиться, что они правильно работают.
Глава 14. Обфускация сценария 213
Шифрование
Один.из.самых.эффективных.способов.запутать.сценарий.—.зашифровать.его.
с.помощью.оболочки..Это.не.только.затрудняет.анализ.кода.—.если.все.сделано.
правильно,.злоумышленник.даже.не.сможет.запустить.скрипт.при.отсутствии.
подходящего.ключа..Однако.такой.метод.достаточно.сложен.
Криптографический учебник для начинающих
Криптография.—.это.наука.о.методах.обеспечения.целостности.данных,.когда.
данные.не.могут.быть.прочитаны.посторонними.лицами..Это.одна.из.старейших.
форм.информационной.безопасности,.которой.более.тысячи.лет.
Криптографическая.система,.или.криптосистема,.состоит.из.пяти.основных.ком- понентов.
Обычный текст.—.оригинальное.сообщение,.которое.требуется.зашифровать.
Функция шифрования.—.метод,.используемый.для.преобразования.исходного.
незашифрованного.сообщения.в.его.безопасную,.непонятную.для.посторонних.
форму.
Функция расшифровки.—.метод,.используемый.для.преобразования.зашифро- ванной.информации.в.первоначальную.понятную.форму.
Криптографический ключ.—.секретный.код,.используемый.функцией.для.ши- фрования.или.дешифрования.
Зашифрованный текст.—.зашифрованное.сообщение.
Шифрование
Шифрование.—.это.процесс.преобразования.исходного.сообщения.(открытого.
текста).в.его.безопасную.(непонятную).форму,.или.шифротекст..Для.шифрования.
требуется.ключ,.который.должен.храниться.в.секрете.и.быть.известен.только.лицу,.
выполняющему.шифрование,.и.предполагаемым.получателям.сообщения..После.
шифрования.результирующий.зашифрованный.текст.станет.нечитаемым..Прочи- тать.сообщение.сможет.только.тот,.у.кого.есть.соответствующий.ключ.
Расшифровка
Расшифровка.—.это.процесс.преобразования.зашифрованного.сообщения.(шиф- ротекста).в.открытый.читаемый.текст..Как.и.в.случае.с.шифрованием,.для.расши- фровки.сообщения.требуется.соответствующий.ключ..Зашифрованное.сообщение.
не.может.быть.расшифровано.без.использования.соответствующего.ключа.
214 Часть III • Тестирование на проникновение
Криптографический ключ
Криптографический ключ,.используемый.для.шифрования.открытого.текстового.
сообщения,.имеет.решающее.значение.для.общей.безопасности.системы..Ключ.
должен.быть.защищен,.всегда.оставаться.секретным.и.передаваться.только.тем,.
кому.предназначено.зашифрованное.сообщение.
Современные.криптосистемы.имеют.ключи.длиной.от.128.до.4096.бит..Как.пра- вило,.чем.больше.размер.ключа,.тем.сложнее.взломать.защиту.криптосистемы.
Шифрование сценария
Шифрование.используется.для.защиты.основного.(или.внутреннего).сценария,.по- этому.он.не.может.быть.прочитан.третьей.стороной.без.соответствующего.ключа..
При.шифровании.будет.создан.другой.сценарий,.называемый.оболочкой,.который.
содержит.зашифрованный.сценарий,.хранящийся.в.переменной..Основная.цель.
сценария-оболочки.—.расшифровать.зашифрованный.внутренний.сценарий.и.вы- полнить.это.действие.только.в.том.случае,.если.будет.предоставлен.правильный.
ключ.
Первым.шагом.в.этом.процессе.станет.создание.сценария,.который.требуется.
зашифровать..Сценарий,.который.мы.используем.для.этой.цели,.показан.в.при- мере.14.5.
1 ... 15 16 17 18 19 20 21 22 23
Пример 14.5. innerscript.sh echo "This is an encrypted script"
echo "running uname -a"
uname -a
После.того.как.вы.создали.такой.сценарий,.вам.нужно.его.зашифровать..Для.этого.
можно.использовать.инструмент.OpenSSL..По.умолчанию.OpenSSL.доступен.
во.многих.дистрибутивах.Linux.и.входит.в.состав.Git.Bash..В.этом.случае.мы.
задействуем.алгоритм.Advanced.Encryption.Standard.(AES),.который.считается.
алгоритмом.симметричного ключа,.когда.один.и.тот.же.ключ.применяется.как.
для.шифрования,.так.и.для.дешифрования..Чтобы.зашифровать.файл,.напишите.
следующее:
openssl aes-256-cbc -base64 -in innerscript.sh -out innerscript.enc
-pass pass:mysecret
Аргумент.
aes-256-cbc
.указывает.256-разрядную.версию.AES..Параметр.
-in
.указы- вает.файл.для.шифрования,.а.параметр.
-out
.—.файл,.в.который.будет.выводиться.
зашифрованный.текст..Параметр.
-base64
.говорит.о.том,.что.выходные.данные.
Глава 14. Обфускация сценария 215
должны.быть.закодированы.Base64.—.стандартом.кодирования.данных.с.помощью.
только.64.символов.ASCII..Кодировка.Base64.важна.из-за.способа,.с.помощью.
которого.зашифрованный.текст.позже.будет.расшифрован..Наконец,.опция.
-pass используется.для.указания.ключа.шифрования.
Вывод.из.OpenSSL,.который.является.зашифрованной.версией.сценария.
in- nerscript.sh
,.выглядит.следующим.образом:
U2FsdGVkX18WvDOyPFcvyvAozJHS3tjrZIPlZM9xRhz0tuwzDrKhKBBuugLxzp7T
MoJoqx02tX7KLhATS0Vqgze1C+kzFxtKyDAh9Nm2N0HXfSNuo9YfYD+15DoXEGPd
Создание оболочки
Теперь,.когда.внутренний.сценарий.зашифрован.и.представлен.в.формате.Base64,.
вы.можете.написать.для.него.оболочку..Основная.задача.оболочки.в.том,.чтобы.
сначала.расшифровать.внутренний.сценарий.(при.наличии.соответствующего.
ключа),.а.затем.выполнить.
В.идеале.расшифровка.и.выполнение.сценария.должны.происходить.в.оперативной.
памяти..Следует.избегать.записи.незашифрованного.сценария.на.жесткий.диск,.
так.как.позже.его.могут.найти.и.проанализировать.посторонние..Такой.сценарий.
оболочки.показан.в.примере.14.6.
Пример 14.6. wrapper.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# wrapper.sh
#
# Описание:
# Пример выполнения зашифрованного «обернутого» скрипта
#
# Использование:
# wrapper.sh
# Ввести пароль при появлении запроса
#
encrypted='U2FsdGVkX18WvDOyPFcvyvAozJHS3tjrZIPlZM9xRhz0tuwzDrKhKBBuugLxzp7T
MoJoqx02tX7KLhATS0Vqgze1C+kzFxtKyDAh9Nm2N0HXfSNuo9YfYD+15DoXEGPd'
read -s word
innerScript=$(echo "$encrypted" | openssl aes-256-cbc -base64 -d -pass pass:"$word")
eval "$innerScript"
216 Часть III • Тестирование на проникновение
.Это.зашифрованный.внутренний.сценарий,.хранящийся.в.переменной.
encrypted
Причина,.по.которой.ранее.мы.кодировали.вывод.OpenSSL.в.Base64,.состоит.в.том,.
что.он.может.быть.включен.в.сценарий.
wrapper.sh
..Если.ваш.зашифрованный.
сценарий.очень.большой,.вы.можете.сохранить.его.в.отдельном.файле..Но.в.этом.
случае.вам.нужно.будет.загрузить.в.целевую.систему.два.файла.
.Здесь.в.переменную.считывается.ключ.расшифровки..Чтобы.пользовательский.
ввод.не.отображался.на.экране,.используется.параметр.
-s
.Данный.конвейер.команд.передает.в.OpenSSL.зашифрованный.сценарий.для.
расшифровки..Результат.сохраняется.в.переменной.
innerScript
.С.помощью.команды.
eval
.начинается.выполнение.кода,.сохраненного.в.пере- менной.
innerScript
В.самом.начале.выполнения.программы.пользователю.будет.предложено.ввести.
ключ..Если.он.введет.соответствующий.ключ.(тот.же.ключ,.который.использовался.
при.шифровании),.внутренний.сценарий.будет.расшифрован.и.выполнен:
$ ./wrapper.sh
This is an encrypted script running uname -a
MINGW64_NT-6.3 MySystem 2.9.0(0.318/5/3) 2017-10-05 15:05 x86_64 Msys
Шифрование.имеет.два.существенных.преимущества.перед.обфускацией.синтак- сиса.и.логики.
Если.используется.хороший.алгоритм.шифрования.и.достаточно.длинный.
ключ,.этот.способ.шифрования.математически.безопасен,.а.зашифрованная.
информация.практически.не.подвержена.несанкционированному.доступу..
Методы.обфускации.синтаксиса.и.логики.не.обеспечивают.полную.защиту.
хранящейся.или.передаваемой.информации.и.только.заставляют.аналитика.
тратить.больше.времени.на.анализ.сценария.
Тот,.кто,.не.зная.правильного.ключа,.попытается.реконструировать.внутренний.
сценарий,.не.сможет.даже.выполнить.его.
Недостаток.этого.метода.шифрования.заключается.в.том,.что.выполняемый.сце- нарий.в.незашифрованном.виде.сохраняется.в.оперативной.памяти.компьютера..
Незашифрованный.сценарий.может.быть.извлечен.из.оперативной.памяти.
компьютера.с.помощью.соответствующих.методов.криминалистической.экс- пертизы.
Глава 14. Обфускация сценария 217
Создание собственного метода криптографии
Предыдущий.метод.шифрования.отлично.работает,.если.в.целевой.системе.уста- новлен.OpenSSL..Но.что.делать,.если.его.там.нет?.Вы.можете.установить.OpenSSL.
(но.это.действие.может.быть.замечено.системным.администратором.целевой.систе- мы.и.возрастет.операционный.риск).или.же.создать.внутри.сценария.собственную.
реализацию.криптографического.алгоритма.
В большинстве случаев не стоит создавать собственный криптографический алгоритм или даже пытаться реализовать существующий, например AES. Вместо этого лучше использовать общепринятые алгоритмы, которые были проверены криптографическим сообществом.
В данном случае мы будем реализовывать алгоритм только для производственной необходимости и для того, чтобы продемонстрировать фундаментальные крипто- графические принципы. Здесь следует учесть, что этот алгоритм небезопасен, а информация зашифрована плохо.
Алгоритм,.который.мы.будем.использовать,.состоит.из.нескольких.основных.
шагов.и.прост.в.реализации..Это.основной.потоковый шифр,.который.использует.
генератор.случайных.чисел.для.создания.ключа.той.же.длины,.что.и.обычный,.
подлежащий.шифрованию.текст..Далее.каждый.байт.(символ).обычного.текста.
пропускается.через.операцию.исключающего.ИЛИ.(метод.XOR).с.соответству- ющим.байтом.ключа.(случайным.числом)..Вывод.представляет.собой.зашифро- ванный.шифротекст..Таблица.14.1.иллюстрирует.использование.метода.XOR.для.
шифрования.
Таблица 14.1. Пример шифрования
Обычный текст
e
c
h
o
ASCII.(шестнадцатеричный)
65 63 68 6f
Ключ.(шестнадцатеричный)
ac
27
f2
d9
XOR
—
—
—
—
Зашифрованный.текст.(шестнадцатеричный)
c9 44 9a b6
Если.при.расшифровке.текста,.зашифрованного.методом.XOR,.будет.использо- ван.тот.же.ключ.(последовательность.случайных.чисел),.который.применялся.
для.шифрования,.мы.получим.расшифрованный.исходный.текст..Как.и.AES,.этот.
218 Часть III • Тестирование на проникновение метод.считается.алгоритмом.симметричного.ключа..В.табл..14.2.показано,.как.ис- пользовать.метод.XOR.для.расшифровки.зашифрованного.текста.
Таблица 14.2. Пример расшифровки
Шифртекст (шестнадцатеричный)
c9
44
9a
b6
Ключ.(шестнадцатеричный)
ac
27
f2
d9
XOR
—
—
—
—
ASCII.(шестнадцатеричный)
65 63 68 6f
Обычный.текст e
c h
o
Чтобы.текст.был.правильно.расшифрован,.вам.нужно.иметь.тот.же.ключ,.который.
использовался.для.шифрования..Это.можно.сделать,.используя.для.генератора.
случайных.чисел.одно.и.то.же.начальное.значение..Если.вы.запускаете.тот.же.
генератор.случайных.чисел,.используя.одно.и.то.же.начальное.значение,.на.вы- ходе.вы.должны.получить.ту.же.последовательность.случайных.чисел..Обратите.
внимание,.что.безопасность.данного.метода.сильно.зависит.от.качества.генера- тора.случайных.чисел,.который.вы.используете..Кроме.того,.вы.должны.выбрать.
большое.начальное.значение.и.для.шифрования.каждого.сценария.указывать.
разные.значения.
Вот.пример.того,.как.вы.можете.запустить.этот.сценарий..В.качестве.аргумента.
указывается.ключ.шифрования.—.в.данном.случае.
25624
..Входные.данные.—.это.
одна.фраза,.представляющая.команду.Linux.
uname
-a
,.а.вывод,.то.есть.зашифро- ванная.фраза.—.это.неразрывная.последовательность.шестнадцатеричных.цифр:
$ bash streamcipher.sh 25624
uname -a
5D2C1835660A5822
$
Для.проверки.вы.можете.расшифровать.зашифрованный.результат.и.сравнить.
с.оригинальным.текстом:
$ bash streamcipher.sh 25624 | bash streamcipher.sh -d 25624
uname -a uname -a
$
Первая.фраза.
uname
-a
.—.это.ввод.в.сценарий.шифрования;.вторая.—.вывод.после.
расшифровки..То.есть.все.сработало.правильно!
Глава 14. Обфускация сценария 219
Сценарий,.приведенный.в.примере.14.7,.считывает.указанный.файл,.а.затем.с.по- мощью.метода.XOR.и.ключа,.предоставленного.пользователем,.шифрует.или.рас- шифровывает.его.
Пример 14.7. streamcipher.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# streamcipher.sh
#
# Описание:
# Облегченная реализация потокового шифра
# Это учебный пример, который не рекомендуется для практического применения
#
# Использование:
# streamcipher.sh [-d]
# -d Режим дешифрования
#
#
#
source ./askey.sh
#
# Ncrypt – шифрование — считывание символов
# на выходе двухзначный шестнадцатеричный #s
#
function Ncrypt ()
{
TXT="$1"
for((i=0; i< ${#TXT}; i++))
do
CHAR="${TXT:i:1}"
RAW=$(asnum "$CHAR") # " " требуется для пробелов (32)
NUM=${RANDOM}
COD=$(( RAW ^ ( NUM & 0x7F )))
printf "%02X" "$COD"
done echo
}
#
# Dcrypt - дешифрование — считывание двухзначного шестнадцатеричного #s
# на выходе символы (буквенные и цифровые)
#
function Dcrypt ()
220 Часть III • Тестирование на проникновение
{
TXT="$1"
for((i=0; i< ${#TXT}; i=i+2))
do
CHAR="0x${TXT:i:2}"
RAW=$(( $CHAR ))
NUM=${RANDOM}
COD=$(( RAW ^ ( NUM & 0x7F ))) aschar "$COD" done echo
}
if [[ -n $1 && $1 == "-d" ]] then
DECRYPT="YES"
shift fi
KEY=${1:-1776}
RANDOM="${KEY}" while read -r do if [[ -z $DECRYPT ]] then
Ncrypt "$REPLY"
else
Dcrypt "$REPLY"
fi done
.В.указанном.файле.считывается.оператор.
source
,.который.становится.частью.
сценария..В.данном.случае.он.содержит.определения.двух.функций,.таких.как.
asnum
.и.
aschar
,.которые.позже.будут.использованы.в.коде.
.Функция.Ncrypt.принимает.строку.текста.в.качестве.своего.первого.(и.един- ственного).аргумента.и.шифрует.каждый.символ,.распечатывая.зашифрованную.
строку.
.Это.цикл,.определяющий.длину.строки.
.Принимается.первый.символ.
.Когда.мы.ссылаемся.на.данную.строку.с.одним.символом,.а.символ.оказывается.
пробелом.(ASCII.32),.который.игнорируется.оболочкой,.мы.помещаем.эту.строку.
в.кавычки.
.Внутри.двойных.скобок,.как.и.в.любом.другом.месте.сценария,.символ.
$
перед.именами.переменных.не.нужен..Переменная.
RANDOM
.—.это.специальная.
Глава 14. Обфускация сценария 221
переменная.оболочки,.которая.возвращает.случайное.(целое).число.в.диапазоне.
от.0.до.16.383.(3FFF)..Здесь,.чтобы.очистить.все,.кроме.последних.7.бит,.исполь- зуется.поразрядный.оператор.
and
.Мы.печатаем.новое.закодированное.значение.в.виде.двухзначного.шестнадца- теричного.числа.с.нулевым.заполнением.
.Оператор.
echo
.печатает.новую.строку.в.конце.строки.шестнадцатеричных.цифр.
.Для.расшифровки.будет.вызвана.функция.
Decrypt
.Ввод.для.расшифровки.—.шестнадцатеричные.цифры,.поэтому.одновременно.
мы.берем.два.символа.
.Мы.строим.подстроку.с.литералом.
0x
,.за.которым.следует.двухсимвольная.под- строка.входного.текста.
.Задав.шестнадцатеричную.цифру.в.формате,.который.понимает.bash,.мы.можем.
рассматривать.ее.как.математическое.выражение.(используя.символы.dollar- double-parens),.после.чего.bash.вернет.ее.значение..Вы.могли.бы.написать.это.вы- ражение.следующим.образом:
$(( $CHAR + 0 ))
.Используемый.нами.алгоритм.кодирования/декодирования.один.и.тот.же..
Мы.берем.случайное.число.и.сопоставляем.(
exclusive-or
).его.с.нашим.вводом..
Последовательность.случайных.чисел.должна.быть.такой.же,.как.и.при.шифрова- нии.нашего.сообщения,.поэтому.нам.нужно.использовать.такое.же.значение,.как.
и.при.шифровании.
.Функция.
aschar
.преобразует.числовое.значение.в.символ.ASCII.и.выводит.его.
(помните,.что.это.пользовательская.функция,.а.не.bash).
.Параметр.(
-n
).запрашивает.значение.аргумента..Если.оно.не.равно.нулю,.
выполняется.проверка,.соотносится.ли.параметр.
-d
.с.тем.сообщением,.которое.
мы.хотим.расшифровать.(а.не.зашифровать)..Если.результат.положительный.
(то.есть.параметр.
-d
.соотносится.с.сообщением),.тогда.устанавливается.флаг.
для.проверки.
.Этот.параметр.
-d
.отбрасывается.командой.
shift
,.потому.что.первым.аргументом.
(
$1
).становится.следующий.аргумент.(если.он.есть).
.Ключу.переменной.присваивается.первый.аргумент.(если.таковой.имеется)..
Если.аргумент.не.указан,.в.качестве.значения.по.умолчанию.мы.будем.использо- вать.
1776
222 Часть III • Тестирование на проникновение
.Присваивая.значение.
RANDOM
,.мы.устанавливаем.начальное.значение.для.после- довательности.(псевдо-).случайных.чисел,.которые.будут.получены.при.каждой.
ссылке.на.переменную.
.Параметр.
-r
.в.команде.
read
.отключает.специальное.значение.обратного.слеша..
Таким.образом,.если.в.нашем.тексте.встречается.обратный.слеш,.он.просто.вос- принимается.как.обратная.косая.черта,.ничем.не.отличающаяся.от.любого.другого.
символа..Нам.нужно.сохранить.читаемые.нами.начальные.(и.конечные).пробелы.
в.строках..Если.в.команде.
read
.мы.зададим.одно.или.несколько.имен.переменных,.
оболочка.попытается.разобрать.входные.данные.на.слова,.чтобы.назначить.их.
указанным.переменным..Если.имена.переменных.не.будут.заданы,.входные.дан- ные.сохранятся.во.встроенном.ответе.переменной.оболочки..Здесь.самое.главное.
заключается.в.том,.что.строка.не.будет.анализироваться..Поэтому.начальные.и.ко- нечные.пробелы.сохраняются.(кроме.того,.вы.можете.указать.имя.переменной,.но.
это.следует.сделать.перед.чтением.с.
IFS=""
,.чтобы.отменить.любой.разбор.на.слова.
и.сохранить.пробелы).
.Оператор.
if
.проверяет,.установлен.ли.флаг.(если.переменная.содержит.значе- ние),.чтобы.решить,.какую.функцию.вызывать:.
Decrypt
.или.
Ncrypt
..В.любом.слу- чае,.чтобы.сохранить.всю.строку.в.качестве.одного.аргумента,.а.также.сохранить.
любые.пробелы.в.строке.текста.(действительно.необходимые.только.для.случая.
Ncrypt
),.оператор.
if
.передает.только.что.прочитанную.из.stdin.строку,.помещая.
ее.в.кавычки.
Первая.строка.
streamcipher.sh
.использует.значение.
source
.для.включения.внеш- него.кода.из.файла.
askey.sh
..Этот.файл,.как.показано.в.примере.14.8,.содержит.
функции.
aschar
.и.
asnum
Пример 14.8. askey.sh
# функции для преобразования десятичных чисел в ASCII и наоборот
# aschar — печать представления символов ascii
# числа, переданного в качестве аргумента
# example: aschar 65 ==> A
#
function aschar ()
{
local ashex
printf -v ashex '\\x%02x' $1
printf '%b' $ashex
}
# asnum — печатать ascii (десятичное) значение символа,
Глава 14. Обфускация сценария 223
# переданного в качестве значения $1
# пример: asnum A ==> 65
#
function asnum ()
{
printf '%d' "\"$1"
}
Здесь.используются.две.малопонятные.команды.
printf
,.по.одной.для.каждой.
функции.
.Чтобы.не.связываться.с.любыми.переменными.в.сценарии,.который.может.быть.
источником.этого.файла,.начинаем.с.локальной.переменной.
.Этот.вызов.
printf
.принимает.параметр.функции.(
$1
).и.выводит.его.как.шест- надцатеричное.значение.в.формате.
\x
,.где.двухзначное.шестнадцатеричное.число.
имеет.нулевое.заполнение..Первые.два.символа,.обратный.слеш.и.
x
.необходимы.
для.следующего.вызова..Но.эта.строка.в.stdout.не.печатается..Параметр.
-v
.указывает.
printf
.хранить.результат.в.заданной.переменной.оболочки.(мы.указали.
ashex
).
.Теперь.берем.строку.в.
ashex
.и.распечатываем.ее,.используя.формат.
%b
..Этот.фор- мат.указывает.
printf
.печатать.аргумент.как.строку,.но.интерпретировать.любые.
найденные.в.строке.escape-последовательности..Обычно.escape-последовательности.
(например,.
\\n
.для.новой.строки).отображаются.только.в.строке.формата..Если.они.
появляются.в.аргументе,.то.рассматриваются.как.простые.символы..Но.исполь- зование.формата.
%b
.указывает.
printf
.интерпретировать.эти.последовательности.
в.параметре..Например,.первая.и.третья.инструкции.
printf
.здесь.печатают.новую.
строку.(пустую.строку),.тогда.как.вторая.инструкция.будет.печатать.только.два.
обратных.слеша.и.
n
:
printf "\n"
printf "%s" "\n"
printf "%b" "\n"
Используемая.для.функции.
aschar
.escape-последовательность.принимает.шест- надцатеричное.число,.обозначаемое.обратным.слешем.(
\x
).и.двузначным.шестнад- цатеричным.значением,.и.выводит.символ.ASCII,.соответствующий.этому.числу..
Вот.поэтому.мы.взяли.переданное.в.функцию.десятичное.число.и.напечатали.его.
в.переменной.
ashex
.в.формате.этой.escape-последовательности..В.результате.мы.
получим.символ.ASCII.
.Преобразовать.символ.в.число.проще..С.помощью.функции.
.мы.выво- дим.символ.в.виде.десятичного.числа..Функция.
printf
.обычно.выдает.ошибку,.
если.мы.пытаемся.напечатать.строку.в.виде.числа..Добавив.обратный.слеш,.мы.