Файл: Paul Troncone and Carl AlbingCybersecurity Ops with bashAttack, Defend, and Analyze from the.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.01.2024

Просмотров: 452

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Пример 7.7. histogram_plain.sh#!/bin/bash -## Bash и кибербезопасность# histogram_plain.sh## Описание:# Создание горизонтальной гистограммы с указанными данными без использования# ассоциативных массивов, хорошо подходит для старых версий bash## Использование: ./histogram_plain.sh# формат ввода: label value#declare -a RA_key RA_val declare -i max ndx Глава 7. Анализ данных 123max=0maxbar=50 # размер самой длинной строки ndx=0while read labl val do RA_key[$ndx]=$labl  RA_value[$ndx]=$val # сохранить наибольшее значение; для масштабирования (( val > max )) && max=$val let ndx++done# масштабировать и вывести for ((j=0; jdo printf "%-20.20s " ${RA_key[$j]} pr_bar ${RA_value[$j]} $max doneЭта.версия.сценария.позволяет.избежать.использования.ассоциативных.массивов.(например,.в.более.старых.версиях.bash.или.в.системах.macOS)..Здесь.мы.применя- ем.два.отдельных.массива:.один.для.индексного.значения.и.один.—.для.счетчиков..Поскольку.это.обычные.массивы,.мы.должны.использовать.целочисленный.индекс.и.будем.вести.простой.подсчет.в.переменной.ndx.Здесь.имена.переменных.объявляются.как.массивы..Строчная.a.указывает,.что.они.являются.массивами,.но.это.не.ассоциативные.массивы..Это.не.обязательное.требование,.зато.рекомендуемая.практика..Аналогично.в.следующей.строке.мы.за- даем.параметр.-i.для.объявления.этих.переменных.целыми.числами,.что.делает.их.более.эффективными,.чем.необъявленные.переменные.оболочки.(которые.хранятся.в.виде.строк)..Повторимся:.как.видно.из.того,.что.мы.не.объявляем.maxbar,.а.просто.используем.его,.это.необязательное.требование..Пары.«ключ/значение».хранятся.в.отдельных.массивах,.но.в.одном.и.том.же.месте.индекса..Это.ненадежный.подход.—.изменения.в.сценарии.в.какой-то.момент.могут.привести.к.тому,.что.два.массива.не.синхронизируются..Цикл.for,.в.отличие.от.предыдущего.сценария,.используется.для.простого.под- счета.целых.чисел.от.0.до.ndx..Здесь.переменная.j.выступает.препятствием.для.индекса.в.цикле.for.внутри.сценария.pr_bar,.несмотря.на.то.что.внутри.функции.мы.достаточно.аккуратно.объявляем.эту.версию.i.как.локальную.функцию..Вы..до- веряете.этой.функции?.Измените.здесь.j.на.i.и.проверьте,.работает.ли.цикл.(а.он.работает)..Затем.попробуйте.удалить.локальное.объявление.и.проверить,.успеш- но.ли.завершится.цикл. 124 Часть II • Защитные операции с использованием bashТакой.подход.с.двумя.массивами.имеет.одно.преимущество..Используя.числовой.индекс.для.хранения.метки.и.данных,.можно.получить.их.в.том.порядке,.в.котором.они.были.прочитаны.—.в.числовом.порядке.индекса.Теперь,.извлекая.соответствующие.поля.из.access.log.и.перенося.результаты.в.summer.sh,.а.затем.—.в.histogram.sh,.можно.наглядно.увидеть,.какие.хосты.пере- дали.наибольшее.количество.байтов:$ cut -d' ' -f1,10 access.log | bash summer.sh | bash histogram.sh192.168.0.36 ##################################################192.168.0.37 #############################192.168.0.11 #############################192.168.0.14 ################################192.168.0.26 #######Хотя.данный.подход.может.показаться.не.столь.эффективным.для.небольшого.объ- ема.выборочных.данных,.возможность.визуализации.имеет.неоценимое.значение.при.рассмотрении.более.крупных.наборов.данных.Помимо.количества.байтов,.передаваемых.через.IP-адрес.или.хост,.часто.ин- тересно.просмотреть.данные,.отсортированные.по.дате.и.времени..Для.этого.можно.использовать.сценарий.summer.sh,.но.из-за.формата.файла.access.log,.прежде.чем.передать.его.в.сценарий,.его.нужно.дополнительно.обработать..Если.для.извлечения.переданных.полей.с.датой/временем.и.байтов.используется.команда.cut,.остаются.данные,.которые.могут.вызвать.некоторые.проблемы.для.сценария:$ cut -d' ' -f4,10 access.log[12/Nov/2017:15:52:59 2377[12/Nov/2017:15:52:59 4529[12/Nov/2017:15:52:59 1112Как.видно.из.этого.вывода,.необработанные.данные.начинаются.с.символа.[Из-за.него.в.сценарии.появляется.проблема,.так.как.он.обозначает.начало.массива.в.bash..Чтобы.эту.проблему.устранить,.можно.использовать.дополнительную.ите- рацию.команды.cut.с.параметром.-c2,.с.помощью.которого.символ.будет.удален..Этот.параметр.указывает.команде.cut.извлекать.данные.по.символам,.начиная.с.позиции.2.и.переходя.к.концу.строки.(-)..Вот.исправленный.вывод.с.удаленной.квадратной.скобкой:$ cut -d' ' -f4,10 access.log | cut -c2-12/Nov/2017:15:52:59 2377 12/Nov/2017:15:52:59 4529 12/Nov/2017:15:52:59 1112 Глава 7. Анализ данных 125Вместо того чтобы второй раз использовать команду cut, можно добавить команду tr. Параметр -d удаляет указанный символ — в данном случае квадратную скобку.cut -d' ' -f4,10 access.log | tr -d '['Необходимо.также.определить.способ.группирования.данных,.связанных.с.датами:.по.дню,.месяцу,.году,.часу.и.т..д..Для.этого.можно.просто.изменить.параметр.для.второй.итерации.команды.cut..В.табл..7.3.показаны.параметры.команды.cut,.кото- рые.используются.для.извлечения.различных.форм.поля.даты/времени..Обратите.внимание,.что.эти.параметры.предназначены.для.файлов.журнала.Apache.Таблица 7.3. Извлечение поля даты/времени журнала ApacheИзвлечение даты/времени Образец выводаПараметры команды cut Дата/время.12/Nov/2017:19:26:09-c2-Месяц,.день.и.год12/Nov/2017-c2-12,22-Месяц.и.годNov/2017-c5-12,22-Полное.время19:26:04-c14-Час19-c14-15,22-Год2017-c9-12,22-Сценарий.histogram.sh.может.быть.особенно.полезен.при.просмотре.данных,.свя- занных.с.датами..Например,.если.в.организации.имеется.внутренний.веб-сервер,.доступ.к.которому.осуществляется.только.в.рабочее.время.с.09:00.до.17:00,.можно.с.помощью.такой.гистограммы.ежедневно.просматривать.файл.журнала.сервера,.чтобы.проверить,.имеются.ли.всплески.активности.после.обычного.рабочего.дня..Большие.всплески.активности.или.передача.данных.вне.обычного.рабочего.вре- мени.может.свидетельствовать.об.эксфильтрации.со.стороны.злоумышленника..При.обнаружении.каких-либо.аномалий.можно.отфильтровать.данные.по.конкрет- ной.дате.и.времени.и.проверять.доступ.к.странице,.чтобы.определить,.является.ли.действие.вредоносным.Например,.если.требуется.просмотреть.гистограмму.общего.объема.данных,.полу- ченных.в.определенный.день.за.каждый.час,.можно.выполнить.следующую.команду:$ awk '$4 "12/Nov/2017" {print $0}' access.log | cut -d' ' -f4,10 |cut -c14-15,22- | bash summer.sh | bash histogram.sh17 ##16 ###########15 ############19 ##18 ################################################## 126 Часть II • Защитные операции с использованием bashЗдесь.файл.access.log.пересылается.с.помощью.команды.awk.для.извлечения.запи.сей.с.определенной.датой..Обратите.внимание.на.использование.вместо.сим- волов.==.оператора.подобия.(),.поскольку.поле.4.также.содержит.информацию.о.времени..Эти.записи.передаются.команде.cut.сначала.для.извлечения.полей.даты/времени.и.переданных.байтов,.а.затем.для.извлечения.данных.о.времени..После.этого.с.помощью.сценария.summer.sh.данные.суммируются.по.времени.(часам).и.с.помощью.histogram.sh.преобразуются.в.гистограмму..Результатом.ста- новится.гистограмма,.которая.отображает.общее.количество.байтов,.передаваемых.каждый.час.12.ноября.2017.года.Чтобы получить вывод в числовом порядке, передайте его из сценария гистограммы команде sort -n. Зачем нужна сортировка? Сценарии summer.sh и histogram.sh, просматривая список индексов своих ассоциативных массивов, генерируют свои выходные данные. Поэтому их вывод вряд ли будет осмысленным (скорее данные будут выведены в порядке, определяемом внутренним алгоритмом хеширования). Если это объяснение оставило вас равнодушными, просто проигнорируйте его и не забудьте использовать сортировку на выходе.Если вы хотите, чтобы вывод был упорядочен по объему данных, вам нужно будет добавить сортировку между двумя сценариями. Необходимо также использовать histogram_plain.sh — версию сценария гистограммы, в которой не применяются ассоциативные массивы.Поиск уникальности в данныхРанее.IP-адрес.192.168.0.37.был.идентифицирован.как.система,.которая.имела.наибольшее.количество.запросов.страницы..Следующий.логический.вопрос:.ка- кие.страницы.запрашивала.эта.система?.Ответив.на.него,.можно.получить.пред- ставление.о.том,.что.система.делала.на.сервере,.и.классифицировать.это.действие.как.безопасное,.подозрительное.или.вредоносное..Для.этого.можно.использовать.команду.awk.и.cut.и.передать.вывод.в.countem.sh:$ awk '$1 == "192.168.0.37" {print $0}' access.log | cut -d' ' -f7 |bash countem.sh | sort -rn | head -5 14 /files/theme/plugin49c2.js?1490908488 14 /files/theme/mobile49c2.js?1490908488 14 /files/theme/custom49c2.js?1490908488 14 /files/main_styleaf0e.css?1509483497 3 /consulting.htmlХотя.извлечение.и.обрезка.данных.могут.быть.реализованы.путем.конвейерной.передачи.команд.и.сценариев,.для.этого.потребуется.передавать.данные.несколько.раз..Такой.метод.можно.применить.ко.многим.наборам.данных,.но.он.не.подходит. Глава 7. Анализ данных 127для.очень.больших.наборов..Метод.можно.оптимизировать,.написав.сценарий.bash,.специально.разработанный.для.извлечения.и.подсчета.количества.доступов.к.страницам,.—.для.этого.требуется.только.один.проход.данных..В.примере.7.8.по- казан.такой.сценарий.Пример 7.8. pagereq.sh# Bash и кибербезопасность# pagereq.sh## Описание:# Подсчет с помощью bash количества запросов страниц для данного IP-адреса## Использование:# pagereq < inputfile# IP-адрес для поиска#declare -A cnt while read addr d1 d2 datim gmtoff getr page therest do if [[ $1 == $addr ]] ; then let cnt[$page]+=1 ; fi done for id in ${!cnt[@]} do printf "%8d %s\n" ${cnt[$id]} $id done.Мы.объявляем.cnt.как.ассоциативный.массив.и.в.качестве.индекса.можем.ис- пользовать.строку..В.данной.программе.в.качестве.индекса.мы.будем.использовать.адрес.страницы.(URL)..${!cnt[@]}.выводит.список.всех.значений.индекса,.которые.были.обнаружены..Обратите.внимание:.они.не.будут.перечислены.в.удобном.порядке.В.ранних.версиях.bash.ассоциативных.массивов.нет..Подсчитать.количество.раз- личных.запросов.страниц.с.определенного.IP-адреса.вы.можете.с.помощью.коман- ды.awk,.потому.что.в.ней.есть.ассоциативные.массивы.(пример.7.9).Пример 7.9. pageref.awk# Bash и кибербезопасность# pagereq.awk## Описание:# Подсчет количества запросов страниц для данного IP-адреса с помощью awk## Использование:# pagereq < inputfile# IP-адрес для поиска# 128 Часть II • Защитные операции с использованием bash# подсчитать количество запросов страниц с адреса ($1)awk -v page="$1" '{ if ($1==page) {cnt[$7]+=1 } } END { for (id in cnt) {  printf "%8d %s\n", cnt[id], id }}'.В.этой.строке.есть.две.переменные.$1,.разница.между.которыми.очень.большая..Первая.переменная.$1.является.переменной.оболочки.и.ссылается.на.первый.аргумент,.предоставленный.этому.сценарию.при.его.вызове..Вторая.переменная.$1.—.это.awk..В.каждой.строке.эта.переменная.относится.к.первому.полю.ввода..Первая.переменная.$1.была.назначена.странице.переменной.awk,.чтобы.ее.можно.было.сравнить.с.каждой.переменной.$1awk.(то.есть.с.каждым.первым.полем.вход- ных.данных)..Простой.синтаксис.приводит.к.тому,.что.переменная.id.перебирает.значения.индекса.в.массиве.cnt..Это.гораздо.более.простой.синтаксис,.чем.синтаксис.обо- лочки."${!cnt[@]}",.но.такой.же.эффективный.Можно.запустить.сценарий.pagereq.sh,.указав.IP-адрес,.который.требуется.найти.и.перенаправить.access.log.в.качестве.входных.данных:$ bash pagereq.sh 192.168.0.37 < access.log | sort -rn | head -5 14 /files/theme/plugin49c2.js?1490908488 14 /files/theme/mobile49c2.js?1490908488 14 /files/theme/custom49c2.js?1490908488 14 /files/main_styleaf0e.css?1509483497 3 /consulting.htmlВыявление аномалий в данныхВ.Интернете.строка агента пользователя.представляет.собой.небольшой.фраг- мент.текстовой.информации,.отправляемый.браузером.на.веб-сервер,.который.идентифицирует.операционную.систему.клиента,.тип.браузера,.версию.и.другую.информацию..Обычно.используется.веб-серверами.для.обеспечения.совместимости.страниц.с.браузером.пользователя..Вот.пример.такой.строки:Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0Эта.строка.идентифицирует.систему.как.Windows.NT.версии.6.3.(она.же.Windows.8.1).с.64-разрядной.архитектурой.и.с.браузером.Firefox.Строка.агента.пользователя.может.нас.заинтересовать.по.двум.причинам..Во- первых,.значительный.объем.информации,.которую.эта.строка.передает,.можно.применять.для.идентификации.типов.систем.и.браузеров,.обращающихся.к.сер- Глава 7. Анализ данных 129веру..Во-вторых,.эта.строка.настраивается.конечным.пользователем.и.может.быть.использована.для.идентификации.систем,.в.которых.не.установлен.стандартный.браузер.или.вообще.нет.браузера.(то.есть.поисковых.роботов.(web.crawler)).Вы.можете.определить.необычные.пользовательские.агенты,.предварительно.со- ставив.список.известных.безопасных.пользовательских.агентов..Для.этого.упраж- нения.мы.используем.очень.маленький.список.браузеров,.которые.не.являются.специфичными.для.конкретной.версии.(пример.7.10).Пример 7.10. useragents.txtFirefoxChromeSafariEdgeСписок популярных пользовательских агентов можно найти по адресу http://bit.ly/2WugjXl.Затем.вы.можете.прочитать.журнал.веб-сервера.и.сравнить.каждую.строку.со.списком.популярных.пользовательских.агентов.(браузеров),.пока.не.будет.по- лучено.совпадение..Если.совпадения.не.будет,.строка.должна.рассматриваться.как.аномалия.и.печататься.в.стандартном.выводе.вместе.с.IP-адресом.системы,.выполняющей.запрос..Такое.сравнение.дает.нам.дополнительную.информацию,.связанную.с.рассматриваемыми.данными,.—.с.ее.помощью.мы.сможем.идентифи- цировать.систему.с.необычным.пользовательским.агентом.и.получим.еще.один.путь.для.дальнейшего.изучения.Пример 7.11. useragents.sh#!/bin/bash -## Bash и кибербезопасность# useragents.sh## Описание:# Чтение журнала и поиск неизвестных пользовательских агентов## Использование: ./useragents.sh < # Журнал веб-сервера Apache## несовпадение — поиск по массиву известных имен# возвращает 1 (false), если совпадение найдено# возвращает 0 (true), если совпадений нет 130 Часть II • Защитные операции с использованием bash function mismatch () { local -i i  for ((i=0; i<$KNSIZE; i++)) do [[ "$1" = .*${KNOWN[$i]}.* ]] && return 1  done return 0}readarray -t KNOWN < "useragents.txt" KNSIZE=${#KNOWN[@]} # предварительная обработка лог-файла (stdin),# чтобы выбрать IP-адреса и пользовательские агенты awk -F'"' '{print $1, $6}' | \while read ipaddr dash1 dash2 dtstamp delta useragent do if mismatch "$useragent" then echo "anomaly: $ipaddr $useragent" fi done.Сценарий.будет.основан.на.функции.несовпадения..Если.обнаружится.несоот- ветствие,.будет.возвращено.значение.success.или.true..Это.значит,.что.совпадение.со.списком.известных.пользовательских.агентов.не.найдено..Данная.логика.может.показаться.нестандартной,.но.так.удобнее.читать.оператор.if,.содержащий.вызов.mismatch.Объявление.нашего.цикла.for.в.качестве.локальной.переменной.—.хорошая.идея..Данный.шаг.в.сценарии.не.является.обязательным..Здесь.представлены.две.строки.для.сравнения:.входные.данные.из.файла.журна- ла.и.строка.из.списка.известных.пользовательских.агентов..Для.гибкого.сравнения.используется.оператор.сравнения.регулярных.выражений.(the=)..Значение..*(ноль.или.более.вхождений.любого.символа),.размещенное.по.обе.стороны.ссылки.массива.$KNOWN,.говорит.о.том,.что.совпадение.известной.строки.может.быть.най- дено.в.любом.месте.другой.строки..Каждая.строка.файла.добавляется.как.элемент.к.указанному.имени.массива..Это.дает.нам.массив.известных.пользовательских.агентов..В.bash.существует.два.способа.добавить.строки.к.массиву:.использовать.либо.readarray,.как.сделано.в.этом.примере,.либо.mapfile..Опция.-t.удаляет.завершающий.символ.новой.строки.из.каждой.прочитанной.строки..Здесь.указан.файл,.содержащий.список.известных.пользовательских.агентов;.при.необходимости.его.можно.изменить. Глава 7. Анализ данных 131.Здесь.вычисляется.размер.массива..Полученное.значение.используется.внутри.функции.mismatch.для.циклического.перебора.массива..Вне.нашего.цикла.мы.вы- числяем.его.один.раз,.чтобы.при.каждом.вызове.функции.избежать.повторного.вычисления..Входная.строка.представляет.собой.сложное.сочетание.слов.и.кавычек..Чтобы.захватить.строку.агента.пользователя,.в.качестве.разделителя.полей.мы.указы- ваем.двойные.кавычки..Однако.это.означает,.что.наше.первое.поле.содержит.больше.чем.просто.IP-адрес..Используя.команду.read.для.получения.IP-адреса,.мы.можем.проанализировать.пробелы..Последний.аргумент.read.принимает.все.оставшиеся.слова,.чтобы.можно.было.захватить.все.слова.строки.пользователь- ского.агента.При.запуске.сценария.useragents.sh.будут.выведены.любые.строки.пользователь- ского.агента,.не.найденные.в.файле.useragents.txt:$ bash useragents.sh < access.log anomaly: 192.168.0.36 Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)anomaly: 192.168.0.36 Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)anomaly: 192.168.0.36 Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)anomaly: 192.168.0.36 Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)anomaly: 192.168.0.36 Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)ВыводыВ.этой.главе.мы.рассмотрели.методы.статистического.анализа.для.выявления.необычной.и.аномальной.активности.в.файлах.журналов..Такой.анализ.даст.вам.представление.о.том,.что.происходило.ранее..В.следующей.главе.мы.рассмотрим,.как.анализировать.файлы.журналов.и.другие.данные,.чтобы.понять,.что.происходит.в.системе.в.режиме.реального.времени.Упражнения1.. В.следующем.примере.для.печати.первого.и.десятого.полей.файла.access.log используется.команда.cut:$ cut -d' ' -f1,10 access.log | bash summer.sh | sort -k 2.1 -rn 1   ...   8   9   10   11   12   13   14   15   ...   23

