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

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

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

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

Добавлен: 12.01.2024

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

Скачиваний: 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


Глава 1. Работа с командной строкой 29
4.. Напишите.команду,.которая.создает.список.каталогов.(
ls
),.находящихся.в.кор- невом.каталоге,.и.направляет.вывод.в.команду.
more
5.. Напишите.команду,.которая.исполняет.
mytask.sh
.и.отправляет.его.в.фоновый.
режим.
6.. Основываясь.на.следующем.списке.заданий,.напишите.команду,.которая.выво- дит.задание.по.пингу.Amazon.в.приоритет:
[1] Running ping www.google.com > /dev/null &
[2]- Running ping www.amazon.com > /dev/null &
[3]+ Running ping www.oreilly.com > /dev/null &
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/

2
Основы работы с bash
Bash.—.это.больше.чем.просто.интерфейс.командной.строки.для.запуска.программ..
Это.сам.по.себе.язык.программирования..По.умолчанию.он.запускает.другие.про- граммы..Как.мы.уже.говорили.ранее,.когда.несколько.слов.введены.в.командную.
строку,.bash.предполагает,.что.первое.слово.—.это.имя.программы,.которую.нужно.
запустить,.а.остальные.слова.—.аргументы,.которые.нужно.передать.этой.программе.
Но,.как.язык.программирования.bash,.также.имеет.функции.для.поддержки.ввода.
и.вывода.и.управления.структурами:.
if
,.
while
,.
for
,.
case
.и.др..Его.основной.тип.
данных.—.строки.(например,.имена.файлов.и.пути),.но.он.поддерживает.и.целые.
числа..Поскольку.основное.внимание.уделяется.сценариям.и.запуску.программ,.
а.не.вычислениям,.bash.не.поддерживает.напрямую.числа.с.плавающей.точкой..
Для.этого.можно.использовать.другие.команды..Далее.мы.приводим.краткий.обзор.
отдельных.функций,.которые.делают.bash.мощным.языком.программирования,.
особенно.при.написании.сценариев.
Вывод
Как.и.любой.другой.язык.программирования,.bash.имеет.возможность.выводить.
информацию.на.экран..Вывод.можно.успешно.выполнить.с.помощью.команды.
echo
:
$ echo "Hello World"
Hello World
Вы.также.можете.использовать.встроенную.команду.
printf
,.которая.позволяет.
добавить.дополнительное.форматирование:
$ printf "Hello World\n"
Hello World

Глава 2. Основы работы с bash
1   2   3   4   5   6   7   8   9   ...   23

