Файл: Paul Troncone and Carl AlbingCybersecurity Ops with bashAttack, Defend, and Analyze from the.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 468
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
Таблица 7.2. Код состояния HTTP
Код Описание
200
ОК.(Хорошо)
401
Unauthorized.(Не.авторизован.(не.представился))
404
Page.Not.Found.(Страница.не.найдена)
500
Internal.Server.Error.(Внутренняя.ошибка.сервера)
502
Bad.Gateway.(Плохой,.ошибочный.шлюз)
Полный список кодов можно найти в реестре кодов состояния протокола пере- дачи гипертекста (HTTP) (http://bit.ly/2I2njXR).
Сортировка и упорядочение данных
При.первичном.анализе.данных.в.большинстве.случаев.полезно.начинать.с.рас- смотрения.экстремальных.значений:.какие.события.происходили.наиболее.или.
наименее.часто,.самый.маленький.или.самый.большой.объем.переданных.данных.
и.т..д..Например,.рассмотрим.данные,.которые.можно.собрать.из.файлов.журнала.
веб-сервера..Необычно.большое.количество.обращений.к.страницам.может.ука- зывать.на.активное.сканирование.или.попытку.отказа.в.обслуживании..Необычно.
большое.количество.байтов,.загруженных.хостом,.может.указывать.на.то,.что.дан- ный.сайт.клонируется.или.происходит.эксфильтрация.данных.
Чтобы.управлять.расположением.и.отображением.данных,.укажите.в.конце.коман- ды.
sort
,.
head
.и.
tail
:
… | sort -k 2.1 -rn | head -15
При.этом.выходные.данные.сценария.передаются.команде.
sort
,.а.затем.отсор- тированный.вывод.направляется.команде.
head
,.которая.напечатает.15.верхних.
(в.данном.случае).строк..Команда.
sort
.в.качестве.своего.ключа.сортировки.(
-k
).ис- пользует.второе.поле,.начиная.с.его.первого.символа.(
2.1
)..Более.того,.эта.команда.
выполнит.обратную.сортировку.(
-r
),.а.значения.будут.отсортированы.в.числовом.
порядке.(
-n
)..Почему.числовой.порядок?.Потому.что.2.отображается.между.1.и.3,.
а.не.между.19.и.20.(как.при.сортировке.в.алфавитном.порядке).
114 Часть II • Защитные операции с использованием bash
Используя.команду.
head
,.мы.захватываем.первые.строки.вывода..Мы.могли.бы.
получить.последние.несколько.строк,.передавая.вывод.из.команды.
sort
.команде.
tail
.вместо.
head
..Использование.команды.
tail
.с.опцией.
-15
.выведет.последние.
15.строк..Другой.способ.отсортировать.данные.по.возрастанию,.а.не.по.убыванию.—.
удалить.параметр.
-r
Подсчет количества обращений к данным
Типичный.журнал.веб-сервера.может.содержать.десятки.тысяч.записей..Подсчиты- вая,.сколько.раз.страница.была.доступна,.и.узнавая,.по.какому.IP-адресу.она.была.
доступна,.вы.можете.получить.лучшее.представление.об.общей.активности.сайта..
Далее.приводятся.записи,.на.которые.следует.обратить.внимание.
Большое.количество.запросов,.возвращающих.код.состояния.404.(«Страница.
не.найдена»).для.конкретной.страницы..Это.может.указывать.на.неработающие.
гиперссылки.
Множество.запросов.с.одного.IP-адреса,.возвращающих.код.состояния.404..
Это.может.означать,.что.выполняется.зондирование.в.поисках.скрытых.или.
несвязанных.страниц.
Большое.количество.запросов,.в.частности,.с.одного.и.того.же.IP-адреса,.воз- вращающих.код.состояния.401.(«Не.авторизирован»)..Это.может.свидетель- ствовать.о.попытке.обхода.аутентификации,.например.о.переборе.паролей.
Чтобы.обнаружить.такой.тип.активности,.нам.нужно.иметь.возможность.извлекать.
ключевые.поля,.например.исходный.IP-адрес,.и.подсчитывать,.сколько.раз.они.по- являются.в.файле..Поэтому.для.извлечения.поля.мы.воспользуемся.командой.
cut
,.
а.затем.передадим.вывод.в.наш.новый.инструмент,.файл.
countem.sh
,.показанный.
в.примере.7.3.
Пример 7.3. countem.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# countem.sh
#
# Описание:
# Подсчет количества экземпляров элемента с помощью bash
#
# Использование:
# countem.sh < inputfile
#
declare -A cnt # ассоциативный массив
Глава 7. Анализ данных 115
while read id xtra
do let cnt[$id]++
done
# вывести то, что мы подсчитали
# для каждого ключа в ассоциативном массиве в виде (ключ, значение)
for id in "${!cnt[@]}"
do printf '%d %s\n' "${cnt[$id]}" "$id"
done
.Поскольку.мы.не.знаем,.с.какими.IP-адресами.(или.другими.строками).можем.
столкнуться,.будем.использовать.ассоциативный массив.(также.известный.как.
хеш-таблица.или.словарь)..В.этом.примере.массив.задан.с.параметром.
–A
,.который.
позволит.нам.использовать.любую.строку.в.качестве.нашего.индекса.
Функция.ассоциативного.массива.предусмотрена.в.bash.версии.4.0.и.выше..
В.таком.массиве.индекс.не.обязательно.должен.быть.числом.и.может.быть.пред- ставлен.в.виде.любой.строки..Таким.образом,.вы.можете.индексировать.массив.по.
IP-адресу.и.подсчитывать.количество.обращений.этого.IP-адреса..В.случае.если.
вы.используете.версию.программы.старше,.чем.bash.4.0,.альтернативой.этому.сце- нарию.будет.сценарий,.показанный.в.примере.7.4..Здесь.вместо.ассоциативного.
массива.используется.команда.
awk
В.bash.для.ссылок.на.массив,.как.и.для.ссылок.на.элемент.массива,.используется.
синтаксис.
${var[index]}
..Чтобы.получить.все.возможные.значения.индекса.
(ключи,.если.эти.массивы.рассматриваются.как.пара.(«ключ/значение»)),.укажите.
${!cnt[@]}
.Хотя.мы.ожидаем.в.строке.только.одно.слово.ввода,.добавим.переменную.
xtra
,.
чтобы.захватить.любые.другие.слова,.которые.появятся.в.строке..Каждой.пере- менной.в.команде.
read
.присваивается.соответствующее.слово.из.входных.данных.
(то.есть.первая.переменная.получает.первое.слово,.вторая.переменная.—.второе.
слово.и.т..д.)..При.этом.последняя.переменная.получает.все.оставшиеся.слова..
С.другой.стороны,.если.в.строке.входных.слов.меньше,.чем.переменных.в.команде.
read
,.этим.дополнительным.переменным.присваивается.пустая.строка..Поэтому.
в.нашем.примере,.если.в.строке.ввода.есть.дополнительные.слова,.они.все.будут.
присвоены.переменной.
xtra
..Если.же.нет.дополнительных.слов,.переменной.
xtra будет.присвоено.значение.
null
.Строка.используется.в.качестве.индекса.и.увеличивает.его.предыдущее.значение..
При.первом.использовании.индекса.предыдущее.значение.не.будет.установлено.
и.он.будет.равен.
0
.Данный.синтаксис.позволяет.нам.перебирать.все.различные.значения.индекса..
Обратите.внимание:.нельзя.гарантировать,.что.при.сортировке.мы.получим.
116 Часть II • Защитные операции с использованием bash алфавитный.или.какой-то.другой.конкретный.порядок..Это.объясняется.природой.
алгоритма.хеширования.значений.индекса.
.При.выводе.значения.и.ключа.мы.помещаем.значения.в.кавычки,.чтобы.всегда.
получать.одно.значение.для.каждого.аргумента,.даже.если.оно.содержит.один.или.
два.пробела..Мы.не.думаем,.что.такое.произойдет.при.работе.этого.сценария,.но.
подобная.практика.кодирования.делает.сценарии.более.надежными.при.исполь- зовании.в.различных.ситуациях.
В.примере.7.4.показана.другая.версия.сценария,.с.использованием.команды.
awk
Пример 7.4. countem.awk
# Bash и кибербезопасность
# countem.awk
#
# Описание:
# Подсчет количества экземпляров элемента с помощью команды awk
#
# Использование:
# countem.awk < inputfile
#
awk '{ cnt[$1]++ }
END { for (id in cnt) {
printf "%d %s\n", cnt[id], id
}
}'
Оба.сценария.будут.хорошо.работать.в.конвейере.команд:
cut -d' ' -f1 logfile | bash countem.sh
Команда.
cut
.на.самом.деле.здесь.не.нужна.ни.для.одной.из.версий..Почему?.
Потому.что.сценарий.
awk
.явно.ссылается.на.первое.поле.(
$1
),.а.то,.что.команда.
cut
.в.сценарии.оболочки.не.нужна,.объясняется.кодировкой.команды.
read
.(см..)..
Так.что.мы.можем.запустить.сценарий.следующим.образом:
bash countem.sh < logfile
Например,.чтобы.подсчитать,.сколько.раз.IP-адрес.делал.HTTP-запрос,.на.который.
возвращалось.сообщение.об.ошибке.404.(«Страница.не.найдена»),.нужно.ввести.
такую.команду:
$ awk '$9 == 404 {print $1}' access.log | bash countem.sh
1 192.168.0.36 2 192.168.0.37 1 192.168.0.11
Глава 7. Анализ данных 117
Вы.также.можете.использовать.команду.
grep
404
access.log
.и.передать.данные.
сценарию.
countem.sh
..Но.в.этом.случае.будут.включены.строки,.в.которых.сочетание.
цифр.404.будет.найдено.и.в.других.местах.(например,.число.байтов.или.часть.пути.
к.файлу)..Команда.
awk
.указывает.подсчитывать.только.те.строки,.в.которых.возвра- щаемый.статус.(поле.9).равен.404..Далее.будет.выведен.только.IP-адрес.(поле.1),.
а.вывод.направится.в.сценарий.
countem.sh
,.с.помощью.которого.мы.получим.общее.
количество.запросов,.сделанных.IP-адресом.и.вызвавших.ошибку.404.
Сначала.проанализируем.образец.файла.
access.log
..Начать.анализ.следует.с.про- смотра.узлов,.которые.обращались.к.веб-серверу..Вы.можете.использовать.команду.
cut
.операционной.системы.Linux,.с.помощью.которой.будет.извлечено.первое.поле.
файла.журнала,.где.содержится.исходный.IP-адрес..Затем.следует.передать.выход- ные.данные.сценарию.
countem.sh
..Правильная.команда.и.ее.вывод.показаны.здесь:
$ cut -d' ' -f1 access.log | bash countem.sh | sort -rn
111 192.168.0.37 55 192.168.0.36 51 192.168.0.11 42 192.168.0.14 28 192.168.0.26
Если у вас нет доступного сценария countem.sh, для достижения аналогичных результатов можно использовать команду uniq с параметром -c. Но для корректной работы предварительно потребуется дополнительно отсортировать данные.
$ cut -d' ' -f1 access.log | sort | uniq -c | sort -rn
111 192.168.0.37 55 192.168.0.36 51 192.168.0.11 42 192.168.0.14 28 192.168.0.26
Вы.можете.продолжить.анализ,.обратив.внимание.на.хост.с.наибольшим.количе- ством.запросов..Как.видно.из.предыдущего.кода,.таким.хостом.является.IP-адрес.
192.168.0.37,.номер.которого.—.111..Можно.использовать.
awk
.для.фильтрации.по.
IP-адресу,.чтобы.затем.извлечь.поле,.содержащее.запрос,.передать.его.команде.
cut и,.наконец,.передать.вывод.сценарию.
countem.sh
,.который.и.выдаст.общее.количе- ство.запросов.для.каждой.страницы:
$ awk '$1 == "192.168.0.37" {print $0}' access.log | cut -d' ' -f7
| bash countem.sh
1 /uploads/2/9/1/4/29147191/31549414299.png?457 14 /files/theme/mobile49c2.js?1490908488
118 Часть II • Защитные операции с использованием bash
1 /cdn2.editmysite.com/images/editor/theme-background/stock/iPad.html
1 /uploads/2/9/1/4/29147191/2992005_orig.jpg
14 /files/theme/custom49c2.js?1490908488
Активность.этого.конкретного.хоста.не.впечатляет.и.напоминает.стандартное.по- ведение.браузера..Если.вы.посмотрите.на.хост.со.следующим.наибольшим.коли- чеством.запросов,.то.увидите.нечто.более.интересное:
$ awk '$1 == "192.168.0.36" {print $0}' access.log | cut -d' ' -f7
| bash countem.sh
1 /files/theme/mobile49c2.js?1490908488 1 /uploads/2/9/1/4/29147191/31549414299.png?457 1 /_/cdn2.editmysite.com/.../Coffee.html
1 /_/cdn2.editmysite.com/.../iPad.html
1 /uploads/2/9/1/4/29147191/601239_orig.png
Этот.вывод.указывает,.что.хост.192.168.0.36.получил.доступ.чуть.ли.не.к.каждой.
странице.сайта.только.один.раз..Данный.тип.активности.часто.указывает.на.ак- тивность.веб-сканера.или.клонирование.сайта..Если.вы.посмотрите.на.строку.
пользовательского.агента,.то.увидите.дополнительное.подтверждение.этого.пред- положения:
$ awk '$1 == "192.168.0.36" {print $0}' access.log | cut -d' ' -f12-17 | uniq
"Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)
Агент.пользователя.идентифицирует.себя.как.
HTTrack
..Это.инструмент,.который.
можно.использовать.для.загрузки.или.клонирования.сайтов..Хотя.этот.инструмент.
не.обязательно.приносит.вред,.во.время.анализа.стоит.обратить.на.него.внимание.
Дополнительную информацию о HTTrack вы можете найти на сайте http://
www.httrack.com/.
Суммирование чисел в данных
Что.делать,.если.вместо.того,.чтобы.подсчитывать,.сколько.раз.IP-адрес.или.другие.
элементы.обращались.к.определенным.ресурсам,.вы.хотите.узнать.общее.количе- ство.байтов,.отправленных.по.IP-адресу,.или.то,.какие.IP-адреса.запросили.и.полу- чили.больше.всего.данных?
Решение.мало.чем.отличается.от.сценария.
countem.sh
..Внесите.в.этот.сценарий.
несколько.небольших.изменений..Во-первых,.вам.нужно.так.настроить.входной.
Глава 7. Анализ данных 119
фильтр.(команда.
cut
),.чтобы.из.большого.количества.столбцов.извлекались.два.
столбца:.IP-адрес.и.счетчик.байтов,.а.не.только.столбец.с.IP-адресом..Во-вторых,.
следует.изменить.вычисление.с.приращением.(
let cnt[$id]++
).на.простой.счет,.
чтобы.суммировать.данные.из.второго.поля.(
let cnt[$id]+=
$data
).
Теперь.конвейер.будет.извлекать.два.поля.из.файла.журнала.—.первое.и.последнее:
cut -d' ' -f 1,10 access.log | bash summer.sh
Сценарий.
summer.sh
,.показанный.в.примере.7.5,.читает.данные.из.двух.столбцов..
Первый.столбец.состоит.из.значений.индекса.(в.данном.случае.IP-адресов),.а.вто- рой.столбец.—.это.число.(в.данном.случае.количество.байтов,.отправленных.по.
IP-адресу)..Каждый.раз,.когда.сценарий.находит.в.первом.столбце.повторяющийся.
IP-адрес,.он.добавляет.значение.из.второго.столбца.к.общему.количеству.байтов.
для.этого.адреса,.суммируя.таким.образом.количество.байтов,.отправленных.этим.
IP-адресом.
Пример 7.5. summer.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# summer.sh
#
# Описание:
# Суммировать итоговые значения поля 2 для каждого уникального поля 1
#
# Использование: ./summer.sh
# формат ввода:
#
declare -A cnt # ассоциативный массив while read id count do let cnt[$id]+=$count done for id in "${!cnt[@]}"
do printf "%-15s %8d\n" "${id}" "${cnt[${id}]}"
done
.Обратите.внимание,.что.в.формат.вывода.мы.внесли.несколько.изменений..
К.размеру.поля.мы.добавили.15.символов.для.первой.строки.(в.нашем.примере.это.
данные.IP-адреса),.установили.выравнивание.по.левому.краю.(с.помощью.знака.
минус).и.указали.восемь.цифр.для.значений.суммы..Если.сумма.окажется.больше,.
то.будет.выведено.большее.число,.если.же.строка.окажется.длиннее,.то.она.будет.
напечатана.полностью..Это.сделано.для.того,.чтобы.выровнять.данные.по.соот- ветствующим.столбцам:.так.столбцы.будут.аккуратными.и.более.читабельными..
120 Часть II • Защитные операции с использованием bash
Для.получения.представления.об.общем.объеме.данных,.запрашиваемых.каждым.
хостом,.можно.в.сценарии.
summer.sh
.запустить.файл.
access.log
..Для.этого.исполь- зуйте.команду.
cut
,.которая.извлечет.IP-адрес.и.переданные.байты.полей,.а.затем.
передайте.вывод.в.сценарий.
summer.sh
:
$ cut -d' ' -f1,10 access.log | bash summer.sh | sort -k 2.1 -rn
192.168.0.36 4371198 192.168.0.37 2575030 192.168.0.11 2537662 192.168.0.14 2876088 192.168.0.26 665693
Эти.результаты.могут.быть.полезны.для.выявления.хостов,.которые.передали.
необычно.большие.объемы.данных.по.сравнению.с.другими.хостами..Всплеск.
может.указывать.на.кражу.данных.и.эксфильтрацию..Когда.такой.хост.будет.
определен,.нужно.просмотреть.конкретные.страницы.и.файлы,.к.которым.он.
обращался,.чтобы.попытаться.классифицировать.его.как.вредоносный.или.без- опасный.
Отображение данных в виде гистограммы
Можно.выполнить.еще.одно.действие,.обеспечив.более.наглядное.отображе- ние.полученных.результатов..Вы.можете.взять.вывод.сценария.
countem.sh
.или.
summer.sh
.и.передать.его.в.другой.сценарий,.который.будет.создавать.гистограм- му,.отображающую.результаты.
Сценарий,.выполняющий.печать,.будет.принимать.первое.поле.в.качестве.индекса.
ассоциативного.массива,.а.второе.поле.—.в.качестве.значения.для.этого.элемента.
массива..Затем.следует.пересмотреть.весь.массив.и.распечатать.несколько.хеште- гов.для.представления.самого.большого.числа.в.списке.(пример.7.6).
Пример 7.6. histogram.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# histogram.sh
#
# Описание:
# Создание горизонтальной гистограммы с указанными данными
#
# Использование: ./histogram.sh
# формат ввода: label value
#
function pr_bar ()
Глава 7. Анализ данных 121
{
local -i i raw maxraw scaled
raw=$1
maxraw=$2
((scaled=(MAXBAR*raw)/maxraw))
# гарантированный минимальный размер
((raw > 0 && scaled == 0)) && scaled=1
for((i=0; i} # pr_bar
#
# "main"
#
declare -A RA
declare -i MAXBAR max
max=0
MAXBAR=50 # размер самой длинной строки while read labl val do let RA[$labl]=$val
# сохранить наибольшее значение; для масштабирования
(( val > max )) && max=$val done
# масштабировать и вывести for labl in "${!RA[@]}"
do printf '%-20.20s ' "$labl"
pr_bar ${RA[$labl]} $max
done
.Мы.определяем.функцию,.с.помощью.которой.нарисуем.один.столбец.гисто- граммы..Определение.должно.находиться.перед.самой.функцией,.поэтому.имеет.
смысл.поместить.все.определения.функций.в.начале.нашего.сценария..Данная.
функция.в.будущем.сценарии.будет.использована.повторно,.поэтому.ее.можно.
поместить.в.отдельный.файл.и.подключать.с.помощью.команды.
source
..Но.мы.
сделали.по-другому.
.Мы.объявляем.все.эти.переменные.локальными,.так.как.не.хотим,.чтобы.они.ме- шали.определению.имен.переменных.в.остальной.части.данного.сценария.(или.лю- бых.других,.если.мы.копируем/вставляем.этот.сценарий.для.использования.в.другом.
месте)..Мы.объявляем.все.эти.переменные.целыми.числами.(это.параметр.
-i
),.по- тому.что.будем.вычислять.только.целые.значения.и.не.станем.использовать.строки.
.Вычисление.выполняется.в.двойных.скобках..Внутри.них.не.нужно.использо- вать.символ.
$
.для.указания.значения.каждого.имени.переменной.
122 Часть II • Защитные операции с использованием bash
.Это.оператор.
if-less
..Если.выражение.внутри.двойных.скобок.равно.
true
,.то.
тогда.и.только.тогда.выполняется.второе.выражение..Такая.конструкция.гаранти- рует,.что.если.исходное.значение.не.равно.нулю,.то.масштабированное.значение.
никогда.не.будет.равно.нулю.
.Основная.часть.сценария.начинается.с.объявления.
RA
.как.ассоциативного.массива.
.Здесь.мы.ссылаемся.на.ассоциативный.массив,.используя.метку.строки.в.каче- стве.его.индекса.
.Поскольку.массив.не.индексируется.по.числам,.мы.не.можем.просто.считать.
целые.числа.и.использовать.их.в.качестве.индексов..Эта.конструкция.определяет.
все.различные.строки,.которые.использовались.в.качестве.индекса.массива,.по.
одному.индексу.в.цикле.
for
.Мы.еще.раз.используем.метку.как.индекс,.чтобы.получить.счетчик.и.передать.
его.как.первый.параметр.нашей.функции.
pr_bar
Обратите.внимание,.что.элементы.отображаются.не.в.том.порядке,.что.и.входные.
данные..Это.связано.с.тем,.что.алгоритм.хеширования.для.ключа.(индекса).не.со- храняет.порядок..Вы.можете.упорядочить.этот.вывод.или.использовать.другой.
подход.
Пример.7.7.представляет.собой.версию.сценария.для.построения.гистограммы.—.
в.нем.сохраняется.последовательность.вывода.и.не.используется.ассоциативный.
массив..Это.также.может.быть.полезно.для.старых.версий.bash.(до.4.0),.в.которых.
ассоциативный.массив.еще.не.использовался..Здесь.показана.только.основная.
часть.сценария,.так.как.функция.
pr_bar
.остается.прежней.
Код Описание
200
ОК.(Хорошо)
401
Unauthorized.(Не.авторизован.(не.представился))
404
Page.Not.Found.(Страница.не.найдена)
500
Internal.Server.Error.(Внутренняя.ошибка.сервера)
502
Bad.Gateway.(Плохой,.ошибочный.шлюз)
Полный список кодов можно найти в реестре кодов состояния протокола пере- дачи гипертекста (HTTP) (http://bit.ly/2I2njXR).
Сортировка и упорядочение данных
При.первичном.анализе.данных.в.большинстве.случаев.полезно.начинать.с.рас- смотрения.экстремальных.значений:.какие.события.происходили.наиболее.или.
наименее.часто,.самый.маленький.или.самый.большой.объем.переданных.данных.
и.т..д..Например,.рассмотрим.данные,.которые.можно.собрать.из.файлов.журнала.
веб-сервера..Необычно.большое.количество.обращений.к.страницам.может.ука- зывать.на.активное.сканирование.или.попытку.отказа.в.обслуживании..Необычно.
большое.количество.байтов,.загруженных.хостом,.может.указывать.на.то,.что.дан- ный.сайт.клонируется.или.происходит.эксфильтрация.данных.
Чтобы.управлять.расположением.и.отображением.данных,.укажите.в.конце.коман- ды.
sort
,.
head
.и.
tail
:
… | sort -k 2.1 -rn | head -15
При.этом.выходные.данные.сценария.передаются.команде.
sort
,.а.затем.отсор- тированный.вывод.направляется.команде.
head
,.которая.напечатает.15.верхних.
(в.данном.случае).строк..Команда.
sort
.в.качестве.своего.ключа.сортировки.(
-k
).ис- пользует.второе.поле,.начиная.с.его.первого.символа.(
2.1
)..Более.того,.эта.команда.
выполнит.обратную.сортировку.(
-r
),.а.значения.будут.отсортированы.в.числовом.
порядке.(
-n
)..Почему.числовой.порядок?.Потому.что.2.отображается.между.1.и.3,.
а.не.между.19.и.20.(как.при.сортировке.в.алфавитном.порядке).
114 Часть II • Защитные операции с использованием bash
Используя.команду.
head
,.мы.захватываем.первые.строки.вывода..Мы.могли.бы.
получить.последние.несколько.строк,.передавая.вывод.из.команды.
sort
.команде.
tail
.вместо.
head
..Использование.команды.
tail
.с.опцией.
-15
.выведет.последние.
15.строк..Другой.способ.отсортировать.данные.по.возрастанию,.а.не.по.убыванию.—.
удалить.параметр.
-r
Подсчет количества обращений к данным
Типичный.журнал.веб-сервера.может.содержать.десятки.тысяч.записей..Подсчиты- вая,.сколько.раз.страница.была.доступна,.и.узнавая,.по.какому.IP-адресу.она.была.
доступна,.вы.можете.получить.лучшее.представление.об.общей.активности.сайта..
Далее.приводятся.записи,.на.которые.следует.обратить.внимание.
Большое.количество.запросов,.возвращающих.код.состояния.404.(«Страница.
не.найдена»).для.конкретной.страницы..Это.может.указывать.на.неработающие.
гиперссылки.
Множество.запросов.с.одного.IP-адреса,.возвращающих.код.состояния.404..
Это.может.означать,.что.выполняется.зондирование.в.поисках.скрытых.или.
несвязанных.страниц.
Большое.количество.запросов,.в.частности,.с.одного.и.того.же.IP-адреса,.воз- вращающих.код.состояния.401.(«Не.авторизирован»)..Это.может.свидетель- ствовать.о.попытке.обхода.аутентификации,.например.о.переборе.паролей.
Чтобы.обнаружить.такой.тип.активности,.нам.нужно.иметь.возможность.извлекать.
ключевые.поля,.например.исходный.IP-адрес,.и.подсчитывать,.сколько.раз.они.по- являются.в.файле..Поэтому.для.извлечения.поля.мы.воспользуемся.командой.
cut
,.
а.затем.передадим.вывод.в.наш.новый.инструмент,.файл.
countem.sh
,.показанный.
в.примере.7.3.
Пример 7.3. countem.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# countem.sh
#
# Описание:
# Подсчет количества экземпляров элемента с помощью bash
#
# Использование:
# countem.sh < inputfile
#
declare -A cnt # ассоциативный массив
Глава 7. Анализ данных 115
while read id xtra
do let cnt[$id]++
done
# вывести то, что мы подсчитали
# для каждого ключа в ассоциативном массиве в виде (ключ, значение)
for id in "${!cnt[@]}"
do printf '%d %s\n' "${cnt[$id]}" "$id"
done
.Поскольку.мы.не.знаем,.с.какими.IP-адресами.(или.другими.строками).можем.
столкнуться,.будем.использовать.ассоциативный массив.(также.известный.как.
хеш-таблица.или.словарь)..В.этом.примере.массив.задан.с.параметром.
–A
,.который.
позволит.нам.использовать.любую.строку.в.качестве.нашего.индекса.
Функция.ассоциативного.массива.предусмотрена.в.bash.версии.4.0.и.выше..
В.таком.массиве.индекс.не.обязательно.должен.быть.числом.и.может.быть.пред- ставлен.в.виде.любой.строки..Таким.образом,.вы.можете.индексировать.массив.по.
IP-адресу.и.подсчитывать.количество.обращений.этого.IP-адреса..В.случае.если.
вы.используете.версию.программы.старше,.чем.bash.4.0,.альтернативой.этому.сце- нарию.будет.сценарий,.показанный.в.примере.7.4..Здесь.вместо.ассоциативного.
массива.используется.команда.
awk
В.bash.для.ссылок.на.массив,.как.и.для.ссылок.на.элемент.массива,.используется.
синтаксис.
${var[index]}
..Чтобы.получить.все.возможные.значения.индекса.
(ключи,.если.эти.массивы.рассматриваются.как.пара.(«ключ/значение»)),.укажите.
${!cnt[@]}
.Хотя.мы.ожидаем.в.строке.только.одно.слово.ввода,.добавим.переменную.
xtra
,.
чтобы.захватить.любые.другие.слова,.которые.появятся.в.строке..Каждой.пере- менной.в.команде.
read
.присваивается.соответствующее.слово.из.входных.данных.
(то.есть.первая.переменная.получает.первое.слово,.вторая.переменная.—.второе.
слово.и.т..д.)..При.этом.последняя.переменная.получает.все.оставшиеся.слова..
С.другой.стороны,.если.в.строке.входных.слов.меньше,.чем.переменных.в.команде.
read
,.этим.дополнительным.переменным.присваивается.пустая.строка..Поэтому.
в.нашем.примере,.если.в.строке.ввода.есть.дополнительные.слова,.они.все.будут.
присвоены.переменной.
xtra
..Если.же.нет.дополнительных.слов,.переменной.
xtra будет.присвоено.значение.
null
.Строка.используется.в.качестве.индекса.и.увеличивает.его.предыдущее.значение..
При.первом.использовании.индекса.предыдущее.значение.не.будет.установлено.
и.он.будет.равен.
0
.Данный.синтаксис.позволяет.нам.перебирать.все.различные.значения.индекса..
Обратите.внимание:.нельзя.гарантировать,.что.при.сортировке.мы.получим.
116 Часть II • Защитные операции с использованием bash алфавитный.или.какой-то.другой.конкретный.порядок..Это.объясняется.природой.
алгоритма.хеширования.значений.индекса.
.При.выводе.значения.и.ключа.мы.помещаем.значения.в.кавычки,.чтобы.всегда.
получать.одно.значение.для.каждого.аргумента,.даже.если.оно.содержит.один.или.
два.пробела..Мы.не.думаем,.что.такое.произойдет.при.работе.этого.сценария,.но.
подобная.практика.кодирования.делает.сценарии.более.надежными.при.исполь- зовании.в.различных.ситуациях.
В.примере.7.4.показана.другая.версия.сценария,.с.использованием.команды.
awk
Пример 7.4. countem.awk
# Bash и кибербезопасность
# countem.awk
#
# Описание:
# Подсчет количества экземпляров элемента с помощью команды awk
#
# Использование:
# countem.awk < inputfile
#
awk '{ cnt[$1]++ }
END { for (id in cnt) {
printf "%d %s\n", cnt[id], id
}
}'
Оба.сценария.будут.хорошо.работать.в.конвейере.команд:
cut -d' ' -f1 logfile | bash countem.sh
Команда.
cut
.на.самом.деле.здесь.не.нужна.ни.для.одной.из.версий..Почему?.
Потому.что.сценарий.
awk
.явно.ссылается.на.первое.поле.(
$1
),.а.то,.что.команда.
cut
.в.сценарии.оболочки.не.нужна,.объясняется.кодировкой.команды.
read
.(см..)..
Так.что.мы.можем.запустить.сценарий.следующим.образом:
bash countem.sh < logfile
Например,.чтобы.подсчитать,.сколько.раз.IP-адрес.делал.HTTP-запрос,.на.который.
возвращалось.сообщение.об.ошибке.404.(«Страница.не.найдена»),.нужно.ввести.
такую.команду:
$ awk '$9 == 404 {print $1}' access.log | bash countem.sh
1 192.168.0.36 2 192.168.0.37 1 192.168.0.11
Глава 7. Анализ данных 117
Вы.также.можете.использовать.команду.
grep
404
access.log
.и.передать.данные.
сценарию.
countem.sh
..Но.в.этом.случае.будут.включены.строки,.в.которых.сочетание.
цифр.404.будет.найдено.и.в.других.местах.(например,.число.байтов.или.часть.пути.
к.файлу)..Команда.
awk
.указывает.подсчитывать.только.те.строки,.в.которых.возвра- щаемый.статус.(поле.9).равен.404..Далее.будет.выведен.только.IP-адрес.(поле.1),.
а.вывод.направится.в.сценарий.
countem.sh
,.с.помощью.которого.мы.получим.общее.
количество.запросов,.сделанных.IP-адресом.и.вызвавших.ошибку.404.
Сначала.проанализируем.образец.файла.
access.log
..Начать.анализ.следует.с.про- смотра.узлов,.которые.обращались.к.веб-серверу..Вы.можете.использовать.команду.
cut
.операционной.системы.Linux,.с.помощью.которой.будет.извлечено.первое.поле.
файла.журнала,.где.содержится.исходный.IP-адрес..Затем.следует.передать.выход- ные.данные.сценарию.
countem.sh
..Правильная.команда.и.ее.вывод.показаны.здесь:
$ cut -d' ' -f1 access.log | bash countem.sh | sort -rn
111 192.168.0.37 55 192.168.0.36 51 192.168.0.11 42 192.168.0.14 28 192.168.0.26
Если у вас нет доступного сценария countem.sh, для достижения аналогичных результатов можно использовать команду uniq с параметром -c. Но для корректной работы предварительно потребуется дополнительно отсортировать данные.
$ cut -d' ' -f1 access.log | sort | uniq -c | sort -rn
111 192.168.0.37 55 192.168.0.36 51 192.168.0.11 42 192.168.0.14 28 192.168.0.26
Вы.можете.продолжить.анализ,.обратив.внимание.на.хост.с.наибольшим.количе- ством.запросов..Как.видно.из.предыдущего.кода,.таким.хостом.является.IP-адрес.
192.168.0.37,.номер.которого.—.111..Можно.использовать.
awk
.для.фильтрации.по.
IP-адресу,.чтобы.затем.извлечь.поле,.содержащее.запрос,.передать.его.команде.
cut и,.наконец,.передать.вывод.сценарию.
countem.sh
,.который.и.выдаст.общее.количе- ство.запросов.для.каждой.страницы:
$ awk '$1 == "192.168.0.37" {print $0}' access.log | cut -d' ' -f7
| bash countem.sh
1 /uploads/2/9/1/4/29147191/31549414299.png?457 14 /files/theme/mobile49c2.js?1490908488
118 Часть II • Защитные операции с использованием bash
1 /cdn2.editmysite.com/images/editor/theme-background/stock/iPad.html
1 /uploads/2/9/1/4/29147191/2992005_orig.jpg
14 /files/theme/custom49c2.js?1490908488
Активность.этого.конкретного.хоста.не.впечатляет.и.напоминает.стандартное.по- ведение.браузера..Если.вы.посмотрите.на.хост.со.следующим.наибольшим.коли- чеством.запросов,.то.увидите.нечто.более.интересное:
$ awk '$1 == "192.168.0.36" {print $0}' access.log | cut -d' ' -f7
| bash countem.sh
1 /files/theme/mobile49c2.js?1490908488 1 /uploads/2/9/1/4/29147191/31549414299.png?457 1 /_/cdn2.editmysite.com/.../Coffee.html
1 /_/cdn2.editmysite.com/.../iPad.html
1 /uploads/2/9/1/4/29147191/601239_orig.png
Этот.вывод.указывает,.что.хост.192.168.0.36.получил.доступ.чуть.ли.не.к.каждой.
странице.сайта.только.один.раз..Данный.тип.активности.часто.указывает.на.ак- тивность.веб-сканера.или.клонирование.сайта..Если.вы.посмотрите.на.строку.
пользовательского.агента,.то.увидите.дополнительное.подтверждение.этого.пред- положения:
$ awk '$1 == "192.168.0.36" {print $0}' access.log | cut -d' ' -f12-17 | uniq
"Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)
Агент.пользователя.идентифицирует.себя.как.
HTTrack
..Это.инструмент,.который.
можно.использовать.для.загрузки.или.клонирования.сайтов..Хотя.этот.инструмент.
не.обязательно.приносит.вред,.во.время.анализа.стоит.обратить.на.него.внимание.
Дополнительную информацию о HTTrack вы можете найти на сайте http://
www.httrack.com/.
Суммирование чисел в данных
Что.делать,.если.вместо.того,.чтобы.подсчитывать,.сколько.раз.IP-адрес.или.другие.
элементы.обращались.к.определенным.ресурсам,.вы.хотите.узнать.общее.количе- ство.байтов,.отправленных.по.IP-адресу,.или.то,.какие.IP-адреса.запросили.и.полу- чили.больше.всего.данных?
Решение.мало.чем.отличается.от.сценария.
countem.sh
..Внесите.в.этот.сценарий.
несколько.небольших.изменений..Во-первых,.вам.нужно.так.настроить.входной.
Глава 7. Анализ данных 119
фильтр.(команда.
cut
),.чтобы.из.большого.количества.столбцов.извлекались.два.
столбца:.IP-адрес.и.счетчик.байтов,.а.не.только.столбец.с.IP-адресом..Во-вторых,.
следует.изменить.вычисление.с.приращением.(
let cnt[$id]++
).на.простой.счет,.
чтобы.суммировать.данные.из.второго.поля.(
let cnt[$id]+=
$data
).
Теперь.конвейер.будет.извлекать.два.поля.из.файла.журнала.—.первое.и.последнее:
cut -d' ' -f 1,10 access.log | bash summer.sh
Сценарий.
summer.sh
,.показанный.в.примере.7.5,.читает.данные.из.двух.столбцов..
Первый.столбец.состоит.из.значений.индекса.(в.данном.случае.IP-адресов),.а.вто- рой.столбец.—.это.число.(в.данном.случае.количество.байтов,.отправленных.по.
IP-адресу)..Каждый.раз,.когда.сценарий.находит.в.первом.столбце.повторяющийся.
IP-адрес,.он.добавляет.значение.из.второго.столбца.к.общему.количеству.байтов.
для.этого.адреса,.суммируя.таким.образом.количество.байтов,.отправленных.этим.
IP-адресом.
Пример 7.5. summer.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# summer.sh
#
# Описание:
# Суммировать итоговые значения поля 2 для каждого уникального поля 1
#
# Использование: ./summer.sh
# формат ввода:
#
declare -A cnt # ассоциативный массив while read id count do let cnt[$id]+=$count done for id in "${!cnt[@]}"
do printf "%-15s %8d\n" "${id}" "${cnt[${id}]}"
done
.Обратите.внимание,.что.в.формат.вывода.мы.внесли.несколько.изменений..
К.размеру.поля.мы.добавили.15.символов.для.первой.строки.(в.нашем.примере.это.
данные.IP-адреса),.установили.выравнивание.по.левому.краю.(с.помощью.знака.
минус).и.указали.восемь.цифр.для.значений.суммы..Если.сумма.окажется.больше,.
то.будет.выведено.большее.число,.если.же.строка.окажется.длиннее,.то.она.будет.
напечатана.полностью..Это.сделано.для.того,.чтобы.выровнять.данные.по.соот- ветствующим.столбцам:.так.столбцы.будут.аккуратными.и.более.читабельными..
120 Часть II • Защитные операции с использованием bash
Для.получения.представления.об.общем.объеме.данных,.запрашиваемых.каждым.
хостом,.можно.в.сценарии.
summer.sh
.запустить.файл.
access.log
..Для.этого.исполь- зуйте.команду.
cut
,.которая.извлечет.IP-адрес.и.переданные.байты.полей,.а.затем.
передайте.вывод.в.сценарий.
summer.sh
:
$ cut -d' ' -f1,10 access.log | bash summer.sh | sort -k 2.1 -rn
192.168.0.36 4371198 192.168.0.37 2575030 192.168.0.11 2537662 192.168.0.14 2876088 192.168.0.26 665693
Эти.результаты.могут.быть.полезны.для.выявления.хостов,.которые.передали.
необычно.большие.объемы.данных.по.сравнению.с.другими.хостами..Всплеск.
может.указывать.на.кражу.данных.и.эксфильтрацию..Когда.такой.хост.будет.
определен,.нужно.просмотреть.конкретные.страницы.и.файлы,.к.которым.он.
обращался,.чтобы.попытаться.классифицировать.его.как.вредоносный.или.без- опасный.
Отображение данных в виде гистограммы
Можно.выполнить.еще.одно.действие,.обеспечив.более.наглядное.отображе- ние.полученных.результатов..Вы.можете.взять.вывод.сценария.
countem.sh
.или.
summer.sh
.и.передать.его.в.другой.сценарий,.который.будет.создавать.гистограм- му,.отображающую.результаты.
Сценарий,.выполняющий.печать,.будет.принимать.первое.поле.в.качестве.индекса.
ассоциативного.массива,.а.второе.поле.—.в.качестве.значения.для.этого.элемента.
массива..Затем.следует.пересмотреть.весь.массив.и.распечатать.несколько.хеште- гов.для.представления.самого.большого.числа.в.списке.(пример.7.6).
Пример 7.6. histogram.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# histogram.sh
#
# Описание:
# Создание горизонтальной гистограммы с указанными данными
#
# Использование: ./histogram.sh
# формат ввода: label value
#
function pr_bar ()
Глава 7. Анализ данных 121
{
local -i i raw maxraw scaled
raw=$1
maxraw=$2
((scaled=(MAXBAR*raw)/maxraw))
# гарантированный минимальный размер
((raw > 0 && scaled == 0)) && scaled=1
for((i=0; i
#
# "main"
#
declare -A RA
declare -i MAXBAR max
max=0
MAXBAR=50 # размер самой длинной строки while read labl val do let RA[$labl]=$val
# сохранить наибольшее значение; для масштабирования
(( val > max )) && max=$val done
# масштабировать и вывести for labl in "${!RA[@]}"
do printf '%-20.20s ' "$labl"
pr_bar ${RA[$labl]} $max
done
.Мы.определяем.функцию,.с.помощью.которой.нарисуем.один.столбец.гисто- граммы..Определение.должно.находиться.перед.самой.функцией,.поэтому.имеет.
смысл.поместить.все.определения.функций.в.начале.нашего.сценария..Данная.
функция.в.будущем.сценарии.будет.использована.повторно,.поэтому.ее.можно.
поместить.в.отдельный.файл.и.подключать.с.помощью.команды.
source
..Но.мы.
сделали.по-другому.
.Мы.объявляем.все.эти.переменные.локальными,.так.как.не.хотим,.чтобы.они.ме- шали.определению.имен.переменных.в.остальной.части.данного.сценария.(или.лю- бых.других,.если.мы.копируем/вставляем.этот.сценарий.для.использования.в.другом.
месте)..Мы.объявляем.все.эти.переменные.целыми.числами.(это.параметр.
-i
),.по- тому.что.будем.вычислять.только.целые.значения.и.не.станем.использовать.строки.
.Вычисление.выполняется.в.двойных.скобках..Внутри.них.не.нужно.использо- вать.символ.
$
.для.указания.значения.каждого.имени.переменной.
122 Часть II • Защитные операции с использованием bash
.Это.оператор.
if-less
..Если.выражение.внутри.двойных.скобок.равно.
true
,.то.
тогда.и.только.тогда.выполняется.второе.выражение..Такая.конструкция.гаранти- рует,.что.если.исходное.значение.не.равно.нулю,.то.масштабированное.значение.
никогда.не.будет.равно.нулю.
.Основная.часть.сценария.начинается.с.объявления.
RA
.как.ассоциативного.массива.
.Здесь.мы.ссылаемся.на.ассоциативный.массив,.используя.метку.строки.в.каче- стве.его.индекса.
.Поскольку.массив.не.индексируется.по.числам,.мы.не.можем.просто.считать.
целые.числа.и.использовать.их.в.качестве.индексов..Эта.конструкция.определяет.
все.различные.строки,.которые.использовались.в.качестве.индекса.массива,.по.
одному.индексу.в.цикле.
for
.Мы.еще.раз.используем.метку.как.индекс,.чтобы.получить.счетчик.и.передать.
его.как.первый.параметр.нашей.функции.
pr_bar
Обратите.внимание,.что.элементы.отображаются.не.в.том.порядке,.что.и.входные.
данные..Это.связано.с.тем,.что.алгоритм.хеширования.для.ключа.(индекса).не.со- храняет.порядок..Вы.можете.упорядочить.этот.вывод.или.использовать.другой.
подход.
Пример.7.7.представляет.собой.версию.сценария.для.построения.гистограммы.—.
в.нем.сохраняется.последовательность.вывода.и.не.используется.ассоциативный.
массив..Это.также.может.быть.полезно.для.старых.версий.bash.(до.4.0),.в.которых.
ассоциативный.массив.еще.не.использовался..Здесь.показана.только.основная.
часть.сценария,.так.как.функция.
pr_bar
.остается.прежней.
1 ... 7 8 9 10 11 12 13 14 ... 23