Файл: Paul Troncone and Carl AlbingCybersecurity Ops with bashAttack, Defend, and Analyze from the.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 472
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
86 Часть II • Защитные операции с использованием bash
Вы.можете.комбинировать.команду.
grep
.с.командой.
find
.для.простого.копи- рования.соответствующих.файлов.в.ваш.текущий.рабочий.каталог.(или.любой.
указанный.каталог):
find /home -type f -exec grep 'password' '{}' \; -exec cp '{}' . \;
Во-первых,.мы.используем.
find
/home/
-type f
,.чтобы.идентифицировать.все.файлы.
в.каталоге.
/home
.и.во.всех.остальных.каталогах,.вложенных.в.
/home
..Каждый.най- денный.файл.проверяется.
grep
.с.целью.поиска.слова.
password
.в.его.содержимом..
Каждый.файл,.соответствующий.критериям.
grep
,.затем.передается.команде.
cp
,.
чтобы.скопировать.найденный.файл.в.текущий.каталог.(обозначенный.точкой)..
Выполнение.такой.комбинации.команд.может.занять.довольно.продолжительное.
время,.поэтому.лучше.запускать.ее.в.виде.фоновой.задачи.
Поиск по типу файла
Поиск.в.системе.определенных.типов.файлов.—.довольно.сложная.задача..Нельзя.
полагаться.на.расширение.файла:.оно.может.вообще.отсутствовать,.например,.если.
пользователь.его.умышленно.удалил..К.счастью,.команда.
file
.способна.помочь.
идентифицировать.типы.файлов,.сравнивая.их.содержимое.с.известными.шабло- нами,.называемыми.магическими.числами..В.табл..5.4.перечислены.популярные.
магические.числа.и.их.начальные.местоположения.в.файлах.
Таблица 5.4. Магические числа
Тип файла
Шаблон магического числа
(шестнадцатеричный)
Шаблон магического
числа (ASCII)
Смещение
файла (байт)
JPEG
FF.D8.FF.DB
yOyU
0
Исполняемый.DOS
4D.5A
MZ
0
Исполняемый.
и.связываемый.
формат
7F.45.4C.46
.ELF
0
ZIP-файл
50.4B.03.04
PK..
0
Для.начала.вам.нужно.определить.тип.файла,.для.которого.вы.хотите.выполнить.
поиск..Предположим,.нужно.найти.в.системе.все.файлы.изображений.формата.
PNG..Для.этого.сначала.нужно.взять.файл,.который.не.был.изменен,.например.
Title.png
,.запустить.его.с.помощью.команды.
file
.и.проверить.результат:
$ file Title.png
Title.png: PNG image data, 366 x 84, 8-bit/color RGBA, non-interlaced
Глава 5. Сбор информации 87
Как.и.ожидалось,.
file
.идентифицирует.файл.
Title.png
,.который.действительно.
не.был.изменен,.как.изображение.PNG,.а.также.предоставляет.его.размеры.и.раз- личные.другие.атрибуты..Основываясь.на.этой.информации,.вам.необходимо.
определить,.какую.часть.вывода.команды.
file
.использовать.для.поиска,.и.сгенери- ровать.соответствующее.регулярное.выражение..Во.многих.случаях,.например.при.
криминалистической.экспертизе,.вам,.вероятно,.лучше.собирать.как.можно.больше.
информации.—.в.дальнейшем.вы.всегда.сможете.дополнительно.отфильтровать.
данные..Для.этого.вы.будете.использовать.расширенное.регулярное.выражение,.
которое.будет.просто.искать.слово.PNG.в.выводе.команды.
file
'PNG'
Конечно,.для.идентификации.конкретных.файлов.вы.можете.создавать.более.
сложные.регулярные.выражения..Например,.если.вы.хотите.найти.PNG-файлы.
размером.100.×.100,.выполните.следующую.команду:
'PNG.*100x100'
Если.хотите.найти.файлы.PNG.и.JPEG:
'(PNG|JPEG)'
Получив.регулярное.выражение,.вы.можете.написать.скрипт,.запускающий.коман- ду.
file
,.которая.будет.искать.совпадение.для.каждого.файла.в.системе..Когда.
совпадение.будет.найдено,.сценарий.
typesearch.sh
,.показанный.в.примере.5.4,.
перенаправит.путь.к.файлу.в.стандартный.вывод.
Пример 5.4. Сценарий typesearch.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# typesearch.sh
#
# Описание:
# Поиск в файловой системе файлов указанного типа.
# Выводим путь, когда найдем.
#
# Использование:
# typesearch.sh [-c dir] [-i] [-R|r]
# -c Копировать найденные файлы в каталог
# -i Игнорировать регистр
# -R|r Рекурсивный поиск подкаталогов
#
Шаблон типа файла для поиска
#
Путь для начала поиска
#
DEEPORNOT="-maxdepth 1" # только текущий каталог; по умолчанию
# анализ аргументов опции:
while getopts 'c:irR' opt; do
88 Часть II • Защитные операции с использованием bash case "${opt}" in
c) # копировать найденные файлы в указанный каталог
COPY=YES
DESTDIR="$OPTARG"
;;
i) # игнорировать регистр при поиске
CASEMATCH='-i'
;;
[Rr]) # рекурсивно
unset DEEPORNOT;;
*) # неизвестный/неподдерживаемый вариант
# при получении ошибки mesg от gretops просто выйти exit 2 ;;
esac done shift $((OPTIND - 1))
PATTERN=${1:-PDF document}
STARTDIR=${2:-.} # по умолчанию начать здесь find $STARTDIR $DEEPORNOT -type f | while read FN
do file $FN | egrep -q $CASEMATCH "$PATTERN"
if (( $? == 0 )) # найден один then echo $FN
if [[ $COPY ]] then cp -p $FN $DESTDIR fi fi done
.Этот.сценарий.поддерживает.параметры,.которые,.как.описано.во.вступительных.
комментариях,.изменяют.его.поведение..Сценарий.должен.проанализировать.все.эти.
параметры,.чтобы.определить,.какие.из.них.были.предоставлены,.а.какие.—.опуще- ны..Если.параметров.больше.двух,.имеет.смысл.использовать.встроенную.оболочку.
getopts
..С.помощью.цикла.
while
.мы.будем.продолжать.вызывать.
getopts
.до.тех.
пор,.пока.она.не.вернет.ненулевое.значение,.сообщая.нам,.что.параметров.больше.
нет..Параметры,.которые.мы.хотим.найти,.представлены.в.строке.
c:irR
..Какой.бы.
параметр.ни.был.найден,.в.
opt
.будет.возвращено.указанное.нами.имя.переменной.
.Здесь.мы.используем.оператор.
case
,.который.является.многопрофильной.веткой;.
будет.найдена.ветвь,.соответствующая.шаблону,.заданному.перед.левой.круглой.
скобкой..Мы.могли.бы.использовать.конструкцию.
if/elif/else
,.но.ветвь.и.так.
хорошо.читается.и.показывает.все.параметры.
.Параметр.
c
.сопровождается.двоеточием.(
:
),.находящимся.в.списке.поддерживае- мых.опций,.—.оно.указывает.
getopts
,.что.пользователь.также.предоставит.аргумент.
для.этого.параметра..В.нашем.сценарии.этот.необязательный.аргумент.является.
Глава 5. Сбор информации 89
каталогом,.в.котором.будут.создаваться.копии..Когда.команда.
getopts
.анализирует.
параметр.с.указанным.выше.аргументом,.она.помещает.данный.параметр.в.пере- менную.с.именем.
OPTARG
,.а.сохраняет.в.
DESTDIR
,.так.как.при.следующем.вызове.
getopts
.переменная.
OPTARG
.может.быть.изменена.
.Сценарий.позволяет.указывать.в.этом.параметре.прописную.букву.R.или.строч- ную.r..Операторы.
case
.задают.образец.для.сопоставления,.а.не.просто.литерал..
Поэтому.для.данного.случая.мы.написали.
[Rr])
,.используя.конструкцию.скобок,.
указывающих,.что.любая.буква.считается.совпадением.
.Другие.параметры.устанавливают.переменные,.чтобы.мы.могли.их.задейство- вать..В.этом.случае.мы.отменяем.(
UNSET
).ранее.установленную.переменную..Когда.
эта.переменная.будет.указана.позже.как.
$
DEEP
ORNOT
,.она.не.будет.иметь.значения,.
поэтому.фактически.исчезнет.из.командной.строки,.в.которой.используется.
.Это.еще.один.шаблон.подстановки,.
*
,.соответствующий.чему.угодно..Если.
ни.один.другой.шаблон.не.будет.найден,.выполнится.данное.условие..По.сути,.это.
условие.
else
.для.оператора.
case
.Закончив.анализ.параметров,.мы.можем.избавиться.от.аргументов,.обрабо- танных.с.помощью.
shift
..Только.следует.учесть,.что.разовое.выполнение.
shift избавляет.лишь.от.одного.аргумента..В.этом.случае.аргумент,.расположенный.
вторым,.становится.первым,.третий.становится.вторым.и.т..д..Указание.количества.
повторений.команды.
shift
,.например.
shift5
,.позволит.избавиться.от.первых.пяти.
аргументов.и.в.результате.аргумент.
$6
.станет.
$1
,.
$7
.станет.
$2
.и.т..д..При.вызове.
getopts
.отслеживается,.какие.аргументы.требуется.обработать.в.переменной.обо- лочки.
OPTIND
..Выполнив.нужное.количество.повторений.команды.
shift
,.мы.избав- ляемся.от.любых/всех.проанализированных.параметров..После.такого.сдвига.
$1
будет.ссылаться.на.первый.аргумент,.независимо.от.того,.были.ли.предоставлены.
какие-либо.параметры,.когда.пользователь.вызывал.сценарий.
.Два.возможных.аргумента.не.в.формате.
-option
.—.это.шаблон,.который.мы.
ищем,.и.каталог,.в.котором.хотим.начать.поиск..Когда.мы.ссылаемся.на.переменную.
bash,.можем.добавить.
:-
.и.сказать:.«Если.это.пустое.значение.не.задано,.вернуть.
вместо.него.значение.по.умолчанию»..По.умолчанию.для.
PATTERN
.мы.присваиваем.
значение.в.виде.документа.
,.а.значением.по.умолчанию.для.
STARTDIR
.является.
,.
что.означает.ссылку.на.текущий.каталог.
.Далее.вызывается.команда.
find
,.которая.должна.начать.поиск.в.
$STARTDIR
Помните,.что.
$DEEPORNOT
.может.не.устанавливаться.и,.следовательно,.ничего.
не.добавлять.в.командную.строку..Кроме.того,.здесь.может.находиться.значение.
по.умолчанию.
-maxdepth
1
,.указывающее,.что.
find
.не.следует.искать.глубже.этого.
каталога..Чтобы.находить.только.простые.файлы.(не.каталоги.или.специальные.
файлы.устройств.либо.FIFO),.мы.добавили.параметр.
-type f
..Этот.параметр.
90 Часть II • Защитные операции с использованием bash не.является.обязательным,.и.вы.можете.удалить.его,.если.хотите.иметь.возмож- ность.искать.файлы.конкретного.типа..Имена.найденных.файлов.передаются.
в.цикл.
while
,.который.будет.читать.их.по.одному.в.переменной.
FN
.Параметр.
-q
.команды.
egrep
.говорит.о.том,.что.эта.команда.работает.незаметно.
и.ничего.не.выводит..Нам.не.обязательно.видеть,.какая.именно.фраза.найдена.
в.данный.момент,.только.ради.того,.чтобы.знать,.что.она.найдена.
.Конструкция.
$?
.—.это.значение,.возвращаемое.предыдущей.командой..Успеш- ный.результат.означает,.что.
egrep
.обнаружила.предоставленный.шаблон.
.Здесь.проверяется,.имеет.ли.
COPY
.значение..При.отсутствии.значения.результа- том.
if
.будет.
false
.Параметр.
-p
.команды.
cp
.при.копировании.позволяет.сохранить.всю.информацию.
о.копируемом.файле:.имя.владельца.и.временные.метки.файла..Эта.информация.
может.быть.важной.для.вашего.анализа.
Если.вы.ищете.более.легкое.решение,.но.с.меньшими.возможностями,.можете.
выполнить.аналогичный.поиск.с.помощью.параметра.
exec
.команды.
find
,.как.по- казано.далее:
find / -type f -exec file '{}' \; | egrep 'PNG' | cut -d' ' -f1
Здесь.мы.отправляем.каждый.элемент,.найденный.командой.
find
,.в.команду.
file
,.
которая.определит.тип.найденного.файла..Далее.вывод.файла.передается.команде.
egrep
,.где.происходит.его.фильтрация,.в.результате.чего.выполняется.поиск.клю- чевого.слова.
PNG
..Команда.
cut
.используется,.чтобы.очистить.вывод.и.сделать.его.
более.удобным.для.чтения.
Будьте осторожны при использовании команды file в ненадежной системе. Коман- да использует файл магического шаблона, расположенный в /usr/share/misc/. Зло- умышленник может изменить этот файл таким образом, что определенные типы файлов не будут идентифицированы. Лучше всего подключить подозрительный диск к компьютеру с надежной системой и провести поиск оттуда.
Поиск по хеш-значению
Криптографическая хеш-функция.—.это.необратимая.функция,.которая.преобра- зует.входное.сообщение.произвольной.длины.в.список.сообщений.фиксированной.
длины..К.общим.алгоритмам.хеширования.относятся.MD5,.SHA-1.и.SHA-256..
Рассмотрим.два.файла.(примеры.5.5.и.5.6).
Глава 5. Сбор информации 91
Пример 5.5. hashfilea.txt
This is hash file A
Пример 5.6. hashfileb.txt
This is hash file B
Обратите.внимание,.что.файлы.идентичны,.за.исключением.последней.буквы.
в.предложении..Вы.можете.использовать.команду.
sha1sum
.для.вычисления.дай- джеста.сообщений.SHA-1.для.каждого.файла:
$ sha1sum hashfilea.txt hashfileb.txt
6a07fe595f9b5b717ed7daf97b360ab231e7bbe8 *hashfilea.txt
2959e3362166c89b38d900661f5265226331782b *hashfileb..txt
Несмотря.на.то.что.между.этими.двумя.файлами.есть.небольшая.разница,.они.
генерируют.совершенно.разные.хеши.(дайджесты).сообщений..Если.бы.фай- лы.были.одинаковы,.то.и.дайджесты.сообщений.оказались.бы.одинаковыми..
Вы.можете.использовать.это.свойство.хеширования.для.поиска.определенного.
файла.в.системе,.если.знаете.его.дайджест..Преимущество.в.том,.что.на.поиск.
не.будут.влиять.имя.файла,.местоположение.или.любые.другие.атрибуты;.недо- статок.в.том,.что.файлы.должны.быть.абсолютно.одинаковы..Если.содержимое.
файла.каким-либо.образом.было.изменено,.поиск.не.даст.результатов..Сценарий.
hashsearch.sh
,.показанный.в.примере.5.7,.рекурсивно.просматривает.систему,.на- чиная.с.местоположения,.заданного.пользователем..Этот.сценарий.вычисляет.хеш.
SHA-1.для.каждого.найденного.файла,.а.затем.сравнивает.вычисленное.значение.
со.значением,.предоставленным.пользователем..Если.они.совпадают,.сценарий.
выводит.путь.к.файлу.
Пример 5.7. hashsearch.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# hashsearch.sh
#
# Описание:
# В указанном каталоге выполняем рекурсивный поиск
# файла по заданному SHA-1
#
# Использование:
# hashsearch.sh
1 ... 4 5 6 7 8 9 10 11 ... 23
# hash - Значение хеша SHA-1 разыскиваемого файла
# directory - Каталог для поиска
#
92 Часть II • Защитные операции с использованием bash
HASH=$1
DIR=${2:-.} # cwd, по умолчанию это здесь
# конвертируем путь в абсолютный function mkabspath ()
{
if [[ $1 == /* ]]
then
ABS=$1
else
ABS="$PWD/$1"
fi
}
find $DIR -type f |
while read fn do
THISONE=$(sha1sum "$fn")
THISONE=${THISONE%% *}
if [[ $THISONE == $HASH ]]
then mkabspath "$fn"
echo $ABS
fi done
.Для.нашего.хеша.мы.будем.искать.любой.простой.файл..Нам.следует.избегать.
специальных.файлов;.чтение.FIFO.приведет.к.зависанию.программы,.так.как.она.
станет.ожидать,.когда.кто-нибудь.что-то.запишет.в.FIFO..Чтение.блочного.или.
специального.символьного.файла.—.тоже.не.очень.хорошая.идея..Параметр.
-type f
гарантирует,.что.мы.получим.только.простые.файлы..Сценарий.выводит.имена.
этих.файлов,.по.одному.в.строке,.в.стандартный.вывод,.который.мы.перенаправ- ляем.через.канал.передачи.данных.в.команды.
while read
.Здесь.вычисляется.значение.хеша.в.подоболочке,.захватывается.его.вывод.
(то.есть.все,.что.записывается.в.стандартный.вывод),.после.чего.эти.данные.при- сваиваются.переменной..Кавычки.нужны,.если.в.имени.файла.есть.пробелы.
.Это.переназначение.удаляет.с.правой.стороны.самую.большую.подстроку,.на- чинающуюся.с.пробела..Вывод.
sha1sum
.—.это.и.вычисленный.хеш,.и.имя.файла..
Нам.же.нужно.только.хеш-значение,.поэтому.с.помощью.этой.замены.мы.удаляем.
имя.файла.
.Далее.вызывается.функция.
mkabspath
,.а.имя.файла.помещается.в.кавычки..
Кавычки.гарантируют,.что.все.имя.файла.отображается.как.один.аргумент.функ- ции,.даже.если.в.имени.содержится.один.или.несколько.пробелов.
Глава 5. Сбор информации 93
.Помните,.что.те.переменные.оболочки.внутри.функции,.которые.не.объявлены.
локальными,.являются.глобальными..Поэтому.значение.
ABS
,.которое.было.задано.
при.вызове.
mkabspath
,.нам.здесь.доступно.
.Это.наше.объявление.функции..При.объявлении.вы.можете.опустить.или.клю- чевое.слово.
function
,.или.скобки.
.Для.сравнения.мы.используем.сопоставление.с.образцом.оболочки,.который.рас- положен.справа..В.этом.случае.будет.выполнена.проверка,.начинается.ли.первый.
параметр.со.слеша..Если.это.так,.это.уже.абсолютный.путь.и.нам.больше.ничего.
не.нужно.делать.
.Когда.параметр.представляет.собой.только.относительный.путь,.он.относится.
к.текущему.местоположению,.поэтому.мы.добавляем.текущий.рабочий.ката- лог,.в.результате.чего.этот.путь.становится.абсолютным..Переменная.
PWD
.—.это.
переменная.оболочки,.которая.устанавливается.в.текущий.каталог.с.помощью.
команды.
cd
Передача данных
После.того.как.вы.собрали.все.необходимые.данные,.для.дальнейшего.анализа.их.
необходимо.переместить.из.исходной.системы..Для.этого.вы.можете.скопировать.
данные.на.съемное.устройство.или.загрузить.их.на.централизованный.сервер..
Если.вы.собираетесь.загружать.данные,.убедитесь,.что.применяете.безопасный.
метод,.например.Secure.Copy.(SCP)..В.следующем.примере.
scp
.используется.для.
загрузки.файла.
some_system.tar.gz
.в.домашний.каталог.пользователя.
bob
,.который.
находится.в.удаленной.системе.
10.0.0.45
:
scp some_system.tar.gz bob@10.0.0.45:/home/bob/some_system.tar.gz
Для.удобства.в.конце.коллекции.ваших.сценариев.вы.можете.добавить.эту.стро- ку,.чтобы.автоматически.использовать.
scp
.для.загрузки.данных.на.указанный.
хост..Не.забудьте.дать.своим.файлам.уникальные.имена,.чтобы.не.перезаписы- вать.существующие.файлы,.а.также.чтобы.впоследствии.было.легче.выполнять.
анализ.
Будьте осторожны при выполнении в сценариях аутентификации SSH или SCP.
Не рекомендуется указывать в сценариях пароли. Лучше всего использовать сертификаты SSH. Ключи и сертификаты можно создать с помощью команды ssh-keygen.
94 Часть II • Защитные операции с использованием bash
Выводы
Сбор.данных.—.важный.шаг.при.обеспечении.безопасности..При.сборе.данных.обя- зательно.передавайте.и.храните.их,.используя.безопасные.(то.есть.зашифрованные).
методы..Собирайте.все.данные,.которые.считаете.актуальными..В.дальнейшем.вы.
сможете.их.легко.удалить,.но.не.сможете.анализировать.данные,.которые.не.со- брали..Прежде.чем.собирать.данные,.убедитесь,.что.у.вас.есть.разрешение.и/или.
законные.права.на.это.
Имейте.также.в.виду,.что.злоумышленники.часто.пытаются.скрыть.свое.присут- ствие,.удаляя.или.запутывая.данные..Чтобы.противостоять.этому,.обязательно.
используйте.несколько.методов,.когда.поиск.файлов.будет.осуществляться.по.
имени,.хешу,.содержимому.и.т..д.
В.следующей.главе.мы.рассмотрим.методы.обработки.и.подготовки.данных.
к.анализу.
Упражнения
1.. Напишите.команду.для.поиска.в.файловой.системе.любого.файла.с.именем.
dog.png
2.. Напишите.команду.для.поиска.в.файловой.системе.любого.файла,.содержащего.
слово.«конфиденциальный».
3.. Напишите.команду.для.поиска.в.файловой.системе.любого.файла,.содержащего.
слова.«секретный».или.«конфиденциальный»,.и.скопируйте.этот.файл.в.текущий.
рабочий.каталог.
4.. Напишите.команду.для.выполнения.в.удаленной.системе.
192.168.10.32
.коман- ды.
ls
-R
/
.и.запишите.полученный.результат.в.файл.
filelist.txt
,.который.
находится.в.вашей.локальной.системе.
5.. Измените.с.помощью.SCP.сценарий.
getlocal.sh
.для.автоматической.загрузки.
результатов.на.указанный.сервер.
6.. Измените.сценарий.
hashsearch.sh
.так,.чтобы.получить.возможность.(
-1
).вы- хода.после.поиска.совпадения..Если.параметр.не.указан,.будет.продолжен.поиск.
дополнительных.совпадений.
7.. Измените.сценарий.
hashsearch.sh
.таким.образом,.чтобы.упростить.полный.
путь,.который.он.выводит:
y если.строка,.которую.он.выводит,.представлена.в.виде.
/home/usr07/sub- dir/./misc/x.data
,.измените.ее,.чтобы.удалить.лишние.символы.
./
.перед.
печатью;
Глава 5. Сбор информации 95
y если.строка.представлена.в.виде.
/home/usr/07/subdir/../misc/x.data
,.
измените.ее.так,.чтобы.удалить.перед.печатью.
../
.и.
subdir/
8.. Измените.файл.
winlogs.sh
.так,.чтобы.показать.ход.его.выполнения,.выводя.
имя.файла.журнала.поверх.предыдущего.имени.файла.журнала..(Подсказка:.
используйте.символ.возврата,.а.не.перевод.строки).
9.. Измените.файл.
winlogs.sh
.так,.чтобы.отображался.простой.индикатор.выпол- нения.со.знаками.плюс,.печатаемыми.слева.направо..Используйте.отдельный.
вызов.
wevtutil el
,.чтобы.получить.счетчик.количества.журналов.и.увеличить.
его,.скажем,.до.60.
10.. Измените.файл.
winlogs.sh
.так,.чтобы.привести.в.порядок.данные,.которые.он.
выводит,.то.есть.удалить.извлеченные.файлы.журнала.(файлы.
.evtx
).после.
того,.как.они.будут.скопированы..Это.можно.сделать.двумя.разными.способами.
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
6
Обработка данных
В.предыдущей.главе.вы.собрали.много.данных..Они.представлены.в.различных.
форматах,.включая.такие,.как.текст.в.свободной.форме,.значения.с.разделителями- запятыми.(CSV).и.XML..В.этой.главе.мы.покажем.вам,.как.разбирать.и.обрабаты- вать.эти.данные,.чтобы.извлекать.ключевые.элементы.для.анализа.
Используемые команды
Для.подготовки.собранных.данных.к.анализу.мы.используем.команды.
awk
,.
join
,.
sed
,.
tail
.и.
tr awk
Команда.
awk
.—.это.не.просто.команда,.а.фактически.язык.программирования,.пред- назначенный.для.обработки.текста..Целые.книги.посвящены.этой.теме..Более.по- дробное.описание.команды.
awk
.вы.еще.найдете.в.книге..Здесь.мы.приведем.краткий.
пример.ее.использования.
Общие параметры команды
-f
.—.читать.указанный.файл.в.программе.
awk
Пример команды
Посмотреть.файл.
awkusers.txt
,.показанныйв.примере.6.1.
Пример 6.1. awkusers.txt
Mike Jones
John Smith
Kathy Jones
Jane Kennedy
Tim Scott
Глава 6. Обработка данных 97
Вы.можете.использовать.команду.
awk
.для.печати.тех.строк,.в.которых.есть.фамилия.
пользователя.—.
Jones
:
$ awk '$2 == "Jones" {print $0}' awkusers.txt
Mike Jones
Kathy Jones awk
.выполнит.итерацию.для.каждой.строки.входного.файла,.прочитав.каждое.
слово..Слова.в.строке.(по.умолчанию).разделены.пробелами.на.поля..Поле.
$0
.сим- волизирует.всю.строку,.
$1
.—.первое.слово,.
$2
.—.второе.слово.и.т..д..Программа.
awk состоит.из.шаблонов.и.соответствующего.кода,.который.при.совпадении.шаблона.
должен.быть.выполнен..В.данном.примере.есть.только.один.шаблон..Мы.проверяем.
лишь.поле.
$2
,.чтобы.посмотреть,.содержит.ли.оно.значение.
Jones
..Если.совпадение.
обнаружится,.
awk
.запустит.код,.указанный.в.скобках,.который.в.данном.случае.
выведет.всю.строку.
Если мы не будем делать явное сравнение и вместо этого напишем неуклюжее '/ Jones/ {print $0}', строка между слешами станет регулярным выражением, которое будет сопоставляться с любым другим регулярным выражением в строке ввода. Коман- да, как и прежде, будет выводить все имена, но также найдет строки, где Jones может быть полным именем или частью более длинного имени (например, "Jonestown").
join
Команда.
join
.объединяет.строки.из.двух.файлов.с.общими.полями..Чтобы.файлы.
были.правильно.объединены,.их.нужно.корректно.отсортировать.
Общие параметры команды
-j
.—.использовать.указанный.номер.поля..Поля.начинаются.с.1.
-t
.—.символ,.который.будет.использоваться.в.качестве.разделителя.полей..
По.умолчанию.разделителем.является.пробел..
--header
.—.использовать.в.ка- честве.заголовка.первой.строки.каждого.файла.
Пример команды
Рассмотрим.файлы,.приведенные.в.примерах.6.2.и.6.3.
Пример 6.2. username.txt
1,jdoe
2,puser
3,jsmith
98 Часть II • Защитные операции с использованием bash
Пример 6.3. accesstime.txt
0745,file1.txt,1 0830,file4.txt,2 0830,file5.txt,3
Оба.файла.имеют.общее.поле.данных,.хранящее.идентификаторы.пользователей..
В.файле.
accesstime.txt
.идентификатор.пользователя.находится.в.третьем.столбце..
В.файле.
usernames.txt
.идентификатор.пользователя.находится.в.первом.столбце..
Вы.можете.объединить.эти.два.файла.следующим.образом:
$ join -1 3 -2 1 -t, accesstime.txt username.txt
1,0745,file1.txt,jdoe
2,0830,file4.txt,puser
3,0830,file5.txt,jsmith
Параметр.
-1 3
.указывает.
join
.использовать.третий.столбец.в.первом.файле.
(
accesstime.txt
),.а.
-2 1
.указывает.взять.при.объединении.файлов.первый.столбец.
во.втором.файле.(
usernames.txt
)..Параметр.
–t,
.говорит.о.том,.что.в.качестве.раз- делителя.полей.используется.запятая.
sed
Команда.
sed
.позволяет.выполнять.редактирование,.например.заменять.символы.
в.потоке.данных.
Общие параметры команды
-i
.—.редактировать.указанный.файл.и.перезаписать.на.месте.
Пример команды
Команда.
sed
.многофункциональная.и.может.быть.использована.для.выполнения.
различных.действий..Одна.из.наиболее.распространенных.функций.—.замена.
символов.или.последовательностей.символов.
Посмотрите.файл.
ips.txt
,.показанный.в.примере.6.4.
Пример 6.4. ips.txt ip,OS
10.0.4.2,Windows 8 10.0.4.35,Ubuntu 16 10.0.4.107,macOS
10.0.4.145,macOS
Вы.можете.использовать.команду.
sed
.для.замены.всех.IP-адресов.10.0.4.35.на.
10.0.4.27:
Глава 6. Обработка данных 99
$ sed 's/10\.0\.4\.35/10.0.4.27/g' ips.txt ip,OS
10.0.4.2,Windows 8 10.0.4.27,Ubuntu 16 10.0.4.107,macOS
10.0.4.145,macOS
В.этом.примере.команда.
sed
.использует.формат,.где.каждый.компонент.разделен.
слешем:
s/
Первая.часть.приведенной.команды.указывает.
sed
.выполнить.замену..Вторая.часть.
команды.(
10\.0\.4\.35
).представляет.собой.шаблон.регулярного.выражения..Третья.
часть.(
10.0.4.27
).—.это.значение,.которое.следует.использовать.для.замены.в.случае.
соответствия.шаблону..Четвертая.часть.—.необязательные.флаги,.которые.в.данном.
случае.(
g
.для.глобальной.замены).указывают.
sed
.заменить.все.экземпляры.в.строке.
(а.не.только.первые),.соответствующие.шаблону.регулярного.выражения.
tail
Команда.
tail
.используется.для.вывода.последних.строк.файла..По.умолчанию.
в.конце.будут.выведены.последние.десять.строк.файла.
Общие параметры команды
-f
.—.выполнять.постоянный.мониторинг.файлов.и.выходных.строк.по.мере.их.
добавления.
-n
.—.вывести.указанное.количество.строк.
Пример команды
Для.вывода.последней.строки.в.файле.
somefile.txt
.напишите.следующее:
$ tail -n 1 somefile.txt
12/30/2017 192.168.10.185 login.html tr
Команда.
tr
.используется.для.преобразования.(замены).одного.символа.в.другой.
или.отображения.замещающего.символа..Эта.команда.также.часто.применяется.
для.удаления.нежелательных.или.посторонних.символов..Ввод.команды.
tr
.осу- ществляется.или.из.стандартного.ввода,.или.из.вывода.других.программ.путем.
перенаправления.
100 Часть II • Защитные операции с использованием bash
Общие параметры команды
-d
.—.удалить.указанные.знаки.из.входного.потока.
-s
.—.уплотнить,.то.есть.заменить.повторяющиеся.экземпляры.символа.одним.
экземпляром.
Пример команды
С.помощью.команды.
tr
.можно.заменить.все.обратные.слеши.прямыми,.а.все.двое- точия.—.вертикальными.линиями:
tr '\\:' '/|' < infile.txt > outfile.txt
Предположим,.содержимое.
infine.txt
.выглядит.следующим.образом:
drive:path\name c:\Users\Default\file.txt
После.выполнения.команды.
tr
.файл.
outfile.txt
.будет.выглядеть.так:
drive|path/name c|/Users/Default/file.txt
Символы.из.первого.аргумента.сопоставляются.с.соответствующими.символами.
второго.аргумента..Два.обратных.слеша.используются.для.обозначения.символа.
одного.обратного.слеша,.так.как.введенный.в.строку.одиночный.обратный.слеш.
имеет.особое.значение.для.
tr
.и.используется.для.обозначения.таких.специальных.
символов,.как.символ.разрыва.строки.(
\n
),.возврата.каретки.(
\r
).или.табуляции.
(
\t
)..Чтобы.избежать.какой-либо.специальной.интерпретации.в.bash,.приводите.
эти.аргументы.в.одиночных.кавычках.
Файлы, получаемые из операционной системы Windows, часто имеют в конце каждой строки символы возврата каретки (carriage return) и перевода строки (line feed) (CR & LF). В системах Linux и macOS для завершения строки предусмотрен только символ разрыва строки (newline). Если вы переносите файл в Linux и хотите избавиться от дополнительных возвращаемых символов, выполните команду tr, как показано ниже:
tr -d '\r' < fileWind.txt > fileFixed.txt
И наоборот, с помощью команды sed вы можете преобразовать конец строки файлов из операционной системы Linux в конец строки для операционной си- стемы Windows:
$ sed -i 's/$/\r/' fileLinux.txt
Параметр -i вносит изменения на месте и записывает их обратно во входной файл.
Глава 6. Обработка данных 101
Обработка файлов c разделителями
Многие.файлы,.которые.вы.будете.обрабатывать,.скорее.всего,.содержат.текст..
Поэтому.важно.уметь.обрабатывать.текст.из.командной.строки..Текстовые.файлы.
разбиваются.на.поля.с.помощью.таких.разделителей,.как.пробел,.символ.табуля- ции.или.запятая..Один.из.наиболее.распространенных.форматов.называется.CSV.
и.обозначает.данные,.разделенные.запятыми.(comma-separated.values)..Поля.могут.
быть.указаны.в.двойных.кавычках.(
"
)..Первая.строка.CSV-файла.часто.является.
заголовком.поля..Пример.6.5.показывает.образец.CSV-файла.
Пример 6.5. csvex.txt
"name","username","phone","password hash"
"John Smith","jsmith","555-555-1212",5f4dcc3b5aa765d61d8327deb882cf99
"Jane Smith","jnsmith","555-555-1234",e10adc3949ba59abbe56e057f20f883e
"Bill Jones","bjones","555-555-6789",d8578edf8458ce06fbc5bb76a58c5ca4
Чтобы.извлечь.из.файла.только.имя,.следует.использовать.команду.
cut
,.указав.
в.качестве.разделителя.полей.запятую.и.номер.возвращаемого.поля:
$ cut -d',' -f1 csvex.txt
"name"
"John Smith"
"Jane Smith"
"Bill Jones"
Обратите.внимание,.что.значения.полей.по-прежнему.заключены.в.двойные.кавыч- ки..Для.некоторых.приложений.это.может.стать.помехой..Чтобы.удалить.кавычки,.
следует.передать.вывод.в.команду.
tr
.с.помощью.опции.
-d
:
$ cut -d',' -f1 csvex.txt | tr -d '"'
name
John Smith
Jane Smith
Bill Jones
Дальнейшую.обработку.данных.можно.выполнить,.удалив.заголовок.поля.с.по- мощью.опции.
-n
.команды.
tail
:
$ cut -d',' -f1 csvex.txt | tr -d '"' | tail -n +2
John Smith
Jane Smith
Bill Jones
102 Часть II • Защитные операции с использованием bash
Опция.
-n
+2
.указывает.команде.
tail
.выводить.содержимое.файла,.начиная.со.
строки.
2
,.удаляя.таким.образом.заголовок.поля.
Вы также можете предоставить команде cut список полей, которые необходимо извлечь. Например, -f1-3 извлечет поля с 1 по 3, а -f1, 4 — поля 1 и 4.
Итерация данных с разделителями
Хотя.для.извлечения.целых.столбцов.данных.можно.использовать.команду.
cut
,.
иногда.при.обработке.файла.требуется.извлекать.поля.построчно..В.этом.случае.
вам.лучше.всего.воспользоваться.командой.
awk
Предположим,.вы.хотите.проверить.хеш.пароля.каждого.пользователя,.который.
хранится.в.файле.
csvex.txt
,.на.соответствие.файлу.со.словарем.известных.паролей.
passwords.txt
.(примеры.6.6.и.6.7).
Пример 6.6. csvex.txt
"name","username","phone","password hash"
"John Smith","jsmith","555-555-1212",5f4dcc3b5aa765d61d8327deb882cf99
"Jane Smith","jnsmith","555-555-1234",e10adc3949ba59abbe56e057f20f883e
"Bill Jones","bjones","555-555-6789",d8578edf8458ce06fbc5bb76a58c5ca4
1 ... 5 6 7 8 9 10 11 12 ... 23
Пример 6.7. passwords.txt password,md5hash
123456,e10adc3949ba59abbe56e057f20f883e password,5f4dcc3b5aa765d61d8327deb882cf99
welcome,40be4e59b9a2a2b5dffb918c0e86b3d7
ninja,3899dcbab79f92af727c2190bbd8abc5
abc123,e99a18c428cb38d5f260853678922e03 123456789,25f9e794323b453885f5181f1b624d0b
12345678,25d55ad283aa400af464c76d713c07ad sunshine,0571749e2ac330a7455809c6b0e7af90
princess,8afa847f50a716e64932d995c8e7435a qwerty,d8578edf8458ce06fbc5bb76a58c5c
Вы.можете.извлечь.хеш.пароля.каждого.пользователя.из.файла.
csvex.txt
,.следу- ющим.образом.используя.команду.
awk
:
$ awk -F "," '{print $4}' csvex.txt
"password hash"
5f4dcc3b5aa765d61d8327deb882cf99
e10adc3949ba59abbe56e057f20f883e d8578edf8458ce06fbc5bb76a58c5ca4
Глава 6. Обработка данных 103
По.умолчанию.в.качестве.разделителя.полей.команда.
awk
.использует.пробел,.
поэтому.параметр.
-F
.применяется.для.идентификации.пользовательского.раз- делителя.полей.(
,
).и.последующей.печати.четвертого.поля.(
$4
),.которое.пред- ставляет.собой.хеш.пароля..Затем.вы.можете.использовать.команду.
grep
,.которая.
укажет.команде.
awk
.выводить.любые.совпадения,.найденные.в.файле.
passwords.txt
,.
по.одной.строке:
$ grep "$(awk -F "," '{print $4}' csvex.txt)" passwords.txt
123456,e10adc3949ba59abbe56e057f20f883e password,5f4dcc3b5aa765d61d8327deb882cf99
qwerty,d8578edf8458ce06fbc5bb76a58c5ca4
Обработка по позиции символа
Если.файл.имеет.поля.фиксированной.ширины,.то.для.извлечения.данных.по.по- зиции.символа.можно.использовать.параметр.
-c
.команды.
cut
..В.файле.
csvex.txt номер.телефона.—.это.пример.поля.фиксированной.ширины..Рассмотрим.следу- ющий.пример:
$ cut -d',' -f3 csvex.txt | cut -c2-13 | tail -n +2 555-555-1212 555-555-1234 555-555-6789
Для.извлечения.телефонного.номера.из.поля.3.сначала.используется.команда.
cut
(с.указанием.разделителя)..Поскольку.каждый.номер.телефона.имеет.одинаковое.
количество.символов,.то.для.извлечения.символов,.находящихся.между.кавычка- ми,.вы.можете.использовать.команду.
cut
.с.параметром.
-c
..После.чего.для.удаления.
заголовка.файла.следует.ввести.команду.
tail
Обработка XML
Расширяемый.язык.разметки.(XML).позволяет.произвольно.создавать.теги.
и.элементы,.описывающие.данные..В.примере.6.8.представлен.пример.XML- документа.
Пример 6.8. book.txt
104 Часть II • Защитные операции с использованием bash
.Это.открывающий.тег,.содержащий.два.атрибута,.также.известные.как.пара.
«имя/значение»..Значения.атрибутов.всегда.должны.заключаться.в.кавычки.
.Открывающий.тег.
.Это.элемент.с.содержимым.
.Закрывающий.тег.
Для.успешной.обработки.вы.должны.иметь.возможность.поиска.в.XML.и.извле- чения.данных.из.тегов..Это.действие.можно.выполнить.с.помощью.команды.
grep
Найдем.все.элементы.
firstName
..Чтобы.вернуть.текст,.соответствующий.шаблону.
регулярного.выражения,.а.не.всей.строке,.следует.использовать.опцию.
-o
:
$ grep -o '
Обратите.внимание:.если.открывающий.и.закрывающий.теги.находятся.в.одной.
строке,.указанное.регулярное.выражение.находит.только.элемент.XML..Чтобы.
найти.заданный.образец.в.нескольких.строках,.вам.нужно.использовать.две.спе- циальные.функции..Во-первых,.добавьте.к.команде.
grep
.параметр.
-z
,.который.
позволит.в.процессе.поиска.обработать.новые.строки.как.любой.обычный.символ.
и.добавить.нулевое.значение.(ASCII.0).в.конце.каждой.найденной.строки..Затем.
к.шаблону.регулярных.выражений,.который.является.модификатором.сопостав- ления.с.образцом.для.Perl,.добавьте.опцию.
-P
.и.
(?s)
..С.помощью.этого.шаблона.
будет.выполнена.замена.метасимвола.
.соответствующим.символом.новой.строки..
Вот.пример.с.этими.двумя.функциями:
$ grep -Pzo '(?s)