162 Часть II • Защитные операции с использованием bashСимвол.>.определяет.строки,.уникальные.для.filelist.txt,.которые.в.этом.случае.будут.именами.добавленных.файлов..Символ.<.показывает.строки,.находящиеся.только.в.первом.файле.(baseline.txt),.которые.в.данном.случае.являются.именами.удаленных.файлов..Символ.|.обозначает.строки,.отличающиеся.в.двух.файлах..Это.может.быть.переименованный.файл..Возможно,.один.файл.был.удален.и.в.эту.позицию.был.добавлен.новый.файл.Шаг 3. Автоматизация и уведомлениеВы.можете.автоматизировать.предыдущие.процессы,.позволяющие.собрать.и.про- верить.базовые.показатели.системы,.чтобы.с.помощью.bash.сделать.их.более.эф- фективными.и.полнофункциональными..Вывод.этого.сценария.bash.представлен.в.формате.XML.и.содержит.следующие.теги:..(который.будет.иметь.атрибуты.host.и.dir),.,.,..и...Тег.будет.иметь.атрибут.orig,.чтобы.можно.было.указать.предыдущее.местоположение.файла.(пример.10.3).Пример 10.3. baseline.sh#!/bin/bash -## Bash и кибербезопасность# baseline.sh## Описание:# Создает базовый файл или сравнивает текущее состояние# файловой системы с предыдущим базовым файлом## Использование: ./baseline.sh [-d path] []# -d Стартовый каталог для базового файла# Если указан только один файл, создать новый базовый файл# [] Предыдущий базовый файл для сравнения#function usageErr (){ echo 'usage: baseline.sh [-d path] file1 [file2]' echo 'creates or compares a baseline from path' echo 'default for path is /' exit 2} >&2 function dosumming (){ Глава 10. Инструмент: контроль файловой системы 163 find "${DIR[@]}" -type f | xargs -d '\n' sha1sum }function parseArgs (){ while getopts "d:" MYOPT  do # не проверяется MYOPT, так как существует только один вариант DIR+=( "$OPTARG" )  done shift $((OPTIND-1))  # нет аргументов? слишком много? (( $# == 0 || $# > 2 )) && usageErr (( ${#DIR[*]} == 0 )) && DIR=( "/" ) }declare -a DIR# создайте базовый файл (предоставляется только одно имя файла)# либо сделайте вторичные краткие выводы (при наличии двух имен файлов)parseArgsBASE="$1"B2ND="$2"if (( $# == 1 )) # только один аргумент then # создание "$BASE" dosumming > "$BASE" # все сделано для базового файла exit fi if [[ ! -r "$BASE" ]]then usageErr fi# если второй файл существует, сравнить оба файла# иначе создать/заполнить его if [[ ! -e "$B2ND" ]]then echo creating "$B2ND" dosumming > "$B2ND"fi 164 Часть II • Защитные операции с использованием bash# что мы имеем: создано два файла sha1sum declare -A BYPATH BYHASH INUSE # ассоциативные массивы# в качестве базового загрузите первый файл while read HNUM FNdo BYPATH["$FN"]=$HNUM BYHASH[$HNUM]="$FN" INUSE["$FN"]="X"done < "$BASE"# ------ теперь начинаем вывод# смотрим, есть ли каждое имя файла, указанное во втором файле,# по такому же месторасположению (пути), что и в первом (базовом файле)printf '\n' "$HOSTNAME" "${DIR[*]}"while read HNUM FN do WASHASH="${BYPATH[${FN}]}" # нашел ли он его? если нет, то это будет null if [[ -z $WASHASH ]] then ALTFN="${BYHASH[$HNUM]}" if [[ -z $ALTFN ]] then printf ' %s\n' "$FN" else printf ' %s\n' "$ALTFN" "$FN" INUSE["$ALTFN"]='_' # пометить как просмотренное fi else INUSE["$FN"]='_' # пометить как просмотренное if [[ $HNUM == $WASHASH ]] then continue; # ничего не изменилось; else printf ' %s\n' "$FN" fi fi done < "$B2ND" for FN in "${!INUSE[@]}"do if [[ "${INUSE[$FN]}" == 'X' ]] then printf ' %s\n' "$FN" fi done printf '\n' Глава 10. Инструмент: контроль файловой системы 165.В.этой.функции.весь.вывод.stdout.перенаправляется.в.stderr..Таким.образом,.нам.не.нужно.задавать.перенаправление.для.каждого.оператора.echo..Мы.отправляем.вывод.в.stderr,.потому.что.это.не.предполагаемый.вывод.программы,.а.просто.со- общения.об.ошибках..Данная.функция.выполняет.основную.работу.по.созданию.sha1sum.для.всех.фай- лов.в.указанных.каталогах..Программа.xargs.выведет.столько.имен.файлов,.сколько.может.поместиться.в.командной.строке.команды.sha1sum..Это.позволяет.избежать.необходимости.каждый.раз.отдельно.вызывать.sha1sum.для.каждого.файла.(вызов.sha1sum.для.всех.файлов.сильно.замедлит.работу.программы)..Вместо.этого.при.каждом.вызове.sha1sum.обрабатывает.1000.или.более.имен.файлов..Для.поиска.параметра.-d.со.связанным.с.ним.аргументом.(обозначенным.:).ис- пользуем.встроенный.цикл.getopts..Для.получения.дополнительной.информации.о.getopts.см..пример.5.4..Поскольку.нам.требуется.разрешить.указывать.несколько.каталогов,.мы.добав- ляем.каждый.каталог.в.массив.DIR.После.завершения.цикла.getopts.нам.нужно.настроить.количество.аргументов..Чтобы.избавиться.от.аргументов,.которые.были.«использованы».getopts,.при- меняем.shift.Если.каталоги.не.указаны,.то.по.умолчанию.данные.расположены.в.корне.фай- ловой.системы..Если.для.выполнения.данной.операции.ваших.прав.доступа.будет.достаточно,.все.файлы.окажутся.в.файловой.системе..Эта.строка.считывает.значение.хеша.и.имя.файла..Но.откуда.эти.данные.считы- ваются,.если.нет.конвейера.команд,.передающих.данные.на.чтение?.Ответ.можно.найти.в.конце.цикла.while.Вот.ответ,.указывающий.на.источник.данных..Помещая.перенаправление.в.оператор.while/do/done,.вы.в.этом.цикле.перенаправляете.все.операторы.в.stdin.(в.данном.случае)..Для.нашего.сценария.это.означает,.что.оператор.read.получает.входные.данные.из.файла,.указанного.в.$B2NDВот.результат.выполнения.примера:$ bash baseline.sh -d . baseline.txt baseln2.txt  ./analyze/Project1/fd2.bck  ./analyze/Project1/farm2.sh  ./caveat.sample.ch  ./x.x  166 Часть II • Защитные операции с использованием bash.Этот.тег.определяет.хост.и.относительный.путь..Данный.тег.идентифицирует.новый.файл,.созданный.после.созания.исходного.базового.файла..Данный.файл.после.создания.базового.файла.был.перемещен.в.новое.место..После.создания.базового.файла.содержимое.файла.изменилось..После.создания.базового.файла.этот.файл.был.удален.ВыводыСоздание.базового.файла.и.периодическая.его.проверка.—.это.эффективный.способ.выявления.подозрительного.поведения.в.ваших.системах..Это.особенно.полезно.для.систем,.состояние.которых.редко.изменяется.В.следующей.главе.мы.подробнее.разберем,.как.использовать.командную.строку.и.bash.для.анализа.отдельных.файлов,.чтобы.определить,.являются.ли.они.вредо- носными.Упражнения1.. Улучшите.для.baseline.sh.пользовательский.интерфейс,.предотвратив.случай- ную.перезапись.базового.файла..Как?.Если.пользователь.указывает.только.один.файл,.проверьте,.существует.ли.этот.файл..Если.это.так,.спросите.пользователя,.можно.ли.перезаписать.файл,.и.в.зависимости.от.ответа.выберите.один.из.ва- риантов:.продолжить.или.выйти.2.. Измените.сценарий.baseline.sh.следующим.образом:.напишите.функцию.обо- лочки.для.преобразования.записей.в.массиве.DIR.в.абсолютные.пути..Вызовите.эту.функцию.непосредственно.перед.печатью.XML,.чтобы.тег.filesystem в.атрибуте.dir.перечислял.абсолютные.пути.3.. Измените.сценарий.baseline.sh.следующим.образом:.для.тега.relocated.про- верьте,.находятся.ли.исходный.и.перемещенный.файл.в.одном.каталоге.(то.есть.имеют.одно.и.то.же.имя.каталога);.если.это.так,.выведите.только.basename в.атрибуте.orig=""..Например,.то,.что.печаталось.так:./ProjectAA/farm2.shбудет.выводиться.таким.образом:./ProjectAA/farm2.sh Глава 10. Инструмент: контроль файловой системы 1674.. Как.можно.изменить.сценарий.baseline.sh,.чтобы.для.ускорения.его.работы.запустить.параллельные.друг.другу.процессы?.Реализуйте.свои.идеи.для.парал- лельного.запуска.процессов.сценария.baseline.sh,.которые.позволят.повысить.производительность..Если.поместить.часть.сценария.в.фоновый.режим,.как.перед.продолжением.работы.выполнить.повторную.синхронизацию?.Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.зайдите.на.сайт.https://www.rapidcyberops.com/ 11Анализ вредоносных программОбнаружение.вредоносного.кода.—.это.основное.и.самое.сложное.действие.при.обеспечении.кибербезопасности..При.анализе.фрагмента.кода.вы.можете.исполь- зовать.два.основных.варианта:.статический.и.динамический..Во.время.статического.анализа.вы.анализируете.сам.код,.чтобы.определить,.существуют.ли.признаки.вре- доносной.активности..Во.время.динамического.анализа.вы.выполняете.код,.а.затем.смотрите,.что.он.делает.и.как.влияет.на.систему..В.этой.главе.мы.сосредоточимся.на.методах.статического.анализа.При работе с потенциально вредоносными файлами обязательно выполните анализ системы, не подключенной к сети и не содержащей конфиденциальной информации. После этого предположите, что система заражена, и, прежде чем вводить ее обратно в сеть, полностью очистите и восстановите систему.Используемые командыВ.этой.главе.мы.рассмотрим.команду.curl,.которая.позволяет.взаимодействовать.с.сайтами,.команду.vi.для.редактирования.файлов.и.команду.xxd.для.выполнения.базовых.преобразований.и.анализа.файлов.curlКоманду.curl.можно.использовать.для.передачи.данных.по.сети.между.клиентом.и.сервером..Команда.поддерживает.несколько.протоколов,.включая.HTTP,.HTTPS,.FTP,.SFTP.и.Telnet..Это.универсальная.команда..Представленные.ниже.параме- тры.предлагают.лишь.небольшую.часть.доступных.возможностей..Для.получения.дополнительной.информации.относительно.этой.команды.не.забудьте.посетить.соответствующую.страницу.руководства.Linux. Глава 11. Анализ вредоносных программ 169Общие параметры команды‰‰ -А.—.для.отправки.на.сервер.указать.строку.агента.пользователя.HTTP.‰‰ -d.—.данные.для.отправки.с.запросом.HTTP.POST.‰‰ -G.—.использовать.для.отправки.данных.запрос.HTTP.GET,.а.не.POST.‰‰ -I.—.получить.только.заголовок.протокола.(HTTP,.FTP).‰‰ -L.—.следовать.за.перенаправлениями.‰‰ -s.—.не.показывать.индикатор.выполнения.или.сообщения.об.ошибках.Пример командыЧтобы.получить.стандартную.веб-страницу,.в.качестве.первого.аргумента.нужно.передать.только.URL-адрес..По.умолчанию.curl.отображает.содержимое.веб- страницы.в.стандартном.режиме..Вы.можете.перенаправить.вывод.в.файл,.исполь- зуя.перенаправление.и.параметр.-o:curl https://www.digadel.comНе знаете, куда указывает потенциально опасный сокращенный URL? Разверните его с помощью curl:curl -ILs http://bitly.com/1k5eYPw | grep '^Location:'viКоманда.vi.—.это.не.типичная.команда,.а.полнофункциональный.текстовый.редактор.командной.строки..Он.обладает.широкими.возможностями.и.даже.под- держивает.плагины.Пример командыЧтобы.открыть.файл.somefile.txt.в.vi,.выполните.команду:vi somefile.txtНаходясь.в.среде.vi,.нажмите.клавишу.Esc,.а.затем,.чтобы.войти.в.режим.вставки.и.отредактировать.текст,.введите.i..Для.выхода.из.режима.вставки.нажмите.EscДля.перехода.в.командный.режим.нажмите.клавишу.Esc..Вы.можете.ввести.одну.из.команд,.приведенных.в.табл..11.1,.и,.чтобы.она.вступила.в.силу,.нажать.кла- вишу.Enter 170 Часть II • Защитные операции с использованием bashТаблица 11.1. Общие команды viКомандаНазначениеbОдно.слово.назад ccЗаменить.текущую.строку cwЗаменить.текущее.слово dwУдалить.текущее.слово ddУдалить.текущую.строку:wЗаписать/сохранить.файл:w.filenameЗаписать/сохранить.файл.с.именем.filename:q!Выйти.без.сохраненияZZСохранить.и.выйти:set.numberПоказать.номера.строк/Поиск.вперед?Поиск.в.обратном.направлении nНайти.следующее.вхождениеПолный.обзор.vi.выходит.за.рамки.этой.книги..Для.получения.дополнительной.информации.вы.можете.посетить.страницу.редактора.Vim.(https://www.vim.org/).xxdКоманда.xxd.выводит.на.экран.файл.в.двоичном.или.шестнадцатеричном.формате.Общие параметры команды‰‰ -b.—.отобразить.файл.с.использованием.двоичного,.а.не.шестнадцатеричного.формата.‰‰ -l.—.вывести.количество.байт.двоичного.или.шестнадцатеричного.файла.‰‰ -s.—.начать.печать.с.позиции.байта.n.Пример командыДля.отображения.файла.somefile.txt.начать.печать.с.35-го.байта.и.распечатать.следующие.50.байт:xxd -s 35 -l 50 somefile.txt Глава 11. Анализ вредоносных программ 171Реверс-инжинирингПодробности.того,.как.выполнить.реверс-инжиниринг.(reverse-engineering).дво- ичного.кода,.выходят.за.рамки.этой.книги..Тем.не.менее.мы.рассмотрим,.как.ис- пользовать.стандартную.командную.строку.для.проведения.реверс-инжиниринга..Описанные.методы.анализа.с.помощью.командной.строки.не.заменяют.такие.ин- струменты,.как.IDA.Pro.или.OllyDbg;.они.скорее.предназначены.для.расширения.возможностей.этих.инструментов.или.для.предоставления.некоторого.недоступ- ного.ранее.функционала.Подробную информацию об анализе вредоносных программ см. в книге «Вскрытие покажет! Практический анализ вредоносного ПО» Майкла Сикорски и Эндрю Хо- нига (Питер, 2018). Дополнительную информацию о компании IDA Pro вы найдете в книге Криса Игла (Chris Eagle) The IDA Pro Book (No Starch Press).Шестнадцатеричные, десятичные, двоичные и ASCII-преобразованияПри.анализе.файлов.важно.иметь.возможность.их.простого.перекодирования.из.десятичного.формата.в.шестнадцатеричный.или.ASCII.и.наоборот..К.счастью,.это.можно.легко.сделать.из.командной.строки..Например,.возьмем.шестнадцатерич- ное.значение.0x41..Можно.использовать.команду.printf.для.его.преобразования.в.десятичный.формат.с.помощью.строки.формата."%d":$ printf "%d" 0x41 65Чтобы.преобразовать.десятичное.число.обратно.в.шестнадцатеричное,.замените.символы,.определяющие.формат,.на.%x:$ printf "%x" 65 41Чтобы.преобразовать.из.ASCII.в.шестнадцатеричный,.можно.передать.символ.из.команды.printf.в.команду.xxd:$ printf 'A' | xxd00000000: 41 172 Часть II • Защитные операции с использованием bashДля.преобразования.шестнадцатеричного.кода.в.ASCII.используйте.команду.xxd с.параметром.-r:$ printf 0x41 | xxd –rAЧтобы.преобразовать.из.ASCII.в.двоичный.код,.вы.можете.передать.символ.в.xxd и.использовать.параметр.-b:$ printf 'A' | xxd –b00000000: 01000001В показанных примерах вместо команды echo умышленно используется команда printf. Это объясняется тем, что команда echo автоматически добавляет в вывод лишний символ. Его можно увидеть здесь:$ echo 'A' | xxd00000000: 410aДалее.рассмотрим.команду.xxd.и.способы.ее.использования.для.анализа.файла..Для.примера.проанализируем.исполняемый.файл.Анализ с помощью xxdДля.изучения.функциональности.команды.xxd.возьмем.исполняемый.файл.helloworldИсходный.код.показан.в.примере.11.1..Файл.helloworld.компилируется.для.Linux.в.Executable.and.Linkable.Format.(ELF).—.формат.исполняемых.и.компонуемых.моду- лей..Компиляция.производится.с.помощью.компилятора.GNU.C.Compiler.(GCC).Пример 11.1. helloworld.c#include int main(){ printf("Hello World!\n"); return 0;}Команда.xxd.может.использоваться.для.проверки.любой.части.исполняемого.файла..В.качестве.примера.можно.посмотреть.магическое.число.файла,.которое.начинается.с.позиции.0x00.и.имеет.размер.4.байта..Чтобы.выбрать.начальную.позицию,.используйте.параметр.-s.(если.формат.файла.десятичный)..Для.опре- Глава 11. Анализ вредоносных программ 173деления.количества.возвращаемых.байтов.добавьте.параметр.-l.(для.десятичного.формата)..Начальную.позицию.и.длину.также.можно.указать.в.шестнадцатеричном.формате,.добавив.к.числу.символы.0x.(то.есть.0x2A)..Как.и.ожидалось,.мы.увидели.магическое.число.ELF:$ xxd -s 0 -l 4 helloworld00000000: 7f45 4c46 .ELFПятый.байт.файла.покажет.вам.архитектуру.этого.файла:.является.ли.он.32-раз- рядным.(0x01).или.64-разрядным.(0x02).исполняемым.файлом..В.данном.случае.это.64-разрядный.исполняемый.файл:$ xxd -s 4 -l 1 helloworld00000004: 02Шестой.байт.описывает.порядок.записи.байтов:.little-endian.(от.младшего.к.стар- шему).(0x01).или.big-endian.(от.старшего.к.младшему).(0x02)..В.данном.случае.порядок.записи.байтов.little-endian:$ xxd -s 5 -l 1 helloworld00000005: 01Формат.и.порядок.байтов.—.важная.информация,.используемая.для.анализа.остальной.части.файла..Например,.8.байт.64-битного.файла.ELF,.начинающихся.с.0x20,.определяют.заголовок.программы:$ xxd -s 0x20 -l 8 helloworld00000020: 4000 0000 0000 0000Нам.уже.известно,.что.порядок.записи.нашего.файла.—.little-endian,.поэтому.за- головок.начинается.с.0x40.Эти.данные.мы.можем.использовать.для.отображения.заголовка.программы,.длина.которого.для.64-битного.ELF-файла.должна.составлять.0x38.байт:$ xxd -s 0x40 -l 0x38 helloworld00000040: 0600 0000 0500 0000 4000 0000 0000 0000 ........@.......00000050: 4000 4000 0000 0000 4000 4000 0000 0000 @.@.....@.@.....00000060: f801 0000 0000 0000 f801 0000 0000 0000 ................00000070: 0800 0000 0000 0000Дополнительные.сведения.о.формате.файла.Linux.ELF.можно.найти.в.специфика- ции.Tool.Interface.Standard.(TIS).и.Executable.and.Linking.Format.(ELF).по.адресу.http://bit.ly/2HVOMu7 174 Часть II • Защитные операции с использованием bashДля.получения.дополнительной.информации.о.формате.исполняемых.файлов.Windows.см..документацию.формата.переносимых.исполняемых.файлов.Microsoft:.http://bit.ly/2FDm67sHex-редактор..Иногда.вам.может.потребоваться.отобразить.и.отредактировать.файл.в.шестнадцатеричном.формате..Для.этого.следует.использовать.команду.xxd при.работе.с.редактором.vi..Сначала,.как.обычно,.в.vi.откройте.файл,.который.хотите.отредактировать:vi helloworldОткрыв.файл,.введите.следующую.команду::%!xxdВ.vi.символ.%.представляет.диапазон.адресов.всего.файла,.а.символ.!.можно.ис- пользовать.для.выполнения.команды.оболочки,.заменяя.исходные.строки.выводом.команды..Объединение.этих.двух.символов,.как.показано.в.предыдущей.команде.(:%!xxd),.вызовет.текущий.файл.через.xxd.(или.любую.команду.оболочки).и.оста- вит.результаты.в.vi:00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............00000010: 0200 3e00 0100 0000 3004 4000 0000 0000 ..>.....0.@.....00000020: 4000 0000 0000 0000 efbf bd19 0000 0000 @...............00000030: 0000 0000 0000 4000 3800 0900 4000 1f00 ......@.8...@...00000040: 1c00 0600 0000 0500 0000 4000 0000 0000 ..........@.....После.внесения.изменений.можно.вернуть.файл.в.обычное.состояние.с.помощью.команды.vi:%!xxd-r..По.завершении.запишите.внесенные.изменения.(ZZ)..Конеч- но,.в.любой.момент.можно.просто.выйти.без.записи.внесенных.изменений.(:q!).Чтобы преобразовать загруженный в vi файл в стандарт кодирования Base64, вве- дите :%!Base64. Чтобы преобразовать из Base64 обратно, введите :%!Base64 -d.Извлечение строкОдин.из.основных.методов.анализа.неизвестного.исполняемого.файла.—.извлече- ние.всех.содержащихся.в.файле.строк.ASCII..Из.этих.строк.мы.можем.получить.такие.данные,.как.имена.файлов,.пути,.IP-адреса,.имена.авторов,.информацию. Глава 11. Анализ вредоносных программ 175о.компиляторе,.URL-адреса.и.другую.ценную.информацию.о.функциональности.или.происхождении.программы.Команда.strings.может.извлекать.для.нас.данные.ASCII,.но.по.умолчанию.она.недоступна.для.многих.дистрибутивов,.включая.Git.Bash..Чтобы.решить.эту.про- блему,.можно.воспользоваться.хорошей.командой.egrep:egrep -a -o '\b[[:print:]]{2,}\b' somefile.exeЭто.регулярное.выражение.выполняет.поиск.в.указанном.файле.двух.или.более.(здесь.конструкция.{2,}).печатаемых.символов.в.строке,.которые.отображаются.как.непрерывное.слово..С.помощью.параметра.-а.двоичный.исполняемый.файл.обрабатывается.как.текстовый..Параметр.-o.выводит.только.соответствующий.текст,.а.не.всю.строку,.тем.самым.устраняя.любые.непечатаемые.двоичные.дан- ные..Поиск.осуществляется.по.двум.или.более.символам,.поскольку.одиночные.символы.вполне.вероятны.в.любом.двоичном.байте.и,.таким.образом,.не.являются.значимыми.Чтобы.сделать.вывод.еще.более.чистым,.можно.с.помощью.параметра.-u.отсорти- ровать.результаты,.удалив.при.этом.все.дубликаты:egrep -a -o '\b[[:print:]]{2,}\b' somefile.exe | sort -uВозможно,.было.бы.полезно.отсортировать.строки.по.размеру,.от.самых.длинных.до.самых.коротких,.так.как.наиболее.длинные.строки.чаще.содержат.интересную.информацию..В.исходном.виде.команда.sort.не.предоставляет.возможности.для.выполнения.этой.задачи..В.дополнение.вместе.с.ней.можно.использовать.команду.awk:egrep -a -o '\b[[:print:]]{2,}\b' somefile.exe | awk '{print length(), $0}' | sort -rnuВ.данном.случае.вы.сначала.отправляете.вывод.egrep.в.awk,.чтобы.увеличить.длину,.добавив.символы.в.начале.каждой.строки..Затем.этот.вывод.сортируется.в.обрат- ном.порядке,.а.дубликаты.удаляются.Метод.извлечения.строк.из.исполняемого.файла.имеет.свои.ограничения..Если.стро- ка.не.является.непрерывной,.то.есть.непечатаемые.символы.находятся.между.печатаемыми.символами,.разделяя.их,.то.будет.выводиться.набор.отдельных.сим- волов,.а.не.целая.строка..Иногда.это.просто.артефакт,.полученный.при.создании.исполняемого.файла..Но.разработчики.вредоносных.программ.могут.специально.добавить.непечатаемые.символы,.чтобы.избежать.обнаружения..Для.аналогичной.маскировки.существования.строк.в.двоичном.файле.они.также.могут.использовать.кодировку.или.шифрование. 176 Часть II • Защитные операции с использованием bashВзаимодействие с VirusTotalVirusTotal.—.это.коммерческий.онлайн-инструмент,.который.используется.для.выгрузки.файлов.и.проверки.их.множеством.антивирусных.движков.и.дру- гих.инструментов.статического.анализа,.чтобы.определить,.являются.ли.эти.файлы.вредоносными..VirusTotal.также.может.предоставить.информацию.о.том,.как.часто.конкретный.файл.встречался.и.был.ли.он.ранее.определен.как.вре- доносный..Это.называется.репутацией.файла..Если.файл.ранее.не.встречался.и.поэтому.имеет.низкую.репутацию,.существует.большая.вероятность,.что.он.вредоносный.Будьте осторожны при выгрузке файлов в VirusTotal и подобные сервисы. По- скольку они содержат базы данных всех загруженных файлов, файлы с по- тенциально конфиденциальной или привилегированной информацией никогда не должны загружаться в эти сервисы. Кроме того, при определенных обстоя- тельствах загрузка вредоносных файлов в общедоступные хранилища может предупредить противника о том, что вы определили его присутствие в вашей системе.VirusTotal.предоставляет.API.(интерфейс.прикладного.программирования),.который.с.помощью.curl.можно.использовать.для.взаимодействия.с.сервисом..Для.применения.API.необходимо.иметь.уникальный.ключ..Чтобы.его.получить,.перейдите.на.сайт.VirusTotal.(https://www.virustotal.com/).и.запросите.учетную.запись..После.ее.создания.войдите.в.систему.и.перейдите.в.настройки.учетной.записи,.что- бы.просмотреть.ключ.API..В.этой.книге.из.соображений.безопасности.мы.не.будем.указывать.для.примеров.реальный.ключ.API;.вместо.этого.воспользуемся.текстом.replace withapikey.в.любом.месте,.где.требуется.ключ.API.Полное описание API VirusTotal можно найти в документации VirusTotal: http://bit.ly/2UXvQyB.Поиск в базе данных по хеш-значениюДля.взаимодействия.с.сервисом.VirusTotal.через.Интернет.используется.запрос.на.передачу.репрезентативного.состояния.(Representational.State.Transfer,.REST)..В.табл..11.2.перечислены.некоторые.URL-адреса.REST.для.основных.функций.сканирования.файлов.VirusTotal. Глава 11. Анализ вредоносных программ 177Таблица 11.2. Элементы API VirusTotalОписаниеЗапросить URLПараметрыПолучение.отчета.о.сканировании https://www.virustotal.com/vtapi/v2/file/report apikey,.resource,.allinfoВыгрузка.и.сканирование.файла https://www.virustotal.com/vtapi/v2/file/scan apikey,.fileVirusTotal.хранит.историю.всех.файлов,.которые.ранее.были.загружены.и.проана- лизированы..Чтобы.определить,.есть.ли.отчет.по.этому.файлу,.можно.выполнить.поиск.в.базе.данных.с.помощью.хеша.подозрительного.файла..Это.избавит.вас.от.необходимости.фактически.выгружать.файл..Недостаток.этого.метода.в.том,.что,.если.данный.файл.в.VirusTotal.еще.никто.не.загружал,.отчета.по.нему.не.будет.VirusTotal.принимает.форматы.хешей.MD5,.SHA1.и.SHA256,.которые.можно.ге- нерировать.с.помощью.md5sum,.sha1sum.и.sha256sum.соответственно..После.того.как.вы.сгенерировали.хеш.вашего.файла,.с.помощью.curl.и.запроса.REST.его.можно.отправить.в.VirusTotal.Запрос.REST.находится.в.виде.URL-адреса,.который.начинается.с.https://www.virus- total.com/vtapi/v2/file/report.и.имеет.три.основных.параметра:‰‰ apikey.—.ваш.ключ.API,.полученный.от.VirusTotal;‰‰ resource.—.хеш.файла.MD5,.SHA1.или.SHA256;‰‰ allinfo.—.если.равен.true,.будет.возвращена.дополнительная.информация.от.других.инструментов.В.качестве.примера.возьмем.образец.вредоносного.ПО.WannaCry,.который.имеет.MD5-хеш.db349b97c37d22f5ea1d1841e3c89eb4:curl 'https://www.virustotal.com/vtapi/v2/file/report?apikey=replacewithapikey& resource=db349b97c37d22f5ea1d1841e3c89eb4&allinfo=false > WannaCry_VirusTotal.txtПолученный.ответ.JSON.содержит.список.всех.антивирусных.программ,.в.которых.был.запущен.файл,.и.определение.того,.был.ли.этот.файл.определен.как.вредонос- ный..Здесь.мы.видим.ответы.от.первых.двух.движков,.Bkav.и.MicroWorld-eScan:{"scans": {"Bkav": {"detected": true, "version": "1.3.0.9466", "result": "W32.WannaCrypLTE.Trojan", "update": "20180712"}, "MicroWorld-eScan": {"detected": true, 178 Часть II • Защитные операции с использованием bash "version": "14.0.297.0", "result": "Trojan.Ransom.WannaCryptor.H", "update": "20180712"}Хотя.JSON.отлично.подходит.для.структурирования.данных,.у.людей.при.чтении.могут.возникнуть.трудности..С.помощью.grep.вы.можете.извлечь.некоторые.важ- ные.сведения,.например,.был.ли.файл.определен.как.вредоносный:$ grep -Po '{"detected": true.*?"result":.*?,' Calc_VirusTotal.txt{"detected": true, "version": "1.3.0.9466", "result": "W32.WannaCrypLTE.Trojan",{"detected": true, "version": "14.0.297.0", "result": "Trojan.Ransom.WannaCryptor.H",{"detected": true, "version": "14.00", "result": "Trojan.Mauvaise.SL1",В.grep.параметр.-P.применяется.для.включения.движка.Perl,.который.позволяет.использовать.шаблон..*?.как.ленивый.квантификатор..Этот.ленивый.квантифи- катор.соответствует.только.минимальному.количеству.символов,.необходимых.для.соответствия.всему.регулярному.выражению,.что.позволяет.извлекать.ответ.из.каждого.антивирусного.ядра.по.отдельности,.а.не.из.большой.группы.Хотя.этот.метод.работает,.наилучшее.решение.можно.создать.с.помощью.сценария.bash,.как.показано.в.примере.11.2.Пример 11.2. vtjson.sh#!/bin/bash -## Bash и кибербезопасность# vtjson.sh## Описание:# Поиск вредоносных программ в файле JSON## Использование:# vtjson.awk []# Файл с результатами VirusTotal# по умолчанию: Calc_VirusTotal.txt#RE='^.(.*)...\{.*detect..(.*),..vers.*result....(.*).,..update.*$' FN="${1:-Calc_VirusTotal.txt}"sed -e 's/{"scans": {/&\n /' -e 's/},/&\n/g' "$FN" | while read ALINEdo if [[ $ALINE = $RE ]]  Глава 11. Анализ вредоносных программ 179 then VIRUS="${BASH_REMATCH[1]}"  FOUND="${BASH_REMATCH[2]}" RESLT="${BASH_REMATCH[3]}" if [[ $FOUND = .*true.* ]]  then echo $VIRUS "- result:" $RESLT fi fi done.Это.сложное.регулярное.выражение.(или.RE).ищет.строки,.содержащие.слова.DETECT,.RESULT.и.UPDATE.в.указанной.последовательности..Более.того,.RE.также.на- ходит.в.пределах.любой.строки.три.подстроки,.которые.соответствуют.этим.трем.ключевым.словам..Подстроки.обозначены.круглыми.скобками;.скобок.не.должно.быть.в.строках,.которые.мы.ищем,.—.они.скорее.являются.синтаксисом.RE,.обо- значающим.группировку.Рассмотрим.в.этом.примере.первую.группу..RE.заключено.в.одинарные.кавычки..Здесь.может.быть.много.специальных.символов,.но.нам.не.нужно,.чтобы.они.были.интерпретированы.как.специальные.символы.оболочки;.желательно,.чтобы.они.передавались.буквально.процессору.regex..Следующий.символ,.^,.говорит.о.том,.что.этот.поиск.следует.привязать.к.началу.строки..Символ.«точка».().соответствует.любому.символу.в.строке.ввода..Затем.идет.группа.любых.символов.(),.повторя- ющаяся.любое.количество.раз,.обозначаемое.символом.*Итак,.сколько.символов.потребуется.для.заполнения.этой.первой.группы?.Мы.должны.и.дальше.просматривать.RE,.чтобы.найти.соответствия..То,.что.должно.находиться.после.данной.группы,.—.это.три.символа,.за.которыми.следует.левая.скобка..Итак,.теперь.мы.можем.описать.эту.первую.группировку.как.все.символы,.начиная.со.второго.символа.строки.вплоть.до.трех.символов.перед.левой.скобкой,.но.эти.три.символа.исключаются.Данная.ситуация.похожа.на.ситуацию.с.другими.группами,.местоположение.ко- торых.ограничивается.точками.и.ключевыми.словами..Да,.это.довольно.жесткий.формат,.но.предсказуемый..Данный.сценарий.мог.быть.написан.для.более.гибкой.обработки.формата.ввода.(см..упражнения.в.конце.главы)..Команда.sed.готовит.наши.входные.данные.для.более.легкой.обработки..Она.са- мостоятельно.помещает.в.строку.исходное.ключевое.слово.JSON.scans.и.связанные.с.ним.знаки.пунктуации..Далее.в.конце.каждой.правой.скобки.(с.запятой.после.нее).также.добавляется.символ.новой.строки..В.обоих.выражениях.редактирования.символ.&.в.правой.части.подстановки.представляет.собой.то,.что.было.сопоставлено.с.левой.стороны..Например,.во.второй.замене.амперсанд.является.сокращением.для.правой.скобки.и.запятой. 180 Часть II • Защитные операции с использованием bash.Здесь.используется.регулярное.выражение..Не.задавайте.$RE.внутри.кавычек,.иначе.$RE.будет.соответствовать.таким.специальным.символам,.как.литералы..Чтобы.определить.поведение.регулярного.выражения,.не.заключайте.его.в.кавычки..Если.в.регулярном.выражении.используются.скобки,.они.обозначают.подстроку,.которую.можно.извлечь.из.переменной.массива.оболочки.BASH_REMATCH..Индекс.1.обозначает.первую.подстроку.и.т..д..Это.еще.один.вариант.использования.сопоставления.регулярных.выражений..Мы.ищем.слово.true.в.любом.месте.строки..Здесь.делается.предположение.о.наших.входных.данных:.что.слово.true.не.появляется.ни.в.каком.другом.поле,.кроме.того,.в.котором.мы.ожидаем.его.встретить..Мы.могли.бы.сделать.сопоставление.более.конкретным.(например,.расположив.слово.true.рядом.со.словом.detected),.но.такой.оператор.гораздо.лучше.читается.и.будет.работать.до.тех.пор,.пока.четыре.буквы.t-r-u-e.не.появятся.в.данной.последовательности.в.любом.другом.поле.Для.решения.этой.задачи.не.обязательно.использовать.регулярные.выражения..В.примере.11.3.приводится.решение.с.использованием.awk..Теперь.в.awk.можно.эф- фективно.задействовать.регулярные.выражения,.но.они.вам.здесь.не.нужны.из-за.другой.мощной.функции.awk:.синтаксического.разбора.входных.данных.на.поля.Пример 11.3. vtjson.awk# Bash и кибербезопасность# vtjson.awk## Описание:# Поиск вредоносных программ в файле JSON## Использование:# vtjson.awk # Файл с результатами VirusTotal#FN="${1:-Calc_VirusTotal.txt}"sed -e 's/{"scans": {/&\n /' -e 's/},/&\n/g' "$FN" | awk 'NF == 9 {  COMMA="," QUOTE="\""  if ( $3 == "true" COMMA ) {  VIRUS=$1  gsub(QUOTE, "", VIRUS)  RESLT=$7 gsub(QUOTE, "", RESLT) gsub(COMMA, "", RESLT) Глава 11. Анализ вредоносных программ 181 print VIRUS, "- result:", RESLT }}'.Мы.начинаем.с.той.же.предварительной.обработки.входных.данных,.что.и.в.пре- дыдущем.сценарии..На.этот.раз.передаем.результаты.в.awk.Код.внутри.этих.фигурных.скобок.будет.выполняться.только.для.входных.строк.с.девятью.полями..Мы.устанавливаем.переменные.для.хранения.этих.строковых.констант..Обратите.внимание,.что.мы.не.можем.использовать.одинарные.кавычки.вокруг.одного.симво- ла.двойной.кавычки..Почему?.Потому.что.весь.сценарий.awk.защищен.(от.интерпре- тации.специальных.символов.в.оболочке).одинарными.кавычками.(вернитесь.на.три.строки.назад.или.перейдите.в.конец.этого.сценария)..Вместо.этого.мы.экранируем.двойную.кавычку,.поставив.перед.ней.обратный.слеш..Здесь.третье.поле.входной.строки.сравнивается.со.строкой."true",.поскольку.в.awk.сочетание.строк.подразумевает.конкатенацию..Мы.не.используем.знак.плюс.для.добавления.двух.строк,.как.это.делается.в.некоторых.языках;.мы.просто.ука- зываем.их.рядом.друг.с.другом..Как.и.в.случае.с.$3,.который.используется.в.условии.if,.$1.здесь.относится.к.но- меру.поля.входной.строки.—.первому.слову.ввода..Это.не.переменная.оболочки,.ссылающаяся.на.параметр.сценария..Помните.про.одинарные.кавычки,.в.которые.заключен.этот.сценарий.awk.gsub.—.это.функция.awk,.выполняющая.глобальное.замещение..При.поиске.через.третий.аргумент.она.заменяет.все.вхождения.первого.аргумента.вторым..Поскольку.второй.аргумент.—.это.пустая.строка,.то.из.строки.в.переменной.VIRUS(которой.было.присвоено.значение.первого.поля.строки.ввода).удаляются.все.символы.кавычек.Остальная.часть.сценария,.выполняющая.эти.замены.и.выводящая.результаты,.во.многом.совпадает.с.предыдущим..Помните,.что.в.awk.сценарий.продолжает.читать.stdin.и.выполнять.код.по.одному.разу.для.каждой.строки.ввода.до.его.конца.Сканирование файлаВы.можете.выгрузить.новые.файлы.для.анализа.в.VirusTotal,.если.информа- ции.о.них.еще.нет.в.базе.данных..Для.этого.вам.нужно.отправить.запрос.HTML.POST.на.URL-адрес.https://www.virustotal.com/vtapi/v2/file/scan..Вы.также.должны.предоставить.свой.ключ.API.и.путь.для.выгрузки.файла..Ниже.приведен.пример. 182 Часть II • Защитные операции с использованием bash использования.файла.Windows.calc.exe,.который.обычно.можно.найти.в.каталоге.C:\Windows\System32:curl --request POST --url 'https://www.virustotal.com/vtapi/v2/file/scan' --form 'apikey=replacewithapikey' --form 'file=@/c/Windows/System32/calc.exe'Результаты.после.выгрузки.файла.будут.получены.не.сразу..Возвращается,.напри- мер,.следующий.объект.JSON,.содержащий.метаданные.файла,.который.можно.использовать.для.последующего.получения.отчета.с.применением.идентификатора.сканирования.или.одного.из.значений.хеш-функции:{"scan_id": "5543a258a819524b477dac619efa82b7f42822e3f446c9709fadc25fdff94226-1...","sha1": "7ffebfee4b3c05a0a8731e859bf20ebb0b98b5fa","resource": "5543a258a819524b477dac619efa82b7f42822e3f446c9709fadc25fdff94226","response_code": 1,"sha256": "5543a258a819524b477dac619efa82b7f42822e3f446c9709fadc25fdff94226","permalink": "https://www.virustotal.com/file/5543a258a819524b477dac619efa82b7...","md5": "d82c445e3d484f31cd2638a4338e5fd9","verbose_msg": "Scan request successfully queued, come back later for the report"}Сканирование URL-адресов, доменов и IP-адресовVirusTotal.также.предоставляет.возможность.сканирования.определенного.URL,.домена.или.IP-адреса..Все.вызовы.API.схожи.в.том,.что.они.отправляют.HTTP- запрос.GET.на.соответствующий.URL-адрес,.указанный.в.табл..11.3.с.соответству- ющими.параметрами.Таблица 11.3. VirusTotal URL APIОписаниеЗапросить URLПараметрыОтчет.по.URLhttps://www.virustotal.com/vtapi/v2/url/report apikey,.resource,.allinfo,.scanДоменный.отчет https://www.virustotal.com/vtapi/v2/domain/report apikey,.domainОтчет.по.IPhttps://www.virustotal.com/vtapi/v2/ip-address/report apikey,.ipВот.пример.запроса.отчета.сканирования.по.URL-адресу:curl 'https://www.virustotal.com/vtapi/v2/url/report?apikey=replacewithapikey &resource=www.oreilly.com&allinfo=false&scan=1'Параметр.scan=1.автоматически.отправит.URL-адрес.для.анализа,.если.его.еще.нет.в.базе.данных. Глава 11. Анализ вредоносных программ 183ВыводыИспользуя.только.командную.строку,.нельзя.обеспечить.тот.же.уровень.произ- водительности,.что.предоставляют.полнофункциональные.инструменты.реверс- инжиниринга..Но.с.ее.помощью.можно.обеспечить.проверку.исполняемого.файла..Не.забывайте,.что.анализировать.подозрительные.вредоносные.программы.следует.только.на.системах,.отключенных.от.сети,.и.помните.о.проблемах.конфиденциаль- ности,.которые.могут.возникнуть.при.выгрузке.файлов.в.VirusTotal.или.другие.подобные.сервисы.В.следующей.главе.мы.рассмотрим,.как.улучшить.визуализацию.данных.после.их.сбора.и.анализа.Упражнения1.. Создайте.регулярное.выражение.для.поиска.в.двоичном.файле.одиночных.печатаемых.символов,.разделенных.одиночными.непечатаемыми.символами..Например,.p.a.s.s.w.o.r.d,.где..представляет.непечатаемый.символ.2.. Выполните.поиск.вхождения.одного.печатаемого.символа.в.двоичном.файле..Вместо.того.чтобы.печатать.найденные.символы,.распечатайте.символы,.ко- торые.не.были.найдены..Чтобы.немного.упростить.упражнение,.учитывайте.только.буквенно-цифровые.символы.3.. С.помощью.одной.команды.напишите.сценарий.для.взаимодействия.с.API.VirusTotal..Используйте.параметр.-H.для.проверки.хеша,.-F.—.для.загрузки.файла.и.-U.—.для.проверки.URL-адреса..Например:$ ./vt.sh -h db349b97c37d22f5ea1d1841e3c89eb4Detected: W32.WannaCrypLTE.TrojanЧтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.зайдите.на.сайт.https://www.rapidcyberops.com/ 12Форматирование и отчетностьДля.получения.максимальной.пользы.все.собранные.ранее.и.проанализированные.данные.должны.быть.представлены.в.понятном.и.удобочитаемом.формате..Часто.формат.стандартного.вывода.командной.строки.не.позволяет.выводить.большое.количество.информации..Поэтому.для.улучшения.читаемости.можно.воспользо- ваться.дополнительными.методами.Используемые командыВ.этой.главе.для.форматирования.вывода.мы.будем.применять.команду.tput tputКоманда.tput,.используя.базу.данных.terminfo,.управляет.вашими.сеансами.работы.с.терминалом..С.помощью.команды.tput.можно.управлять.различными.функция- ми.терминала,.такими.как.перемещение.или.изменение.вида.курсора,.изменение.свойств.текста.и.очистка.определенных.областей.экрана.терминала.Общие параметры команды‰‰ clear.—.очистить.экран.‰‰ cols.—.распечатать.количество.столбцов.терминала.‰‰ cup.—.переместить.курсор.в.положение.,.‰‰ lines.—.распечатать.количество.строк.терминала.‰‰ rmcup.—.вернуться.к.обычному.экрану.терминала. Глава 12. Форматирование и отчетность 185‰‰ setab.—.установить.цвет.фона.терминала.‰‰ setaf.—.установить.основной.цвет.терминала.‰‰ smcup.—.сохранить.текущий.экран.терминала.и.очистить.экран.Форматирование для отображения в виде HTML-документаЕсли.результат.не.требуется.просматривать.непосредственно.в.командной.стро- ке,.отличным.способом.обеспечить.аккуратное.и.понятное.форматирование.вы- водимых.данных.будет.преобразование.информации.в.формат.HTML..Данные.в.формате.HTML.удобно.выводить.на.печать,.используя.встроенные.в.браузер.возможности.для.печати.Полный.синтаксис.HTML.выходит.за.рамки.этой.книги,.здесь.же.мы.рассмотрим.основные.принципы.форматирования..HTML.—.это.компьютерный.язык,.который.определяется.рядом.тегов,.управляющих.форматированием.данных.и.их.поведени- ем.в.браузере..В.HTML.обычно.используются.открывающие.теги.()..В.табл..12.1.перечислены.несколько.наиболее.популярных.тегов.и.их.назначение.Таблица 12.1. Основные HTML-тегиТегНазначениеВнешний.тег.в.HTML-документеТег,.содержащий.основное.содержимое.HTML-документаЗаголовокПолужирный.текстНумерованный.списокМаркированный.списокВ.примере.12.1.показан.образец.документа.HTML.Пример 12.1. Заготовка HTML-документа   1   ...   12   13   14   15   16   17   18   19   ...   23

