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

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

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

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

Добавлен: 12.01.2024

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

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


156 Часть II • Защитные операции с использованием bash
Упражнения
Попробуйте.расширить.и.настроить.функционал.инструмента.мониторинга.сети,.
добавив.следующие.возможности.
1.. При.сравнении.двух.отсканированных.файлов.следует.учитывать.разницу.в.их.
размерах.или.разницу.в.наборах.IP-адресов/имен.хостов.
2.. Используйте.
/dev/tcp
.для.создания.простейшего.SMPT-клиента,.чтобы.сцена- рий.не.требовал.наличия.команды.
mail
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/

10
Инструмент: контроль файловой системы
Заражение.файловой.системы.целевого.объекта.вредоносными.программами.
и.другие.вторжения.часто.обнаруживаются.по.изменениям,.которые.вредоносные.
программы.вносят.в.эту.файловую.систему..Для.идентификации.файлов,.которые.
были.добавлены,.удалены.или.изменены,.можно.использовать.свойства.крип- тографической.хеш-функции.и.возможности.командной.строки..Эта.методика.
может.быть.наиболее.эффективной.в.таких.системах,.как.серверы.или.встраива- емые.устройства,.которые.на.регулярной.основе.не.претерпевают.существенных.
изменений.
В.этой.главе.мы.разработаем.инструмент.для.создания.в.файловой.системе.базо- вого.файла,.в.котором.зафиксируем.текущее.состояние.файловой.системы..Далее,.
используя.этот.базовый.файл,.мы.сравним.зафиксированное.состояние.системы.
с.более.поздним.и.определим,.были.ли.файлы.добавлены,.удалены.или.изменены..
Для.этого.требуется.следующее.
1.. Записать.путь.к.каждому.файлу.в.данной.системе.
2.. Создать.для.каждого.файла.этой.системы.хеш.SHA-1.
3.. Повторно.запустить.инструмент.и.вывести.имена.всех.файлов,.которые.были.
изменены,.удалены,.перемещены,.или.имена.новых.файлов.
Используемые команды
В.этой.главе.для.сравнения.файлов.мы.воспользуемся.командой.
sdiff sdiff
Команда.
sdiff
.сравнивает.два.файла,.находящихся.рядом,.и.показывает.все.их.
различия.

158 Часть II • Защитные операции с использованием bash
Общие параметры команды
‰
‰ -a
.—.рассматривать.все.файлы.как.текстовые.
‰
‰ -i
.—.игнорировать.регистр.
‰
‰ -s
.—.удалять.общие.строки.для.двух.файлов.
‰
‰ -w
.—.определить.максимальное.количество.символов.для.вывода.в.строке.
Пример команды
Чтобы.сравнить.два.файла.и.вывести.только.строки,.которые.отличаются,.введите.
следующее:
sdiff -s file1.txt file2.txt
Шаг 1. Определение исходного состояния файловой системы
Определение.исходного.состояния.файловой.системы.включает.в.себя.вычисление.
цифровой.последовательности.сообщения.(хеш-значения).каждого.файла,.находя- щегося.в.настоящее.время.в.системе,.и.запись.результатов.в.файл..Для.определения.
исходного.состояния.вы.можете.использовать.команды.
find
.и.
sha1sum
:
SYSNAME="$(uname -n)_$(date +'%m_%d_%Y')" ; sudo find / -type f |
xargs -d '\n' sha1sum > ${SYSNAME}_baseline.txt 2>${SYSNAME}_error.txt
Чтобы.обеспечить.доступ.ко.всем.файлам,.при.работе.в.операционной.системе.
Linux.мы.используем.команду.
sudo
..Для.каждого.найденного.файла.вычисляем.
хеш.
SHA1
.с.помощью.
sha1sum
,.но.
sha1sum
.вызываем.командой.
xargs
..Она.помещает.
в.командную.строку.
sha1sum
.столько.имен.файлов.(входных.данных,.которые.она.
считывает.из.конвейера),.сколько.может.(ограничивается.памятью)..Это.будет.
намного.эффективнее,.чем.вызывать.команду.
shal1sum
.для.каждого.отдельно- го.файла..Вместо.этого.данная.команда.будет.вызываться.один.раз.на.каждые.
1000.файлов.или.более.(в.зависимости.от.длины.пути)..Мы.перенаправляем.
вывод.в.файл,.содержащий.как.имя.системы,.так.и.текущую.дату,.—.это.важная.
информация.для.целей.организации.и.определения.времени..Мы.также.перена- правляем.все.сообщения.об.ошибках.в.отдельный.файл.журнала,.который.можно.
просмотреть.позже.
В.примере.10.1.показан.созданный.базовый.файл.вывода..Первый.столбец.содержит.
хеш.SHA1,.а.второй.столбец.—.файл,.который.представляет.данный.хеш.


