Файл: Paul Troncone and Carl AlbingCybersecurity Ops with bashAttack, Defend, and Analyze from the.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 459
Скачиваний: 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. Анализ данных 123
max=0
maxbar=50 # размер самой длинной строки ndx=0
while 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.sh
192.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.sh
17 ##
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
,.чтобы.ее.можно.
было.сравнить.с.каждой.переменной.
$1
awk
.(то.есть.с.каждым.первым.полем.вход- ных.данных).
.Простой.синтаксис.приводит.к.тому,.что.переменная.
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.txt
Firefox
Chrome
Safari
Edge
Список популярных пользовательских агентов можно найти по адресу 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
Пример 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. Анализ данных 123
max=0
maxbar=50 # размер самой длинной строки ndx=0
while 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.sh
192.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.sh
17 ##
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
,.чтобы.ее.можно.
было.сравнить.с.каждой.переменной.
$1
awk
.(то.есть.с.каждым.первым.полем.вход- ных.данных).
.Простой.синтаксис.приводит.к.тому,.что.переменная.
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.txt
Firefox
Chrome
Safari
Edge
Список популярных пользовательских агентов можно найти по адресу 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
#!/bin/bash -
#
# Bash и кибербезопасность
# histogram_plain.sh
#
# Описание:
# Создание горизонтальной гистограммы с указанными данными без использования
# ассоциативных массивов, хорошо подходит для старых версий bash
#
# Использование: ./histogram_plain.sh
# формат ввода: label value
#
declare -a RA_key RA_val
declare -i max ndx
Глава 7. Анализ данных 123
max=0
maxbar=50 # размер самой длинной строки ndx=0
while 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.sh
192.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.sh
17 ##
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
#
#
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
#
#
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
,.чтобы.ее.можно.
было.сравнить.с.каждой.переменной.
$1
awk
.(то.есть.с.каждым.первым.полем.вход- ных.данных).
.Простой.синтаксис.приводит.к.тому,.что.переменная.
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.txt
Firefox
Chrome
Safari
Edge
Список популярных пользовательских агентов можно найти по адресу http://
bit.ly/2WugjXl.
Затем.вы.можете.прочитать.журнал.веб-сервера.и.сравнить.каждую.строку.со.
списком.популярных.пользовательских.агентов.(браузеров),.пока.не.будет.по- лучено.совпадение..Если.совпадения.не.будет,.строка.должна.рассматриваться.
как.аномалия.и.печататься.в.стандартном.выводе.вместе.с.IP-адресом.системы,.
выполняющей.запрос..Такое.сравнение.дает.нам.дополнительную.информацию,.
связанную.с.рассматриваемыми.данными,.—.с.ее.помощью.мы.сможем.идентифи- цировать.систему.с.необычным.пользовательским.агентом.и.получим.еще.один.
путь.для.дальнейшего.изучения.
Пример 7.11. useragents.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# useragents.sh
#
# Описание:
# Чтение журнала и поиск неизвестных пользовательских агентов
#
# Использование: ./useragents.sh <
#
#
# несовпадение — поиск по массиву известных имен
# возвращает 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
132 Часть II • Защитные операции с использованием bash
Замените.команду.
cut
.командой.
awk
..Вы.получили.те.же.результаты?.Какие.
различия.вы.увидели.в.этих.двух.методах?
2.. Разверните.сценарий.
histogram.sh
,.чтобы.включить.счетчик.в.конце.каждой.
гистограммы..Вот.пример.выходных.данных:
192.168.0.37 ############################# 2575030 192.168.0.2 ####### 665693 3.. Разверните.сценарий.
histogram.sh
,.чтобы.пользователь.мог.указать.параметр.
-s
,.
определяющий.максимальный.размер.столбца..Например,.
histogram.sh
-s
25
ограничит.максимальный.размер.столбца.до.25.символов.#..Если.параметр.
не.задан,.значение.по.умолчанию.должно.оставаться.равным.50.
4.. Измените.сценарий.
useragents.sh
.так,.чтобы.добавить.следующие.параметры.
y
Добавьте.код.для.необязательного.первого.параметра,.такого.как.имя.
файла.известных.хостов..Если.этот.параметр.не.указан,.по.умолчанию.
используется.имя.
known.hosts
.в.том.виде,.в.котором.оно.представлено.
в.данный.момент.
y
Добавьте.код.для.параметра.
-f
,.чтобы.принять.аргумент..Аргумент.—.это.имя.
файла.журнала,.предназначенного.для.чтения,.а.не.для.получения.из.stdin.
5.. Измените.сценарий.
pagereq.sh
.так,.чтобы.он.работал.с.традиционным.масси- вом,.использующим.числовой.индекс,.а.не.с.ассоциативным.массивом..Чтобы.
можно.было.задействовать.IP-адрес,.преобразуйте.его.в.10–12-значное.число..
Внимание!.Не.указывайте.перед.числом.нули,.так.как.оболочка.попытается.
интерпретировать.его.как.восьмеричное..Например,.преобразуйте.10.124.16.3.
в.10124016003.и.используйте.в.качестве.числового.индекса.
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
8
Мониторинг журналов в режиме реального времени
Умение.анализировать.журнал.после.того,.как.событие.произошло,.—.важный.
навык..Но.не.менее.важно.иметь.возможность.извлекать.информацию.из.файла.
журнала.в.режиме.реального.времени,.чтобы.обнаруживать.вредоносные.или.подо- зрительные.действия.в.то.время,.когда.они.происходят..В.этой.главе.мы.рассмотрим.
методы.чтения.записей.журнала.по.мере.их.создания.и.форматирования.для.вывода.
аналитики.и.создания.предупреждений.на.основе.известных.показателей.угрозы.
для.работы.системы.или.сети.(indicators.of.compromise).
Техническое обслуживание, мониторинг и анализ журналов аудита определены
Центром интернет-безопасности в качестве 20 основных элементов контроля безопасности. Дополнительные сведения можно получить на странице https://
www.cisecurity.org/controls/.
Мониторинг текстовых журналов
Самый.простой.способ.мониторинга.журнала.в.режиме.реального.времени.—.ис- пользовать.команду.
tail
.с.параметром.
–f
.—.она.непрерывно.считывает.файл.и.по.
мере.добавления.новых.строк.выводит.их.в.stdout..Как.и.в.предыдущих.главах,.для.
примеров.будем.использовать.журнал.доступа.к.веб-серверу.Apache,.но.описанные.
методы.актуальны.для.любого.текстового.журнала..Чтобы.отслеживать.журнал.
доступа.Apache.с.помощью.команды.
tail
,.введите.следующее:
tail -f /var/logs/apache2/access.log
Вывод.из.команды.
tail
.может.быть.передан.команде.
grep
,.поэтому.будут.выво- диться.только.записи,.соответствующие.определенным.критериям..В.следующем.
примере.отслеживается.журнал.доступа.Apache.и.выводятся.записи,.соответству- ющие.конкретному.IP-адресу:
tail -f /var/logs/apache2/access.log | grep '10.0.0.152'
134 Часть II • Защитные операции с использованием bash
Можно.также.использовать.регулярные.выражения..В.этом.примере.будут.ото- бражаться.только.записи,.возвращающие.код.состояния.HTTP.404.«Страница.
не.найдена»;.параметр.
-i
.добавляется.для.игнорирования.регистра.символов:
tail -f /var/logs/apache2/access.log | egrep -i 'HTTP/.*" 404'
Для.очистки.от.посторонней.информации.вывод.следует.передать.команде.
cut
В.этом.примере.выполняется.мониторинг.журнала.доступа.для.запросов,.при- водящих.к.коду.состояния.404,.а.затем.используется.метод.
cut
.для.отображения.
только.даты/времени.и.запрашиваемой.страницы:
$ tail -f access.log | egrep --line-buffered 'HTTP/.*" 404' | cut -d' ' -f4-7
[29/Jul/2018:13:10:05 -0400] "GET /test
[29/Jul/2018:13:16:17 -0400] "GET /test.txt
[29/Jul/2018:13:17:37 -0400] "GET /favicon.ico
Далее,.чтобы.убрать.квадратные.скобки.и.двойные.кавычки,.вы.можете.направить.
вывод.в.
tr
-d
'[]"'
Обратите.внимание:.здесь.используется.параметр.
--line-buffering
.команды.
egrep
Это.вынуждает.
egrep
.выводить.в.stdout.каждый.раз,.когда.происходит.разрыв.стро- ки..Без.данного.параметра.произойдет.буферизация.и.выходные.данные.не.будут.
переданы.команде.
cut
.до.тех.пор,.пока.буфер.не.будет.заполнен..Мы.не.хотим.так.
долго.ждать..Данный.параметр.позволит.команде.
egrep
.записывать.каждую.строку.
сразу.по.мере.ее.нахождения.
БУФЕРЫ КОМАНДНОЙ СТРОКИ
Что.же.происходит.при.буферизации?.Представьте,.что.
egrep
.находит.много.строк,.
соответствующих.указанному.шаблону..В.этом.случае.у.
egrep
.будет.много.выходных.
данных..Но.вывод.(фактически.любой.ввод.или.вывод).намного.затратнее.(занимает.
больше.времени),.чем.обработка.данных.(поиск.текста)..Таким.образом,.чем.меньше.
вызовов.ввода/вывода,.тем.эффективнее.будет.работа.программы.
При. обнаружении. совпадения. семейство. программ.
grep
. копирует. совпадающую.
строку.в.большую.область.памяти,.называемую.буфером,.в.котором.достаточно.места.
для. размещения. большого. количества. строк. текста.. После. поиска. и. копирования.
множества.совпадающих.строк.буфер.заполнится..Затем.
grep
.делает.один.вызов.для.
вывода. всего. буфера.. Представьте. себе. случай,. когда.
grep
. может. поместить. 50. со- впадающих. строк. в. буфер.. В. этом. случае,. вместо. того. чтобы. сделать. 50. выходных.
вызовов,.по.одному.для.каждой.строки,.необходимо.сделать.только.один.вызов..Это.
в.50.раз.эффективнее!
Это.хорошо.работает.для.большинства.применений.программы.
egrep
,.например,.когда.
мы.проводим.поиск.в.файле.и.просматриваем.его.от.начала.до.конца..Программа.
egrep
Глава 8. Мониторинг журналов в режиме реального времени 135
будет.записывать.каждую.найденную.строку.в.буфер,.и.не.потребуется.много.време- ни,.чтобы.добраться.до.конца.файла..По.достижении.конца.файла,.когда.поступление.
данных. прекратится,.буфер. будет. очищен,. то. есть. содержимое.буфера. будет. запи- сано,.даже.если.он.заполнен.только.частично..Когда.входные.данные.поступают.из.
файла,.обычно.этот.процесс.идет.быстро.
Но.при.чтении.из.конвейера,.особенно.для.нашего.примера,.когда.
tail
-f
.вносит.дан- ные.в.конвейер.не.так.часто.(только.когда.происходят.определенные.события),.данных.
для.заполнения.буфера.может.не.хватить..Буфер,.чтобы.мы.увидели.его.содержимое.
в.«реальном.времени»,.в.ближайшее.время.не.будет.очищен..Нам.придется.подождать.
его.заполнения..А.на.это.может.уйти.несколько.часов.или.даже.дней.
Решение. состоит. в. том,. чтобы. по. мере. нахождения. каждой. строки. указать.
egrep использовать.менее.эффективную.технику.записи,.по.одной.строке.за.раз..Команда.
при.обнаружении.каждого.совпадения.будет.сохранять.данные,.перемещающиеся.по.
конвейеру.
Обнаружение вторжений с помощью журнала
Для.мониторинга.журнала.и.вывода.любых.записей,.которые.соответствуют.извест- ным.шаблонам.подозрительной.или.вредоносной.деятельности,.часто.называемым.
IOC,.можно.использовать.возможности.команд.
tail
.и.
egrep
..Вы.можете.создать.
простую.систему.обнаружения.вторжений.(IDS)..Для.начала.создадим.файл,.со- держащий.шаблоны.регулярных.выражений.для.IOC,.как.показано.в.примере.8.1.
Пример 8.1. ioc.txt
\.\./
etc/passwd
etc/shadow cmd\.exe
/bin/sh
/bin/bash
.Этот.шаблон.(
../
).является.показателем.обходной.атаки.каталога:.злоумышлен- ник.пытается.выйти.из.текущего.рабочего.каталога.и.добраться.к.файлам,.доступ.
к.которым.ему.закрыт.
.Файлы.Linux.
etc/passwd
.и.
etc/shadow
.используются.для.аутентификации.си- стемы.и.никогда.не.должны.быть.доступны.через.веб-сервер.
.Обслуживание.файлов.
cmd.exe
,.
/bin/sh
.или.
/bin/bash
.является.показателем.
наличия.обратного.подключения,.возвращаемого.веб-сервером..Обратное.под- ключение.часто.говорит.об.успешной.попытке.эксплуатации.
136 Часть II • Защитные операции с использованием bash
Обратите.внимание,.что.IOC.должны.быть.в.формате.регулярного.выражения,.
так.как.они.позже.будут.использоваться.командой.
egrep
Мы не можем подробно обсуждать IOC для веб-серверов, так как показателей компрометации слишком много. Дополнительные примеры таких показателей можно скачать на сайте http://bit.ly/2uss44S.
Файл.
ioc.txt
.можно.использовать.с.параметром.
egrep
-f
..Данный.параметр.при- казывает.
egrep
.выполнять.поиск.в.шаблонах.регулярных.выражений.из.указанного.
файла..Это.позволяет.вам.использовать.команду.
tail
.для.мониторинга.файла.
журнала,.и.при.добавлении.каждой.записи.прочитанная.строка.будет.сравнивать- ся.со.всеми.шаблонами.в.файле.IOC,.выводя.любую.соответствующую.запись..
Вот.пример:
tail -f /var/logs/apache2/access.log | egrep -i -f ioc.txt
Кроме.того,.команда.
tee
.может.использоваться.для.одновременного.отображения.
предупреждений.на.экране.и.сохранения.их.для.последующей.обработки.в.соб- ственном.файле:
tail -f /var/logs/apache2/access.log | egrep --line-buffered -i -f ioc.txt |
tee -a interesting.txt
Опять.же.опция.
--line-buffered
.нужна,.чтобы.гарантировать.отсутствие.проблем,.
вызванных.буферизацией.вывода.команды.
Мониторинг журналов Windows
Как.уже.говорилось,.для.доступа.к.событиям.Windows.нужно.использовать.коман- ду.
wevtutil
..Хотя.эта.команда.универсальна,.она.не.имеет.такой.функционально- сти,.как.
tail
,.которую.можно.задействовать.для.извлечения.новых.поступающих.
записей..Но.выход.есть.—.использовать.простой.сценарий.bash,.который.может.
предоставить.такую.же.функциональность.(пример.8.2).
Пример 8.2. wintail.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# wintail.sh
#
# Описание:
# Выполнение функции наподобие tail для журнала Windows
Глава 8. Мониторинг журналов в режиме реального времени 137
#
# Использование: ./wintail.sh
#
WINLOG="Application"
LASTLOG=$(wevtutil qe "$WINLOG" //c:1 //rd:true //f:text)
while true do
CURRENTLOG=$(wevtutil qe "$WINLOG" //c:1 //rd:true //f:text)
if [[ "$CURRENTLOG" != "$LASTLOG" ]]
then echo "$CURRENTLOG"
echo "----------------------------------"
LASTLOG="$CURRENTLOG"
fi done
.Этой.переменной.определяется.журнал.Windows,.который.вы.хотите.отслежи- вать..Для.получения.списка.журналов,.доступных.в.системе.в.настоящее.время,.
можете.использовать.команду.
wevtutil el
.Здесь.для.запроса.указанного.файла.журнала.выполняется.команда.
wevtutil
Параметр.
c:1
.возвращает.только.одну.запись.журнала..Параметр.
rd:true
.позволяет.
команде.считать.самую.последнюю.запись.журнала..Наконец,.
f:text
.возвращает.
результат.в.виде.обычного.текста,.а.не.в.формате.XML,.что.позволяет.легко.читать.
результат.с.экрана.
.В.следующих.нескольких.строках.снова.выполняется.команда.
wevtutil
.и.только.
что.полученная.запись.журнала.сравнивается.с.той,.которая.была.напечатана.на.
экране.последней..Если.они.друг.от.друга.отличаются,.это.означает,.что.в.журнале.
произошли.изменения..В.этом.случае.на.экран.выводится.новая.запись..Если.же.
сравниваемые.записи.одинаковы,.ничего.не.происходит.и.команда.
wevtutil
.воз- вращается.назад.и.снова.начинает.поиск.и.сравнение.
Создание гистограммы, актуальной в реальном времени
Команда.
tail
-f
.обеспечивает.текущий.поток.данных..А.что.делать,.если.требуется.
подсчитать.количество.строк,.которые.были.добавлены.в.файл.за.определенный.
промежуток.времени?.За.этим.потоком.данных.можно.понаблюдать,.запустить.
таймер.и.выполнять.подсчет.на.протяжении.заданного.промежутка.времени;.затем.
подсчет.следует.прекратить.и.сообщить.о.результатах.
138 Часть II • Защитные операции с использованием bash
Эту.работу.можно.разделить.на.два.процесса-сценария:.один.сценарий.будет.счи- тать.строки,.а.другой.—.наблюдать.за.временем..Таймер.уведомляет.счетчик.строк.
с.помощью.стандартного.механизма.межпроцессной.связи.POSIX,.называемого.
сигналом..Сигнал.—.это.программное.прерывание,.и.существуют.различные.виды.
сигналов..Некоторые.из.них.являются.фатальными.—.приводят.к.завершению.
процесса.(например,.исключение.в.операции.с.плавающей.запятой)..Большинство.
из.этих.сигналов.могут.быть.как.проигнорированы,.так.и.пойманы..Действие.пред- принимается,.когда.сигнал.пойман..Многие.из.этих.сигналов.имеют.предопреде- ленное.назначение.в.операционной.системе..Мы.будем.использовать.один.из.двух.
сигналов,.доступных.пользователям..Это.сигнал.
SIGUSR1
.(другой.—.это.
SIGUSR2
).
Сценарии.оболочки.могут.перехватывать.прерывания,.используя.встроенную.
коман.ду.
trap
..С.ее.помощью.можно.выбрать.команду,.определяющую,.какое.дей- ствие.требуется.выполнить.при.получении.сигнала,.и.список.сигналов,.запуска- ющих.вызов.данной.команды..Например:
trap warnmsg SIGINT
Это.приводит.к.тому,.что.команда.
warnmsg
.(наш.собственный.сценарий.или.функ- ция).вызывается.всякий.раз,.когда.сценарий.оболочки.получает.сигнал.
SIGINT
,.
например,.когда.для.прерывания.запущенного.процесса.вы.нажмете.сочетание.
клавиш.
Ctrl
+
C
В.примере.8.3.показан.сценарий,.выполняющий.подсчет.
Пример 8.3. looper.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# looper.sh
#
# Описание:
# Подсчет строк в файле
#
# Использование: ./looper.sh [filename]
# filename — имя файла, который должен проверяться,
# по умолчанию: log.file
#
function interval ()
{
echo $(date '+%y%m%d %H%M%S') $cnt
cnt=0
}
declare -i cnt=0