This is a header 186 Часть II • Защитные операции с использованием bash this is bold text this is a link  This is list item 1  This is list item 2   Row 1, Column 1  Row 1, Column 2 Row 2, Column 1 Row 2, Column 2 .Тег..предназначен.для.создания.нумерованного.списка,.а.тег..—.для.создания.маркированного..Тег..определяет.элемент.списка..Тег..используется.для.определения.таблицы..Тег..применяется.для.определения.строки.таблицы..Тег..используется.для.определения.ячейки.таблицы.Для получения дополнительной информации о HTML обратитесь к справочным материалам HTML5 Консорциума World Wide Web (http://bit.ly/2U1TRbz).На.рис..12.1.показано,.как.выглядит.страница.из.примера.12.1.при.отображении.в.браузере.Чтобы.упростить.вывод.в.HTML,.вы.можете.создать.простой.сценарий.для.упа- ковки.элементов.в.теги..Сценарий,.показанный.в.примере.12.2,.принимает.строку.и.тег,.после.чего.выводит.эту.строку,.окруженную.тегом,.а.затем.символ.новой.строки. Глава 12. Форматирование и отчетность 187Рис. 12.1. Визуализированная HTML-страницаПример 12.2. tagit.sh#!/bin/bash -## Bash и кибербезопасность# tagit.sh## Описание:# Поместить открывающие и закрывающие теги вокруг строки## Использование:# tagit.sh # Используемый тег# Строка с тегами#printf '<%s>%s%s>\n' "${1}" "${2}" "${1}"Полученный.вывод.также.можно.превратить.в.простую.функцию,.которую.впо- следствии.можно.включить.в.другие.сценарии:function tagit (){ printf '<%s>%s%s>\n' "${1}" "${2}" "${1}"}Вы.можете.использовать.HTML-теги.для.переформатирования.практически.любого.типа.данных,.после.чего.чтение.этих.данных.значительно.облегчится.. 188 Часть II • Защитные операции с использованием bashВ.примере.12.3.показан.сценарий,.читающий.файл.Apache.access.log,.приведенный.в.примере.7.2..Для.переформатирования.и.вывода.файла.журнала.в.виде.HTML.используется.функция.tagitПример 12.3. weblogfmt.sh#!/bin/bash -## Bash и кибербезопасность # weblogfmt.sh## Описание:# Чтение веб-журнала Apache и его вывод в виде HTML## Использование:# weblogfmt.sh < input.file > output.file#function tagit(){ printf '<%s>%s%s>\n' "${1}" "${2}" "${1}"}# основные теги заголовка echo "" echo ""echo "$1" # заголовок echo "" # таблица с границами echo "" # новая строка таблицы echo "IP Address" # заголовок столбца echo "Date"echo "URL Requested"echo "Status Code"echo "Size"echo "Referrer"echo "User Agent"echo ""while read f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12plus do echo "" tagit "td" "${f1}" tagit "td" "${f4} ${f5}"  tagit "td" "${f6} ${f7}" tagit "td" "${f9}" tagit "td" "${f10}" tagit "td" "${f11}" Глава 12. Форматирование и отчетность 189 tagit "td" "${f12plus}" echo ""done < $1# закрывающие теги echo ""echo " $1EOFПреимущество.этого.кода.в.том,.что.не.требуется.повторять.все.команды.echoОбратите.внимание:.все.равно.потребуется.выполнить.замену.$1,.если.при.вызове.не.будет.ссылки.на.EOF.в.любой.форме..Однако.в.этом.решении.есть.один.недоста- ток:.в.таком.случае.мы.не.сможем.добавлять.в.наш.ввод.комментарии..Файл.журнала.—.это.файл.фиксированного.формата,.по.крайней.мере.для.не- скольких.первых.полей..Здесь.мы.можем.прочитать.каждую.строку.из.файла.жур- нала.и.разобрать.ее.на.поля..Для.чтения.всех.полей.в.массив.можно.использовать.конструкцию.read-aRAOFTXT,.по.одному.полю.для.каждого.индекса..Но.при.таком.подходе.становится.сложно.распечатать.все.оставшиеся.поля,.расположенные.по- сле.12-го..Поэтому.все.оставшиеся.слова.были.включены.в.последнее.поле,.которое.мы.назвали.f12plus.Обратите.внимание,.что.в.этой.и.следующей.строках.два.аргумента.заключены.в.пару.двойных.кавычек..В.данной.строке.объединены.аргументы.f4.и.f5..После.того.как.их.совместно.взяли.в.кавычки,.для.сценария.tagit.они.превращаются.в.один.аргумент.($2)..Таким.образом.можно.сделать.вывод,.что.f12plus.следует.заключить.в.кавычки..При.этом.все.слова.в.данном.поле.будут.рассматриваться.как.один.аргумент.tagitНа.рис..12.2.показан.пример.вывода.из.примера.12.3.Прежде.чем.отправлять.эти.данные.в.сценарий,.например.в.weblogfmt.sh,.кото- рый.их.отформатирует,.их.следует.отфильтровать.и.отсортировать..Для.филь- трации.и.сортировки.данных.можно.воспользоваться.методами,.описанными.в.главе.7. 190 Часть II • Защитные операции с использованием bashРис. 12.2. Визуализация вывода из weblogf mt.sh Глава 12. Форматирование и отчетность 191Создание панели мониторингаПанели.инструментов.полезны,.если.требуется.отобразить.несколько.блоков.ин- формации,.меняющейся.со.временем..Панель.инструментов,.которую.мы.далее.рассмотрим,.отобразит.выводы.трех.сценариев.и.станет.обновлять.их.через.равные.промежутки.времени.Здесь.используются.графические.функции.окна.терминала..Вместо.того.чтобы.просто.прокручивать.данные.страницу.за.страницей,.сценарий.каждый.раз.будет.перерисовывать.экран.с.одной.и.той.же.начальной.позиции,.чтобы.при.перерисовке.он.полностью.обновлялся.Чтобы.сценарий.можно.было.переносить.между.различными.программами,.за- пущенными.в.терминале,.нужно.использовать.команду.tput,.которая.будет.запра- шивать.последовательность.символов,.выполняющих.графические.функции.для.открытого.в.данный.момент.окна.программы.Поскольку.экран.постоянно.«перерисовывается»,.вы.не.можете.просто.переме- ститься.в.верхнюю.часть.экрана.и.восстановить.результат..Почему?.Поскольку.при.следующей.итерации.могут.быть.отображены.более.короткие.строки,.чем.в.предыдущем.выводе,.старые.данные.с.экрана.следует.удалить.Сначала.следует.очистить.экран,.но,.если.на.нем.перед.заполнением.ничего.не.будет.(например,.из-за.задержек.в.командах,.предоставляющих.вывод.для.отображения),.этот.эффект.будет.раздражать..В.таком.случае.вы.можете.отправлять.весь.вывод.через.функцию.(нашей.собственной.разработки),.печатающую.каждую.строку.вы- вода,.и.добавлять.в.конец.каждой.строки.последовательность.символов,.которая.будет.очищать.каждую.строку.по.ее.окончании,.удаляя.тем.самым.весь.предыду- щий.вывод..Данная.функция.позволит.немного.украсить.вывод,.завершая.каждую.строку.пунктирной.линией.В.примере.12.4.показано.создание.экранной.панели.управления,.содержащей.три.отдельных.раздела.вывода.Пример 12.4. webdash.sh#!/bin/bash -## Rapid Cybersecurity Ops# webdash.sh## Описание:# Создание информационной панели 192 Часть II • Защитные операции с использованием bash# Заголовок# --------------# Однострочный вывод# --------------# Вывод из пяти строк# ...# --------------# Метки столбцов, а затем# восемь строк гистограммы# ...# --------------## некоторые важные постоянные строкиUPTOP=$(tput cup 0 0) ERAS2EOL=$(tput el)REV=$(tput rev) # негативное изображениеOFF=$(tput sgr0) # общий сбросSMUL=$(tput smul) # режим подчеркивания включен (пуск)RMUL=$(tput rmul) # режим подчеркивания выключен (сброс)COLUMNS=$(tput cols) # ширина нашего окна# DASHES(ТИРЕ)='------------------------------------'printf -v DASHES '%*s' $COLUMNS '-' DASHES=${DASHES// /-}## prSection – напечатать фрагмент экрана# напечатать $1-many строк из stdin# каждая строка представляет собой полную строку текста# с последующим стиранием до конца строки# разделы заканчиваются штриховой линией#function prSection (){ local -i i  for((i=0; i < ${1:-5}; i++)) do read aline printf '%s%s\n' "$aline" "${ERAS2EOL}"  done printf '%s%s\n%s' "$DASHES" "${ERAS2EOL}" "${ERAS2EOL}"}function cleanup() { if [[ -n $BGPID ]] then kill %1  rm -f $TMPFILE fi} &> /dev/null  Глава 12. Форматирование и отчетность 193trap cleanup EXIT# запустить процесс bgTMPFILE=$(tempfile) { bash tailcount.sh $1 | \ bash livebar.sh > $TMPFILE ; } & BGPID=$!clear while true do printf '%s' "$UPTOP" # заголовок: echo "${REV}Rapid Cyber Ops Ch. 12 -- Security Dashboard${OFF}" \ | prSection 1 #---------------------------------------- {  printf 'connections:%4d %s\n' \ $(netstat -an | grep 'ESTAB' | wc -l) "$(date)" } | prSection 1 #---------------------------------------- tail -5 /var/log/syslog | cut -c 1-16,45-105 | prSection 5 #---------------------------------------- { echo "${SMUL}yymmdd${RMUL}" \ "${SMUL}hhmmss${RMUL}" \ "${SMUL}count of events${RMUL}" tail -8 $TMPFILE } | prSection 9 sleep 3done.Команда.tput.предоставляет.независимую.от.терминала.последовательность.символов,.позволяющую.переместиться.в.левый.верхний.угол.экрана..Чтобы.не.вызывать.данную.команду.при.каждом.цикле,.мы.вызываем.ее.только.один.раз.и.сохраняем.вывод.для.повторного.использования.при.каждой.итерации..Далее.следуют.другие.вызовы.специальных.последовательностей,.сохраненных.для.по- вторного.использования..Существует.несколько.способов.создания.пунктирной.линии..Здесь.мы.выбрали.один,.хоть.немного.и.замысловатый,.но.очень.интересный.вариант..При.этом.двух- этапном.процессе.используется.заполнение.функцией.printf.всей.пустой.резуль- тирующей.строки..Символ.*.указывает.функции.printf.использовать.для.задания.ширины.отформатированного.поля.первую.переменную..В.результате.получается.строка.из.49.пробелов.и.одного.знака.минус..Напечатанная.строка.сохраняется.в.переменной,.заданной.параметром.-v..Вторая.часть.создания.пунктирной.линии.заключается.в.том,.чтобы.заменить.каждый.пробел.знаком.минус.(двойной.слеш.указывает.bash.заменить.не.только.первое,.но.и.все.остальные.вхождения). 194 Часть II • Защитные операции с использованием bash.Объявление.в.нашем.сценарии.переменной.i.как.локальной.—.хорошая.практика,.хотя.для.нашего.сценария.это.некритично..Тем.не.менее.так.ваш.цикл.for.не.будет.изменять.какой-либо.другой.индекс.или.счетчик..К.каждой.строке,.отправляемой.через.данную.функцию,.мы.добавляем.указание.erase-to-end-of-line.(«стереть.до.конца.строки»).как.в.текущей,.так.и.в.следующей.функции.printf..После.печати.пунктирной.линии.вторая.функция.printf.стирает.следующую.строку,.где.курсор.будет.находиться.до.следующей.итерации..Функция.очистки.вызывается.при.выходе.из.сценария.панели.мониторинга,.когда.пользователь.для.прерывания.и.выхода.из.сценария.нажмет.сочетание.кла- виш.Ctrl+C..Как.и.наша.функция.очистки.в.сценарии.tailcount.sh.(см..главу.8),.эта.функция.завершит.работу.функций,.находящихся.в.фоновом.режиме..В.отличие.от.предыдущей.версии,.где.системный.вызов.kill.отправляет.сигнал.определенному.процессу,.здесь.мы.используем.нотацию.%1,.чтобы.дать.системному.вызову.kill.указание,.согласно.которому.сигнал.должен.быть.передан.всем.процес- сам,.запущенным.в.результате.работы.процесса.в.фоновом.режиме..Все.эти.процессы.считаются.частью.одной.и.той.же.«работы»..Их.рабочие.номера.(%1,.%2,.%3.и.т..д.).определяются.порядком.их.размещения.в.фоновом.режиме..В.этом.сценарии.у.нас.есть.только.один.фоновый.процесс..Мы.перенаправляем.вывод.в.функцию.clear.таким.образом,.что.все.выходные.данные,.поступающие.из.stdout.или.stderr,.будут.отброшены..Такая.очистка.гаран- тирует.отсутствие.любых.неожиданных.сообщений,.хотя.ничего.подобного.мы.и.не.ожидаем.(это.плохо.для.отладки,.но.экран.будет.намного.чище)..Команда.tempfile.генерирует.уникальное.имя.и.проверяет,.не.используется.ли.оно.в.данный.момент..В.результате.нам.будет.известно,.что,.независимо.от.количе- ства.запущенных.экземпляров.сценария.и.расположенных.рядом.других.файлов,.для.этого.сценария.рабочий.файл.будет.доступен..В.функции.clear.есть.код,.уда- ляющий.данный.файл.при.каждом.выходе.из.сценария..Эта.строка.запускает.два.сценария,.которые.описаны.в.главе.8..Данные.сценарии.подсчитывают.строки,.добавляемые.в.конце.файла..Фигурные.скобки.группируют.все.процессы.этого.конвейера.команд.вместе.и.помещают.в.«фон»,.отключая.их.от.ввода.с.клавиатуры..Эти.процессы.и.все,.что.они.создали,.являются.частью.зада- ния.1.(%1),.то.есть.задания,.работу.которого.прекратит.функция.clear.Каждый.раздел.вывода.отправляется.отдельно.в.функцию.prSection..Команды.для.раздела.не.нужно.группировать.внутри.фигурных.скобок,.если.для.этого.раздела.одна.команда.генерирует.вывод..Это.относится.к.первым.трем.разделам,. Глава 12. Форматирование и отчетность 195но.четвертому.разделу.для.группировки.двух.операторов.(echo.и.tail),.записы- вающих.вывод,.требуются.скобки..Во.втором.разделе.фигурные.скобки.хотя.и.не.нужны,.но.предусмотрены.в.случае,.если.мы.когда-нибудь.захотим.расширить.этот.раздел.и.иметь.разные.выходные.данные..Команды.для.раздела.не.нужно.группи- ровать.внутри.фигурных.скобок,.если.одна.команда.генерирует.вывод..Для.всех.остальных.разделов.в.качестве.меры.предосторожности.при.расширении.можно.сделать.то.же.самое..Обратите.внимание.на.небольшую.разницу.в.синтаксисе.между.использованием.фигурных.скобок.в.этой.и.предыдущей.строке.с.пометкой..Нам.не.нужна.точка.с.запятой,.потому.что.мы.помещаем.закрывающую.скобку.на.новую.строку.На.рис..12.3.показан.пример.вывода.сценария.панели.управления.Рис. 12.3. Вывод на панели управленияВыводыПолученные.ранее.данные.принесут.пользу.только.в.том.случае,.если.будут.удоб- ны.для.чтения.пользователю,.которому.эта.информация.предназначалась..HTML.предоставляет.простой.способ.форматирования.данных.для.отображения.на.экране.или.для.печати..Панель.мониторинга,.созданная.в.этой.главе,.может.быть.особенно.полезной.при.отслеживании.информации.в.режиме.реального.времени.В.следующей.главе.мы.рассмотрим,.как.командная.строка.и.bash.могут.помочь.вам.выполнить.тестирование.на.проникновение. 196 Часть II • Защитные операции с использованием bashУпражнения1.. Измените.сценарий.webdash.sh.так,.чтобы.захватить.два.аргумента.командной.строки,.определяющие.записи.журнала,.используемого.для.мониторинга..На- пример:./webdash.sh /var/log/apache2/error.log /var/log/apache2/access.log2.. Напишите.сценарий,.подобный.примеру.12.3,.который.преобразует.журнал.ошибок.Apache.в.HTML-код.Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.зайдите.на.сайт.https://www.rapidcyberops.com/ Часть IIIТестирование на проникновениеПусть.планы.твои.пребывают.во.тьме,.непроницаемые,.словно.ночь,.так,.чтобы,.когда.ты.двинешь.свои.силы,.они.обрушились.подобно.молнии1Сунь-цзы. Искусство войныВ.части.III.мы.рассмотрим.использование.командной.строки.во.время.тестов.на.проникновение,.чтобы.проводить.разведку,.выявлять.уязвимости.и.предоставлять.удаленный.доступ.1.Оригинальная.цитата:.Let.your.plans.be.dark.and.impenetrable.as.night,.and.when.you.move,.fall.like.a.thunderbolt. 13РазведкаРазведка.—.это,.как.правило,.первый.шаг.при.тестировании.на.проникновение..Основная.задача.данного.этапа.—.используя.все.доступные.ресурсы,.собрать.как.можно.больше.информации.о.цели..Нас.интересуют.такие.сведения,.как.имена,.адреса.электронной.почты.и.номера.телефонов,.пространство.IP-адресов,.открытые.сетевые.порты.и.используемое.программное.обеспечение.Используемые командыВ.этой.главе.мы.познакомимся.с.командой.ftp ftpКоманда.ftp.предназначена.для.передачи.файлов.на.FTP-сервер.и.обратно.Общие параметры команды-n.—.запретить.автоматический.вход.на.сервер.Пример командыДля.подключения.к.FTP-серверу.с.IP-адресом.192.168.0.125.напишите.следующее:ftp 192.168.0.125По.умолчанию.команда.ftp.попытается.подключиться.через.TCP-порт.21..Если.вы.хотите.подключиться.через.другой.порт,.укажите.номер,.введя.его.после.IP-адреса.хоста..Например,.подключимся.к.порту.50:ftp 192.168.0.125 50После.подключения.к.FTP-серверу.для.отправки.и.получения.файлов.используйте.интерактивные.команды..Чтобы.вывести.список.каталогов,.введите.команду.ls;. Глава 13. Разведка 199для.перехода.из.каталога.в.каталог.воспользуйтесь.командой.cd;.для.передачи.файлов.на.FTP-сервер.применяется.команда.put,.а.для.передачи.файлов.с.FTP- сервера.—.команда.getПросмотр веб-сайтовДля.копирования.веб-страницы.из.сети.можно.использовать.команду.curlОна.проста.в.использовании,.но.имеет.множество.дополнительных.параметров,.предоставляющих.возможность.обработки.удаленной.аутентификации.и.сеан- совых.файлов.cookie..Обычно.вместе.с.командой.curl.используется.параметр.-L,.позволяющий.команде.следовать.перенаправлениям.HTTP.при.изменении.место- положения.страницы..По.умолчанию.curl.будет.выводить.необработанный.HTML- код.в.stdout..Но.вывод.с.помощью.параметра.-o.можно.перенаправить.в.файл:curl -L -o output.html https://www.oreilly.comПараметр.-I.позволит.команде.curl.получать.только.HTTP-заголовки,.а.все.осталь- ное.содержимое.страницы.игнорировать..Это.может.быть.полезно.при.попытке.идентификации.версии.веб-сервера.или.операционной.системы..В.приведенном.ниже.примере.можно.увидеть,.что.сервер.использует.Apache.2.4.7.и.операционную.систему.Ubuntu:$ curl -LI https://www.oreilly.comHTTP/1.1 200 OKServer: Apache/2.4.7 (Ubuntu)Last-Modified: Fri, 19 Oct 2018 08:30:02 GMTContent-Type: text/htmlCache-Control: max-age=7428Expires: Fri, 19 Oct 2018 16:16:48 GMTDate: Fri, 19 Oct 2018 14:13:00 GMTConnection: keep-aliveВы хотите узнать, доступен ли сайт? Перехватите заголовок с помощью curl, а затем для поиска кода состояния HTTP 200 используйте команду grep:$ curl -LIs https://www.oreilly.com | grep '200 OK'HTTP/1.1 200 OKК.сожалению,.curl.может.извлекать.только.указанную.страницу.и.не.имеет.функ- ций.просмотра.содержимого.всего.сайта.или.перехода.по.ссылкам.на.странице. 200 Часть III • Тестирование на проникновениеWGETКоманда.wget.также.предназначена.для.загрузки.веб-страниц,.но.по.умолчанию.во.многих. дистрибутивах.Linux. она. не. установлена..В. Git. Bash. эта. команда. тоже. от- сутствует..Чтобы.установить.wget.в.дистрибутив.Linux.на.основе.Debian,.выполните.следующие.действия:sudo apt-get install wgetОдно.из.главных.преимуществ.wget.перед.curl.в.том,.что.wget.позволяет.зеркально.отображать.или.копировать.весь.веб-сайт,.а.не.просто.получить.одну.страницу.или.файл..При.использовании.зеркального.режима.wget.будет.сканировать.сайт.по.ссыл- кам.и.загружать.содержимое.каждой.найденной.страницы.в.указанный.каталог:wget -p -m -k -P ./mirror https://www.digadel.comПараметр.-p.используется.для.загрузки.файлов,.связанных.с.веб-сайтом,.таких.как.каскадные.таблицы.стилей.(CSS).и.файлы.изображений;.параметр.-m.включает.ре- жим. зеркального. отображения,. параметр.-k. преобразует. ссылки. на. загруженные.страницы.в.локальные.пути;.а.параметр.-P.указывает.путь.(то.есть.каталог),.в.кото- ром.сохраняется.зеркальный.веб-сайт.Автоматический захват баннераПри.подключении.к.серверу.иногда.появляется.информация.о.приложении.веб- сервиса.или.об.операционной.системе.—.баннер..При.подключении.к.веб-серверу.O’Reilly.в.заголовке.HTTP.можно.увидеть.такой.баннер.операционной.системы:HTTP/1.1 200 OKServer: Apache/2.4.7 (Ubuntu)Last-Modified: Fri, 19 Oct 2018 08:30:02 GMTContent-Type: text/htmlCache-Control: max-age=7428Expires: Fri, 19 Oct 2018 16:16:48 GMTDate: Fri, 19 Oct 2018 14:13:00 GMTConnection: keep-aliveЦенной.считается.информация.о.том,.в.какой.операционной.системе.работает.по- тенциальная.цель..Получив.эту.информацию,.вы.можете.узнать,.какие.уязвимости.могут.существовать.в.данной.системе..Впоследствии.эти.уязвимости.можно.ис- пользовать.на.начальном.этапе.жизненного.цикла.атаки.Баннеры.обычно.отображают.несколько.типов.систем,.включая.веб-серверы,.FTP- серверы.и.серверы.протокола.SMTP.(Simple.Mail.Transfer.Protocol)..В.табл..13.1.показаны.сетевые.порты,.которые.обычно.используются.этими.службами. Глава 13. Разведка 201Таблица 13.1. Стандартные портыПротокол сервераНомер портаFTPTCP.21SMTPTCP.25HTTPTCP.80В большинстве операционных систем баннер может быть изменен системным администратором. Баннер можно удалить полностью либо заставить его сооб- щать ложную информацию. Его также можно рассматривать как индикатор типа операционной системы или приложения, но полностью ему доверять нельзя.В.главе.9.мы.рассматривали,.как.с.помощью.сценария.scan.sh.сканировать.сетевой.порт..Этот.сценарий.можно.расширить.таким.образом,.что.при.каждом.обнаруже- нии.узла.с.одним.из.открытых.портов.(FTP,.SMTP.или.HTTP).он.будет.пытаться.получить.и.сохранить.баннер.сервера.Вы.уже.видели,.как.можно.использовать.команду.curl.для.захвата.заголовка.HTTP,.который.может.содержать.баннер:curl -LI https://www.oreilly.comДля.захвата.баннера.с.FTP-сервера.можно.использовать.команду.ftp:$ ftp -n 192.168.0.16Connected to 192.168.0.16.220 (vsFTPd 3.0.3)ftp>Параметр.-n.применяется,.чтобы.команда.ftp.не.пыталась.автоматически.войти.на.сервер..Чтобы.после.подключения.закрыть.FTP-соединение,.с.терминала.ftp>введите.команду.quitСамый.простой.способ.перехватить.баннер.с.SMTP-сервера.—.использовать.команду.telnet.с.сетевым.портом.25:$ telnet 192.168.0.16 25Connected to 192.168.0.16Escape character is '^]'.220 localhost.localdomain ESMTP Postfix (Ubuntu) 202 Часть III • Тестирование на проникновениеКоманда.telnet.доступна.в.большинстве.версий.Linux,.но.в.Git.Bash.и.во.многих.версиях.Windows.она.отсутствует..В.этих.случаях,.чтобы.получить.аналог.коман- ды.telnet,.вы.можете.написать.небольшой.сценарий,.используя.дескриптор.bash./dev/tcpВ.примере.13.1.показано,.как.для.подключения.к.SMTP-серверу.и.захвата.баннера.использовать.файловый.дескриптор.bash.TCP.Пример 13.1. smtpconnect.sh#!/bin/bash -## Bash и кибербезопасность# smtpconnect.sh## Описание:# Подключение к SMTP-серверу и печать приветственного баннера## Использование:# smtpconnect.sh 1   ...   13   14   15   16   17   18   19   20   ...   23


# SMTP-сервер для соединения
#
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] < inputfile
# -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.
.Преобразовать.символ.в.число.проще..С.помощью.функции.
print
.мы.выво- дим.символ.в.виде.десятичного.числа..Функция.
printf
.обычно.выдает.ошибку,.
если.мы.пытаемся.напечатать.строку.в.виде.числа..Добавив.обратный.слеш,.мы.