31
Вы.уже.видели.в.предыдущей.главе,.как.перенаправить.этот.вывод.в.файлы,.
stderr.либо.другую.команду..Больше.этих.команд.и.их.опций.мы.рассмотрим.
далее.
Переменные
Переменные.bash.начинаются.с.буквенного.символа.или.символа.подчеркивания,.
за.которым.следуют.алфавитно-цифровые.символы..Они.являются.строковыми,.
если.не.указано.иное..Чтобы.присвоить.значение.переменной,.вы.пишете.что-то.
вроде.этого:
MYVAR=textforavalue
Чтобы.извлечь.значение.этой.переменной.(например,.вывести.на.экран.с.помощью.
команды.
echo
),.вы.задаете.
$
.перед.именем.переменной:
echo $MYVAR
Если.вы.хотите.присвоить.переменной.последовательность.слов,.то.есть.сохранить.
все.пробелы,.то.заключите.значение.в.кавычки,.как.показано.ниже:
MYVAR='here is a longer set of words'
OTHRV="either double or single quotes will work"
Использование.двойных.кавычек.позволит.выполнять.другие.замены.внутри.
строки..Например:
firstvar=beginning secondvr="this is just the $firstvar"
echo $secondvr
В.результате.мы.получаем.на.выходе.такое.значение.переменной.
firstvar
:
this is just the beginning
При.извлечении.значения.переменной.вы.можете.выполнить.множество.под- становок..Мы.покажем.эти.подстановки.так,.как.они.будут.использованы.в.по- следующих.сценариях.
Помните, что при использовании двойных кавычек (") любые замены, начина- ющиеся с $, все равно выполняются, а если значение находится внутри одинарных кавычек ('), никаких замен не будет.

32 Часть I • Основы
Вы.также.можете.сохранить.вывод,.полученный.командой.оболочки,.с.помощью.
символов.
$(
)
,.как.показано.ниже:
CMDOUT=$(pwd)
Здесь.команда.
pwd
.выполняется.в.подоболочке,.и.вместо.того,.чтобы.печатать.
результат.в.stdout,.мы.сохраняем.вывод.команды.в.переменной.
CMDOUT
..Вы.также.
можете.передать.вместе.несколько.команд.внутри.
$(
)
Позиционные параметры..Обычно.при.использовании.инструментов.командной.
строки.для.передачи.данных.в.команды.применяются.аргументы.или.параметры..
Каждый.параметр.отделяется.пробелом.и.доступен.внутри.bash.с.помощью.спе- циального.набора.идентификаторов..В.скрипте.bash.доступ.к.первому.параметру,.
переданному.в.скрипт,.можно.получить.с.помощью.
$1
,.ко.второму.—.с.
$2
.и.т..д..
$0
.—.это.специальный.параметр,.который.содержит.имя.скрипта,.а.
$#
.возвращает.
общее.количество.параметров..Взгляните.на.скрипт.в.примере.2.1.
Пример 2.1. echoparams.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# echoparams.sh
#
# Описание:
# Демонстрация доступа к параметрам в bash
#
# Использование:
# ./echoparms.sh
#
echo $#
echo $0
echo $1
echo $2
echo $3
Этот.сценарий.сначала.выводит.на.экран.количество.параметров.(
$#
),.затем.имя.
сценария.(
$0
),.а.потом.первые.три.параметра..Вот.вывод:
$ ./echoparams.sh bash is fun
3
./echoparams.sh bash is fun


Глава 2. Основы работы с bash 33
Ввод
Пользовательский.ввод.можно.получить.в.bash.с.помощью.команды.
read
..Она.из- влекает.пользовательский.ввод.из.stdin.и.сохраняет.его.в.указанной.переменной..
Следующий.скрипт.читает.пользовательский.ввод.в.переменную.
MYVAR
.и.затем.
выводит.его.на.экран:
read MYVAR
echo "$MYVAR"
Вы.уже.видели,.как.перенаправить.этот.ввод.из.файлов..Далее.в.главе.вы.найдете.
гораздо.больше.информации.о.
read
.и.ее.параметрах,.а.также.об.этом.перенаправ- лении.
Условия
В.bash.предусмотрен.богатый.выбор.условных.конструкций..Многие.условия.на- чинаются.с.ключевого.слова.
if
..Любая.команда.или.программа,.вызываемая.в.bash,.
может.выполнить.вывод,.но.она.также.всегда.возвращает.значение,.определяющее.
успешное.или.неудачное.выполнение..В.оболочке.это.значение.можно.найти.
в.переменной.
$?
.сразу.после.запуска.команды..Возвращаемое.значение.
0
.считается.
success.или.true;.любое.ненулевое.значение.считается.error.или.false..В.простейшем.
виде.в.выражении.
if
.используются.именно.эти.значения.
if cmd then some cmds else other cmds fi
Использование 0 для true и ненулевого значения для false кардинально отлича- ет bash от многих языков программирования (C++, Java, Python и др.). Но для bash это имеет смысл, потому что при неудачном выполнении программы нужно вернуть код ошибки (чтобы объяснить, как она вышла из строя), тогда как при успешном завершении кода ошибки не будет, то есть мы получим 0. Это отра- жает тот факт, что многие вызовы операционной системы возвращают 0, если все прошло успешно, или –1 (или другое ненулевое значение), если случилась ошибка. Но в bash есть исключение из этого правила для значений в двойных скобках (подробнее об этом — позже).

34 Часть I • Основы
Например,.следующий.скрипт.пытается.изменить.каталоги.в.
/tmp
..Если.эта.коман- да.выполнена.успешно.(возвращает.
0
),.тело.инструкции.
if
.будет.выполнено.
if cd /tmp then echo "here is what is in /tmp:"
ls -l fi
Bash.таким.же.образом.может.обрабатывать.конвейер.команд:
if ls | grep pdf then echo "found one or more pdf files here"
else echo "no pdf files found"
fi
В.случае.конвейера.при.проверке.на.успех/неудачу.именно.последняя.команда.
определяет,.будет.ли.выбрана.true-ветвь..Вот.пример,.где.этот.факт.имеет.зна- чение:
ls | grep pdf | wc
Эта.серия.команд.будет.«истинной»,.даже.если.команда.
grep
.не.найдет.строку.
pdf
Так.происходит.потому,.что.команда.
wc
.будет.успешно.выполнена.и.выведет.сле- дующее:
0 0 0
Этот.вывод.показывает.нулевые.строки,.нулевые.слова.и.нулевые.байты.(симво- лы),.когда.от.команды.
grep
.нет.вывода.данных..Это.успешный.(и,.следовательно,.
верный).результат.для.
wc
,.а.не.ошибка.или.сбой..Получено.столько.строк,.сколько.
было.дано,.даже.если.для.подсчета.было.предоставлено.ноль.строк.
В.более.типичной.форме.команды.
if
,.используемой.для.сравнения,.применяется.
составная.команда.
[[
,.встроенная.команда.оболочки.
[
.или.тест..Укажите.их.для.
проверки.атрибутов.файла.или.сравнения.значений.
Чтобы.проверить,.существует.ли.файл.в.файловой.системе,.выполните.следующую.
команду:
if [[ -e $FILENAME ]]
then echo $FILENAME exists fi


Глава 2. Основы работы с bash 35
В.табл..2.1.перечислены.дополнительные.тесты,.которые.можно.выполнить.в.от- ношении.файлов.с.помощью.
if
Таблица 2.1. Операторы проверки файлов
Оператор проверки файлов Использование
-d
Проверка,.существует.ли.каталог
-e
Проверка,.существует.ли.файл
-r
Проверка,.существует.ли.файл.и.доступен.ли.он.для.чтения
-w
Проверка,.существует.ли.файл.и.доступен.ли.он.для.записи
-x
Проверка,.существует.ли.файл.и.является.ли.он.
исполняемым
Для.проверки.того,.что.переменная.
$VAL
.меньше.переменной.
$MIN
,.введите.следу- ющее:
if [[ $VAL -lt $MIN ]]
then echo "value is too small"
fi
В.табл..2.2.перечислены.дополнительные.числовые.тесты,.которые.можно.выпол- нить.с.помощью.
if
Таблица 2.2. Числовые тестовые операторы
Числовой тестовый оператор Использование
-eq
Тест.на.равенство.между.числами
-gt
Проверка,.больше.ли.одно.число,.чем.другое
-lt
Проверка,.меньше.ли.одно.число,.чем.другое
Будьте осторожны с использованием символа <. Рассмотрим следующий код:
if [[ $VAL < $OTHR ]]
В этом контексте оператор «меньше» использует лексическое (алфавитное) упорядочение. Это означает, что 12 меньше 2, потому что они сортируются в ал- фавитном порядке (так же, как a < b и 1 < 2, но также и 12 < 2).

36 Часть I • Основы
Если.вы.хотите.выполнить.численное.сравнение.со.знаком.«меньше»,.исполь- зуйте.конструкцию.с.двойными.скобками..Предполагается,.что.все.переменные.
являются.числовыми,.поэтому.они.так.и.будут.оцениваться..Пустые.или.не- установленные.переменные.оцениваются.как.0..Внутри.скобок.вам.не.нужен.
оператор.
$
.для.получения.значения,.за.исключением.позиционных.параметров,.
таких.как.
$1
.и.
$2
.(чтобы.не.путать.их.с.константами.
1
.и.
2
)..Например:
if (( VAL < 12 ))
then echo "value $VAL is too small"
fi
В двойных скобках воспроизводится числовая (C/Java/Python) логика повышенного уровня. Любое ненулевое значение считается истинным, и только ноль — обратное значение всем остальным операторам if в bash — ложным. Например:
if (( $? )) ; then echo "previous command failed" ; fi сделает то, что вы хотите/ожидаете, — если предыдущая команда завершилась неудачно, то $? будет содержать ненулевое значение; внутри (( )) ненулевое значение будет истинным и ветвь then будет выполнена.
В.bash.вы.можете.даже.принимать.решения.о.ветвлении.без.явной.конструк- ции.
if
/
then
..Команды.обычно.разделяются.новой.строкой,.то.есть.вводятся.по.
одной.команде.на.строку..Можно.достичь.того.же.эффекта,.разделяя.их.точкой.
с.запятой..Если.вы.пишете.
cd
$DIR
;
ls
,.bash.сначала.выполнит.команду.
cd
,.а.за- тем.команду.
ls
Две.команды.также.могут.быть.разделены.символами.
&&
.или.
||
..Если.вы.напишете.
cd
$DIR
&&
ls
,.команда.
ls
.будет.выполняться.только.в.случае.успешного.выполне- ния.команды.
cd
..Аналогично,.если.вы.введете.
cd
$DIR
||
echo cd failed
,.сообщение.
будет.напечатано.только.в.случае.сбоя.команды.
cd
Вы.можете.использовать.синтаксис.
[[
.для.выполнения.различных.тестов,.даже.без.
задания.в.явном.виде.
if
:
[[ -d $DIR ]] && ls "$DIR"
Это.работает.так.же,.как.если.бы.вы.написали.следующее:
if [[ -d $DIR ]]
then ls "$DIR"
fi


Глава 2. Основы работы с bash 37
При использовании символов && или || вам нужно сгруппировать несколько опера- торов, если в ветви then вы хотите выполнить более одного действия. Например:
[[ -d $DIR ]] || echo "error: no such directory: $DIR" ; exit
Эта команда всегда будет завершаться, независимо от того, является $DIR ката- логом или нет, так как последней командой стоит exit.
Вероятно, вы хотите написать так:
[[ -d $DIR ]] || { echo "error: no such directory: $DIR" ; exit ; }
Здесь скобки сгруппируют оба оператора вместе.
Циклы
Цикл.с.оператором.
while
.по.структуре.похож.на.
if
.в.том.смысле,.что.для.принятия.
решения.он.может.принимать.одну.команду.или.конвейер.команд,.выдающих.
true или.
false
..В.нем.также.можно.использовать.квадратные.или.круглые.скобки,.как.
в.предыдущих.примерах.
В.некоторых.языках.программирования.фигурные.скобки.(символы.
{}
).пред- назначены.для.группировки.операторов,.которые.находятся.в.теле.цикла.
while
В.таких.языках.программирования,.как.Python,.тело.цикла.и.его.операторы.опре- деляются.отступом..В.bash.операторы.сгруппированы.между.двумя.ключевыми.
словами:.
do
.и.
done
Вот.простой.цикл.
while
:
i=0
while (( i < 1000 ))
do echo $i let i++
done
Предыдущий.цикл.будет.выполняться,.пока.значение.переменной.
i
.меньше.1000..
При.каждом.выполнении.тела.цикла.на.экран.будет.выводиться.текущее.значение.
переменной.
i
..После.того.как.значение.переменной.
i
.отобразится.на.экране,.цикл.
использует.команду.
let
.для.выполнения.
i++
.в.качестве.арифметического.выраже- ния,.увеличивая.каждый.раз.значение.
i
.на.1.
Вот.более.сложный.цикл.
while
,.который.выполняет.команды.как.часть.своего.условия:
while ls | grep -q pdf do echo -n 'there is a file with pdf in its name here:'

38 Часть I • Основы pwd cd ..
done
Цикл.
for
.также.доступен.в.bash,.причем.в.трех.вариантах.
Организовать.простой.числовой.цикл.можно.с.использованием.двойных.скобок..
Он.очень.похож.на.цикл.
for
.в.C.или.Java,.но.с.двойными.скобками.и.с.
do
.и.
done вместо.фигурных.скобок:
for ((i=0; i < 100; i++))
do echo $i done
Цикл.
for
.другого.вида.используется.для.перебора.всех.параметров,.которые.пере- даются.сценарию.оболочки.(или.функции.в.сценарии),.то.есть.
$1
,.
$2
,.
$3
.и.т..д..
Обратите.внимание,.что.
ARG
.в.
args.sh
.можно.заменить.любым.именем.переменной.
по.вашему.выбору.
Пример 2.2. args.sh for ARG
do echo here is an argument: $ARG
done
Вот.вывод.для.примера.2.2,.когда.передается.три.параметра:
$ ./args.sh bash is fun here is an argument: bash here is an argument: is here is an argument: fun
Наконец,.для.произвольного.списка.значений.используйте.аналогичную.форму.
оператора.
for
.и.просто.назовите.каждое.из.значений.для.каждой.итерации.цикла..
Этот.список.может.быть.задан.явно,.например,.так:
for VAL in 20 3 dog peach 7 vanilla do echo $VAL
done
Значения,.указанные.в.цикле.
for
,.также.можно.генерировать,.вызывая.другие.про- граммы.или.используя.другие.функции.оболочки:
for VAL in $(ls | grep pdf) {0..5}
do