Глава 10. Инструмент: контроль файловой системы 159
Пример 10.1. baseline.txt
3a52ce780950d4d969792a2559cd519d7ee8c727 /.gitkeep ab4e53fda1a93bed20b1cc92fec90616cac89189 /autoscan.sh ccb5bc521f41b6814529cc67e63282e0d1a704fe /fd2.sh baea954b95731c68ae6e45bd1e252eb4560cdc45 /ips.txt
334389048b872a533002b34d73f8c29fd09efc50 /localhost
При использовании в Git Bash команды sha1sum в файле вывода в начале файлового пути часто добавляется символ *. Это может помешать в дальнейшем использовать базовый файл для выявления изменений. Можно направить вывод sha1sum в команду sed, чтобы удалить первое вхождение символа *:
sed 's/*//'
Для.достижения.наилучших.результатов.желательно.провести.определение.исход- ного.состояния.файловой.системы,.когда.система.находится.в.заведомо.хорошей.
конфигурации,.например,.когда.стандартная.операционная.система,.приложения.
и.исправления.только.что.были.установлены..Это.гарантирует,.что.вредоносные.
программы.или.другие.нежелательные.файлы.не.станут.частью.файла,.в.котором.
зафиксировано.исходное.состояние.системы.
Шаг 2. Обнаружение изменений в исходном состоянии системы
Чтобы.обнаружить.изменения.в.системе,.необходимо.сравнить.ранее.записанное.
исходное.состояние.системы.с.ее.текущим.состоянием..При.сравнении.происхо- дит.пересчет.вычисленной.цифровой.последовательности.сообщения.(хеша).для.
каждого.файла,.находящегося.в.системе,.и.сравнение.вновь.полученного.значения.
с.последним,.ранее.зафиксированным.значением.(в.базовом.файле)..Если.значения.
различаются,.значит,.файл,.хеш.которого.проверяется,.претерпел.изменения..Если.
файл.упоминается.в.базовом.списке,.но.в.системе.отсутствует,.следовательно,.он.
был.удален,.перемещен.или.переименован..Если.файл.в.системе.существует,.но.
в.базовом.списке.отсутствует,.можно.предположить,.что.это.новый.файл.или.файл,.
который.был.перемещен.или.переименован.
Команда.
sha1sum
.хороша.тем,.что,.если.вы.просто.используете.параметр.
–с
,.она.сде- лает.большую.часть.работы.за.вас..С.помощью.этой.опции.
sha1sum
.будет.считывать.

160 Часть II • Защитные операции с использованием bash в.файл.ранее.созданные.дайджесты.сообщений.и.пути.и.проверять,.совпадают.ли.
хеш-значения..Чтобы.отобразить.только.несовпадающие.файлы,.используйте.па- раметр.
--quiet
:
$ sha1sum -c --quiet baseline.txt sha1sum: /home/dave/file1.txt: No such file or directory

/home/dave/file1.txt: FAILED open or read

/home/dave/file2.txt: FAILED

sha1sum: WARNING: 1 listed file could not be read sha1sum: WARNING: 2 computed checksums did NOT match
.Здесь.отображаются.выходные.данные.stderr,.указывающие.на.то,.что.файл.
больше.недоступен..Это.связано.с.перемещением,.удалением.или.переименованием.
файла..Вывод.можно.скрыть,.перенаправив.stderr.в.файл.или.
/dev/null
.Это.сообщение.stdout,.информирующее,.что.указанный.файл.не.найден.
.Данное.сообщение.означает,.что.файл,.указанный.в.
baseline.txt
,.найден,.но.
дайджест.сообщения.не.совпадает,.то.есть.файл.каким-то.образом.изменился.
Единственное,.что.
sha1sum
.не.может.сделать.для.вас,.—.это.определить,.что.новый.
файл.был.добавлен.в.систему..Но.у.вас.есть.все.необходимое,.чтобы.определить.
данное.изменение.самостоятельно..Базовый.файл.содержит.путь.ко.всем.фай- лам,.которые.находились.в.системе.на.момент.его.создания..Все,.что.вам.нужно.
сделать,.—.создать.новый.список.файлов,.находящихся.на.данный.момент.в.си- стеме,.и,.чтобы.идентифицировать.новые.файлы,.сравнить.его.с.базовым.файлом..
Для..этого.можно.использовать.команды.поиска.и.объединения..
Первым.шагом.станет.создание.нового.списка.всех.файлов,.находящихся.на.данный.
момент.в.системе,.и.сохранение.базового.файла:
find / -type f > filelist.txt
В.примере.10.2.показан.образец.содержимого.файла.
filelist.txt
Пример 10.2. filelist.txt
/.gitkeep
/autoscan.sh
/fd2.sh
/ips.txt
/localhost
Затем.для.сравнения.базового.файла.с.текущим.списком.файлов.можно.исполь- зовать.команду.
join
..Вы.будете.сравнивать.ранее.записанный.базовый.файл.


Глава 10. Инструмент: контроль файловой системы 161
(
baseline.txt
).и.сохраненный.вывод,.полученный.с.помощью.команды.
find
(
filelist.txt
).
Для.правильной.работы.команды.
join
.требуется,.чтобы.оба.файла.были.отсортиро- ваны.с.использованием.одного.и.того.же.поля.данных..При.сортировке.
baseline.txt файл.должен.быть.упорядочен.по.второму.полю.(
-k2
),.поскольку.требуется.ис- пользовать.путь.к.файлу,.а.не.значение.дайджеста.сообщения..Необходимо.также.
обязательно.сопоставить.одни.и.те.же.поля.данных:.поле.
1
.в.файле.
filelist.txt
(-1 1
).и.поле.
2
.в.файле.
baseline.txt
.(
-2 2
)..Если.совпадение.не.найдено,.параметр.
-a
1
.указывает.команде.
join
.выводить.поле.из.первого.файла:
$ join -1 1 -2 2 -a 1 <(sort filelist.txt) <(sort -k2 baseline.txt)
/home/dave/file3.txt 824c713ec3754f86e4098523943a4f3155045e19

/home/dave/file4.txt

/home/dave/filelist.txt
/home/dave/.profile dded66a8a7137b974a4f57a4ec378eda51fbcae6
.Было.выполнено.сопоставление,.и.мы.определили,.что.данный.файл.существует.
как.в.
filelist.txt
,.так.и.в.
baseline.txt
.В.данном.случае.совпадений.не.выявлено..Файл,.обнаруженный.в.базовом.файле.
filelist.txt
,.в.
baseline.txt
.отсутствует..Это.значит,.что.обнаруженный.файл.
новый,.перемещенный.или.переименованный.
Чтобы.идентифицировать.новые.файлы,.вам.нужно.искать.в.выводе.строки,.кото- рые.не.имеют.дайджеста.сообщения..Вы.можете.сделать.это.вручную.или.передать.
вывод.в.
awk
.и.отобразить.строки.со.вторым.пустым.полем:
$ join -1 1 -2 2 -a 1 <(sort filelist.txt) <(sort -k2 baseline.txt) |
awk '{if($2=="") print $1}'
/home/dave/file4.txt
/home/dave/filelist.txt
Другой.способ.идентифицировать.новые.файлы.—.использовать.команду.
sdiff
Она.выполняет.параллельное.сравнение.двух.файлов..Если.не.было.добавлено.или.
удалено.большое.количество.файлов,.
baseline.txt
.и.
filelist.txt
.должны.быть.
одинаковы..Поскольку.оба.файла.с.помощью.команды.
find
.были.созданы.из.одной.
и.той.же.точки,.они.должны.быть.отсортированы.в.одном.и.том.же.порядке..Чтобы.
пропустить.одинаковые.строки.и.показать.только.разницу,.команду.
sdiff
.следует.
использовать.совместно.с.параметром.
-s
:
$ cut -c43- ../baseline.txt | sdiff -s -w60 - ../filelist.txt
> ./prairie.sh
./why dot why | ./ex dot ex
./x.x <

1   ...   11   12   13   14   15   16   17   18   ...   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
# создайте базовый файл (предоставляется только одно имя файла)
# либо сделайте вторичные краткие выводы (при наличии двух имен файлов)
parseArgs
BASE="$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 FN
do
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. Инструмент: контроль файловой системы 167
4.. Как.можно.изменить.сценарий.
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' | xxd
00000000: 41

172 Часть II • Защитные операции с использованием bash
Для.преобразования.шестнадцатеричного.кода.в.ASCII.используйте.команду.
xxd с.параметром.
-r
:
$ printf 0x41 | xxd –r
A
Чтобы.преобразовать.из.ASCII.в.двоичный.код,.вы.можете.передать.символ.в.
xxd и.использовать.параметр.
-b
:
$ printf 'A' | xxd –b
00000000: 01000001
В показанных примерах вместо команды echo умышленно используется команда printf. Это объясняется тем, что команда echo автоматически добавляет в вывод лишний символ. Его можно увидеть здесь:
$ echo 'A' | xxd
00000000: 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 helloworld
00000000: 7f45 4c46 .ELF
Пятый.байт.файла.покажет.вам.архитектуру.этого.файла:.является.ли.он.32-раз- рядным.(0x01).или.64-разрядным.(0x02).исполняемым.файлом..В.данном.случае.
это.64-разрядный.исполняемый.файл:
$ xxd -s 4 -l 1 helloworld
00000004: 02
Шестой.байт.описывает.порядок.записи.байтов:.little-endian.(от.младшего.к.стар- шему).(0x01).или.big-endian.(от.старшего.к.младшему).(0x02)..В.данном.случае.
порядок.записи.байтов.little-endian:
$ xxd -s 5 -l 1 helloworld
00000005: 01
Формат.и.порядок.байтов.—.важная.информация,.используемая.для.анализа.
остальной.части.файла..Например,.8.байт.64-битного.файла.ELF,.начинающихся.
с.0x20,.определяют.заголовок.программы:
$ xxd -s 0x20 -l 8 helloworld
00000020: 4000 0000 0000 0000
Нам.уже.известно,.что.порядок.записи.нашего.файла.—.little-endian,.поэтому.за- головок.начинается.с.0x40.
Эти.данные.мы.можем.использовать.для.отображения.заголовка.программы,.длина.
которого.для.64-битного.ELF-файла.должна.составлять.0x38.байт:
$ xxd -s 0x40 -l 0x38 helloworld
00000040: 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/2FDm67s
Hex-редактор..Иногда.вам.может.потребоваться.отобразить.и.отредактировать.
файл.в.шестнадцатеричном.формате..Для.этого.следует.использовать.команду.
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
Взаимодействие с VirusTotal
VirusTotal.—.это.коммерческий.онлайн-инструмент,.который.используется.для.
выгрузки.файлов.и.проверки.их.множеством.антивирусных.движков.и.дру- гих.инструментов.статического.анализа,.чтобы.определить,.являются.ли.эти.
файлы.вредоносными..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,.file
VirusTotal.хранит.историю.всех.файлов,.которые.ранее.были.загружены.и.проана- лизированы..Чтобы.определить,.есть.ли.отчет.по.этому.файлу,.можно.выполнить.
поиск.в.базе.данных.с.помощью.хеша.подозрительного.файла..Это.избавит.вас.от.
необходимости.фактически.выгружать.файл..Недостаток.этого.метода.в.том,.что,.
если.данный.файл.в.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 ALINE
do 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
Параметры
Отчет.по.URL
https://www.virustotal.com/vtapi/v2/url/report apikey,.resource,.
allinfo,.scan
Доменный.отчет https://www.virustotal.com/vtapi/v2/domain/report apikey,.domain
Отчет.по.IP
https://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 db349b97c37d22f5ea1d1841e3c89eb4
Detected: 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


  1. This is list item 1


  2. 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 "" # заголовок столбца echo ""
    echo ""
    echo ""
    echo ""
    echo ""
    echo ""
    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 "
    IP AddressDateURL RequestedStatus CodeSizeReferrerUser Agent
    "
    echo "

    $1


    EOF
    Преимущество.этого.кода.в.том,.что.не.требуется.повторять.все.команды.
    echo
    Обратите.внимание:.все.равно.потребуется.выполнить.замену.
    $1
    ,.если.при.вызове.
    не.будет.ссылки.на.
    EOF
    .в.любой.форме..Однако.в.этом.решении.есть.один.недоста- ток:.в.таком.случае.мы.не.сможем.добавлять.в.наш.ввод.комментарии.
    .Файл.журнала.—.это.файл.фиксированного.формата,.по.крайней.мере.для.не- скольких.первых.полей..Здесь.мы.можем.прочитать.каждую.строку.из.файла.жур- нала.и.разобрать.ее.на.поля..Для.чтения.всех.полей.в.массив.можно.использовать.
    конструкцию.
    read
    -a
    RAOFTXT
    ,.по.одному.полю.для.каждого.индекса..Но.при.таком.
    подходе.становится.сложно.распечатать.все.оставшиеся.поля,.расположенные.по- сле.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. Форматирование и отчетность 193
    trap cleanup EXIT
    # запустить процесс bg
    TMPFILE=$(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 3
    done
    .Команда.
    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.log
    2.. Напишите.сценарий,.подобный.примеру.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.com
    HTTP/1.1 200 OK
    Server: Apache/2.4.7 (Ubuntu)
    Last-Modified: Fri, 19 Oct 2018 08:30:02 GMT
    Content-Type: text/html
    Cache-Control: max-age=7428
    Expires: Fri, 19 Oct 2018 16:16:48 GMT
    Date: Fri, 19 Oct 2018 14:13:00 GMT
    Connection: 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 OK
    Server: Apache/2.4.7 (Ubuntu)
    Last-Modified: Fri, 19 Oct 2018 08:30:02 GMT
    Content-Type: text/html
    Cache-Control: max-age=7428
    Expires: Fri, 19 Oct 2018 16:16:48 GMT
    Date: Fri, 19 Oct 2018 14:13:00 GMT
    Connection: keep-alive
    Ценной.считается.информация.о.том,.в.какой.операционной.системе.работает.по- тенциальная.цель..Получив.эту.информацию,.вы.можете.узнать,.какие.уязвимости.
    могут.существовать.в.данной.системе..Впоследствии.эти.уязвимости.можно.ис- пользовать.на.начальном.этапе.жизненного.цикла.атаки.
    Баннеры.обычно.отображают.несколько.типов.систем,.включая.веб-серверы,.FTP- серверы.и.серверы.протокола.SMTP.(Simple.Mail.Transfer.Protocol)..В.табл..13.1.
    показаны.сетевые.порты,.которые.обычно.используются.этими.службами.

    Глава 13. Разведка 201
    Таблица 13.1. Стандартные порты
    Протокол сервера
    Номер порта
    FTP
    TCP.21
    SMTP
    TCP.25
    HTTP
    TCP.80
    В большинстве операционных систем баннер может быть изменен системным администратором. Баннер можно удалить полностью либо заставить его сооб- щать ложную информацию. Его также можно рассматривать как индикатор типа операционной системы или приложения, но полностью ему доверять нельзя.
    В.главе.9.мы.рассматривали,.как.с.помощью.сценария.
    scan.sh
    .сканировать.сетевой.
    порт..Этот.сценарий.можно.расширить.таким.образом,.что.при.каждом.обнаруже- нии.узла.с.одним.из.открытых.портов.(FTP,.SMTP.или.HTTP).он.будет.пытаться.
    получить.и.сохранить.баннер.сервера.
    Вы.уже.видели,.как.можно.использовать.команду.
    curl
    .для.захвата.заголовка.
    HTTP,.который.может.содержать.баннер:
    curl -LI https://www.oreilly.com
    Для.захвата.баннера.с.FTP-сервера.можно.использовать.команду.
    ftp
    :
    $ ftp -n 192.168.0.16
    Connected to 192.168.0.16.
    220 (vsFTPd 3.0.3)
    ftp>
    Параметр.
    -n
    .применяется,.чтобы.команда.
    ftp
    .не.пыталась.автоматически.войти.
    на.сервер..Чтобы.после.подключения.закрыть.FTP-соединение,.с.терминала.
    ftp>
    введите.команду.
    quit
    Самый.простой.способ.перехватить.баннер.с.SMTP-сервера.—.использовать.
    команду.
    telnet
    .с.сетевым.портом.
    25
    :
    $ telnet 192.168.0.16 25
    Connected to 192.168.0.16
    Escape 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