Файл: Paul Troncone and Carl AlbingCybersecurity Ops with bashAttack, Defend, and Analyze from the.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 457
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
156 Часть II • Защитные операции с использованием bash
Упражнения
Попробуйте.расширить.и.настроить.функционал.инструмента.мониторинга.сети,.
добавив.следующие.возможности.
1.. При.сравнении.двух.отсканированных.файлов.следует.учитывать.разницу.в.их.
размерах.или.разницу.в.наборах.IP-адресов/имен.хостов.
2.. Используйте.
/dev/tcp
.для.создания.простейшего.SMPT-клиента,.чтобы.сцена- рий.не.требовал.наличия.команды.
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
10
Инструмент: контроль файловой системы
Заражение.файловой.системы.целевого.объекта.вредоносными.программами.
и.другие.вторжения.часто.обнаруживаются.по.изменениям,.которые.вредоносные.
программы.вносят.в.эту.файловую.систему..Для.идентификации.файлов,.которые.
были.добавлены,.удалены.или.изменены,.можно.использовать.свойства.крип- тографической.хеш-функции.и.возможности.командной.строки..Эта.методика.
может.быть.наиболее.эффективной.в.таких.системах,.как.серверы.или.встраива- емые.устройства,.которые.на.регулярной.основе.не.претерпевают.существенных.
изменений.
В.этой.главе.мы.разработаем.инструмент.для.создания.в.файловой.системе.базо- вого.файла,.в.котором.зафиксируем.текущее.состояние.файловой.системы..Далее,.
используя.этот.базовый.файл,.мы.сравним.зафиксированное.состояние.системы.
с.более.поздним.и.определим,.были.ли.файлы.добавлены,.удалены.или.изменены..
Для.этого.требуется.следующее.
1.. Записать.путь.к.каждому.файлу.в.данной.системе.
2.. Создать.для.каждого.файла.этой.системы.хеш.SHA-1.
3.. Повторно.запустить.инструмент.и.вывести.имена.всех.файлов,.которые.были.
изменены,.удалены,.перемещены,.или.имена.новых.файлов.
Используемые команды
В.этой.главе.для.сравнения.файлов.мы.воспользуемся.командой.
sdiff sdiff
Команда.
sdiff
.сравнивает.два.файла,.находящихся.рядом,.и.показывает.все.их.
различия.
158 Часть II • Защитные операции с использованием bash
Общие параметры команды
-a
.—.рассматривать.все.файлы.как.текстовые.
-i
.—.игнорировать.регистр.
-s
.—.удалять.общие.строки.для.двух.файлов.
-w
.—.определить.максимальное.количество.символов.для.вывода.в.строке.
Пример команды
Чтобы.сравнить.два.файла.и.вывести.только.строки,.которые.отличаются,.введите.
следующее:
sdiff -s file1.txt file2.txt
Шаг 1. Определение исходного состояния файловой системы
Определение.исходного.состояния.файловой.системы.включает.в.себя.вычисление.
цифровой.последовательности.сообщения.(хеш-значения).каждого.файла,.находя- щегося.в.настоящее.время.в.системе,.и.запись.результатов.в.файл..Для.определения.
исходного.состояния.вы.можете.использовать.команды.
find
.и.
sha1sum
:
SYSNAME="$(uname -n)_$(date +'%m_%d_%Y')" ; sudo find / -type f |
xargs -d '\n' sha1sum > ${SYSNAME}_baseline.txt 2>${SYSNAME}_error.txt
Чтобы.обеспечить.доступ.ко.всем.файлам,.при.работе.в.операционной.системе.
Linux.мы.используем.команду.
sudo
..Для.каждого.найденного.файла.вычисляем.
хеш.
SHA1
.с.помощью.
sha1sum
,.но.
sha1sum
.вызываем.командой.
xargs
..Она.помещает.
в.командную.строку.
sha1sum
.столько.имен.файлов.(входных.данных,.которые.она.
считывает.из.конвейера),.сколько.может.(ограничивается.памятью)..Это.будет.
намного.эффективнее,.чем.вызывать.команду.
shal1sum
.для.каждого.отдельно- го.файла..Вместо.этого.данная.команда.будет.вызываться.один.раз.на.каждые.
1000.файлов.или.более.(в.зависимости.от.длины.пути)..Мы.перенаправляем.
вывод.в.файл,.содержащий.как.имя.системы,.так.и.текущую.дату,.—.это.важная.
информация.для.целей.организации.и.определения.времени..Мы.также.перена- правляем.все.сообщения.об.ошибках.в.отдельный.файл.журнала,.который.можно.
просмотреть.позже.
В.примере.10.1.показан.созданный.базовый.файл.вывода..Первый.столбец.содержит.
хеш.SHA1,.а.второй.столбец.—.файл,.который.представляет.данный.хеш.
Глава 10. Инструмент: контроль файловой системы 159
Пример 10.1. baseline.txt
3a52ce780950d4d969792a2559cd519d7ee8c727 /.gitkeep ab4e53fda1a93bed20b1cc92fec90616cac89189 /autoscan.sh ccb5bc521f41b6814529cc67e63282e0d1a704fe /fd2.sh baea954b95731c68ae6e45bd1e252eb4560cdc45 /ips.txt
334389048b872a533002b34d73f8c29fd09efc50 /localhost
При использовании в Git Bash команды sha1sum в файле вывода в начале файлового пути часто добавляется символ *. Это может помешать в дальнейшем использовать базовый файл для выявления изменений. Можно направить вывод sha1sum в команду sed, чтобы удалить первое вхождение символа *:
sed 's/*//'
Для.достижения.наилучших.результатов.желательно.провести.определение.исход- ного.состояния.файловой.системы,.когда.система.находится.в.заведомо.хорошей.
конфигурации,.например,.когда.стандартная.операционная.система,.приложения.
и.исправления.только.что.были.установлены..Это.гарантирует,.что.вредоносные.
программы.или.другие.нежелательные.файлы.не.станут.частью.файла,.в.котором.
зафиксировано.исходное.состояние.системы.
Шаг 2. Обнаружение изменений в исходном состоянии системы
Чтобы.обнаружить.изменения.в.системе,.необходимо.сравнить.ранее.записанное.
исходное.состояние.системы.с.ее.текущим.состоянием..При.сравнении.происхо- дит.пересчет.вычисленной.цифровой.последовательности.сообщения.(хеша).для.
каждого.файла,.находящегося.в.системе,.и.сравнение.вновь.полученного.значения.
с.последним,.ранее.зафиксированным.значением.(в.базовом.файле)..Если.значения.
различаются,.значит,.файл,.хеш.которого.проверяется,.претерпел.изменения..Если.
файл.упоминается.в.базовом.списке,.но.в.системе.отсутствует,.следовательно,.он.
был.удален,.перемещен.или.переименован..Если.файл.в.системе.существует,.но.
в.базовом.списке.отсутствует,.можно.предположить,.что.это.новый.файл.или.файл,.
который.был.перемещен.или.переименован.
Команда.
sha1sum
.хороша.тем,.что,.если.вы.просто.используете.параметр.
–с
,.она.сде- лает.большую.часть.работы.за.вас..С.помощью.этой.опции.
sha1sum
.будет.считывать.
160 Часть II • Защитные операции с использованием bash в.файл.ранее.созданные.дайджесты.сообщений.и.пути.и.проверять,.совпадают.ли.
хеш-значения..Чтобы.отобразить.только.несовпадающие.файлы,.используйте.па- раметр.
--quiet
:
$ sha1sum -c --quiet baseline.txt sha1sum: /home/dave/file1.txt: No such file or directory
/home/dave/file1.txt: FAILED open or read
/home/dave/file2.txt: FAILED
sha1sum: WARNING: 1 listed file could not be read sha1sum: WARNING: 2 computed checksums did NOT match
.Здесь.отображаются.выходные.данные.stderr,.указывающие.на.то,.что.файл.
больше.недоступен..Это.связано.с.перемещением,.удалением.или.переименованием.
файла..Вывод.можно.скрыть,.перенаправив.stderr.в.файл.или.
/dev/null
.Это.сообщение.stdout,.информирующее,.что.указанный.файл.не.найден.
.Данное.сообщение.означает,.что.файл,.указанный.в.
baseline.txt
,.найден,.но.
дайджест.сообщения.не.совпадает,.то.есть.файл.каким-то.образом.изменился.
Единственное,.что.
sha1sum
.не.может.сделать.для.вас,.—.это.определить,.что.новый.
файл.был.добавлен.в.систему..Но.у.вас.есть.все.необходимое,.чтобы.определить.
данное.изменение.самостоятельно..Базовый.файл.содержит.путь.ко.всем.фай- лам,.которые.находились.в.системе.на.момент.его.создания..Все,.что.вам.нужно.
сделать,.—.создать.новый.список.файлов,.находящихся.на.данный.момент.в.си- стеме,.и,.чтобы.идентифицировать.новые.файлы,.сравнить.его.с.базовым.файлом..
Для..этого.можно.использовать.команды.поиска.и.объединения..
Первым.шагом.станет.создание.нового.списка.всех.файлов,.находящихся.на.данный.
момент.в.системе,.и.сохранение.базового.файла:
find / -type f > filelist.txt
В.примере.10.2.показан.образец.содержимого.файла.
filelist.txt
Пример 10.2. filelist.txt
/.gitkeep
/autoscan.sh
/fd2.sh
/ips.txt
/localhost
Затем.для.сравнения.базового.файла.с.текущим.списком.файлов.можно.исполь- зовать.команду.
join
..Вы.будете.сравнивать.ранее.записанный.базовый.файл.
Глава 10. Инструмент: контроль файловой системы 161
(
baseline.txt
).и.сохраненный.вывод,.полученный.с.помощью.команды.
find
(
filelist.txt
).
Для.правильной.работы.команды.
join
.требуется,.чтобы.оба.файла.были.отсортиро- ваны.с.использованием.одного.и.того.же.поля.данных..При.сортировке.
baseline.txt файл.должен.быть.упорядочен.по.второму.полю.(
-k2
),.поскольку.требуется.ис- пользовать.путь.к.файлу,.а.не.значение.дайджеста.сообщения..Необходимо.также.
обязательно.сопоставить.одни.и.те.же.поля.данных:.поле.
1
.в.файле.
filelist.txt
(-1 1
).и.поле.
2
.в.файле.
baseline.txt
.(
-2 2
)..Если.совпадение.не.найдено,.параметр.
-a
1
.указывает.команде.
join
.выводить.поле.из.первого.файла:
$ join -1 1 -2 2 -a 1 <(sort filelist.txt) <(sort -k2 baseline.txt)
/home/dave/file3.txt 824c713ec3754f86e4098523943a4f3155045e19
/home/dave/file4.txt
/home/dave/filelist.txt
/home/dave/.profile dded66a8a7137b974a4f57a4ec378eda51fbcae6
.Было.выполнено.сопоставление,.и.мы.определили,.что.данный.файл.существует.
как.в.
filelist.txt
,.так.и.в.
baseline.txt
.В.данном.случае.совпадений.не.выявлено..Файл,.обнаруженный.в.базовом.файле.
filelist.txt
,.в.
baseline.txt
.отсутствует..Это.значит,.что.обнаруженный.файл.
новый,.перемещенный.или.переименованный.
Чтобы.идентифицировать.новые.файлы,.вам.нужно.искать.в.выводе.строки,.кото- рые.не.имеют.дайджеста.сообщения..Вы.можете.сделать.это.вручную.или.передать.
вывод.в.
awk
.и.отобразить.строки.со.вторым.пустым.полем:
$ join -1 1 -2 2 -a 1 <(sort filelist.txt) <(sort -k2 baseline.txt) |
awk '{if($2=="") print $1}'
/home/dave/file4.txt
/home/dave/filelist.txt
Другой.способ.идентифицировать.новые.файлы.—.использовать.команду.
sdiff
Она.выполняет.параллельное.сравнение.двух.файлов..Если.не.было.добавлено.или.
удалено.большое.количество.файлов,.
baseline.txt
.и.
filelist.txt
.должны.быть.
одинаковы..Поскольку.оба.файла.с.помощью.команды.
find
.были.созданы.из.одной.
и.той.же.точки,.они.должны.быть.отсортированы.в.одном.и.том.же.порядке..Чтобы.
пропустить.одинаковые.строки.и.показать.только.разницу,.команду.
sdiff
.следует.
использовать.совместно.с.параметром.
-s
:
$ cut -c43- ../baseline.txt | sdiff -s -w60 - ../filelist.txt
> ./prairie.sh
./why dot why | ./ex dot ex
./x.x <
1 ... 11 12 13 14 15 16 17 18 ... 23
162 Часть II • Защитные операции с использованием bash
Символ.
>
.определяет.строки,.уникальные.для.
filelist.txt
,.которые.в.этом.случае.
будут.именами.добавленных.файлов..Символ.
<
.показывает.строки,.находящиеся.
только.в.первом.файле.(
baseline.txt
),.которые.в.данном.случае.являются.именами.
удаленных.файлов..Символ.
|
.обозначает.строки,.отличающиеся.в.двух.файлах..
Это.может.быть.переименованный.файл..Возможно,.один.файл.был.удален.и.в.эту.
позицию.был.добавлен.новый.файл.
Шаг 3. Автоматизация и уведомление
Вы.можете.автоматизировать.предыдущие.процессы,.позволяющие.собрать.и.про- верить.базовые.показатели.системы,.чтобы.с.помощью.bash.сделать.их.более.эф- фективными.и.полнофункциональными..Вывод.этого.сценария.bash.представлен.
в.формате.XML.и.содержит.следующие.теги:.
.(который.будет.иметь.
атрибуты.
host
.и.
dir
),.
,.
,.
.и.
..Тег.
будет.иметь.атрибут.
orig
,.чтобы.можно.было.указать.предыдущее.местоположение.
файла.(пример.10.3).
Пример 10.3. baseline.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# baseline.sh
#
# Описание:
# Создает базовый файл или сравнивает текущее состояние
# файловой системы с предыдущим базовым файлом
#
# Использование: ./baseline.sh [-d path] []
# -d Стартовый каталог для базового файла
# Если указан только один файл, создать новый базовый файл
# [] Предыдущий базовый файл для сравнения
#
function usageErr ()
{
echo 'usage: baseline.sh [-d path] file1 [file2]'
echo 'creates or compares a baseline from path'
echo 'default for path is /'
exit 2
} >&2
function dosumming ()
{
Глава 10. Инструмент: контроль файловой системы 163
find "${DIR[@]}" -type f | xargs -d '\n' sha1sum
}
function parseArgs ()
{
while getopts "d:" MYOPT
do
# не проверяется MYOPT, так как существует только один вариант
DIR+=( "$OPTARG" )
done shift $((OPTIND-1))
# нет аргументов? слишком много?
(( $# == 0 || $# > 2 )) && usageErr
(( ${#DIR[*]} == 0 )) && DIR=( "/" )
}
declare -a DIR
# создайте базовый файл (предоставляется только одно имя файла)
# либо сделайте вторичные краткие выводы (при наличии двух имен файлов)
parseArgs
BASE="$1"
B2ND="$2"
if (( $# == 1 )) # только один аргумент then
# создание "$BASE"
dosumming > "$BASE"
# все сделано для базового файла exit fi if [[ ! -r "$BASE" ]]
then usageErr fi
# если второй файл существует, сравнить оба файла
# иначе создать/заполнить его if [[ ! -e "$B2ND" ]]
then echo creating "$B2ND"
dosumming > "$B2ND"
fi
164 Часть II • Защитные операции с использованием bash
# что мы имеем: создано два файла sha1sum declare -A BYPATH BYHASH INUSE # ассоциативные массивы
# в качестве базового загрузите первый файл while read HNUM FN
do
BYPATH["$FN"]=$HNUM
BYHASH[$HNUM]="$FN"
INUSE["$FN"]="X"
done < "$BASE"
# ------ теперь начинаем вывод
# смотрим, есть ли каждое имя файла, указанное во втором файле,
# по такому же месторасположению (пути), что и в первом (базовом файле)
printf '\n' "$HOSTNAME" "${DIR[*]}"
while read HNUM FN
do
WASHASH="${BYPATH[${FN}]}"
# нашел ли он его? если нет, то это будет null if [[ -z $WASHASH ]]
then
ALTFN="${BYHASH[$HNUM]}"
if [[ -z $ALTFN ]]
then printf ' %s \n' "$FN"
else printf ' %s \n' "$ALTFN" "$FN"
INUSE["$ALTFN"]='_' # пометить как просмотренное fi else
INUSE["$FN"]='_' # пометить как просмотренное if [[ $HNUM == $WASHASH ]]
then continue; # ничего не изменилось;
else printf ' %s \n' "$FN"
fi fi done < "$B2ND"
for FN in "${!INUSE[@]}"
do if [[ "${INUSE[$FN]}" == 'X' ]]
then printf ' %s \n' "$FN"
fi done printf ' \n'
Глава 10. Инструмент: контроль файловой системы 165
.В.этой.функции.весь.вывод.stdout.перенаправляется.в.stderr..Таким.образом,.нам.
не.нужно.задавать.перенаправление.для.каждого.оператора.
echo
..Мы.отправляем.
вывод.в.stderr,.потому.что.это.не.предполагаемый.вывод.программы,.а.просто.со- общения.об.ошибках.
.Данная.функция.выполняет.основную.работу.по.созданию.
sha1sum
.для.всех.фай- лов.в.указанных.каталогах..Программа.
xargs
.выведет.столько.имен.файлов,.сколько.
может.поместиться.в.командной.строке.команды.
sha1sum
..Это.позволяет.избежать.
необходимости.каждый.раз.отдельно.вызывать.
sha1sum
.для.каждого.файла.(вызов.
sha1sum
.для.всех.файлов.сильно.замедлит.работу.программы)..Вместо.этого.при.
каждом.вызове.
sha1sum
.обрабатывает.1000.или.более.имен.файлов.
.Для.поиска.параметра.
-d
.со.связанным.с.ним.аргументом.(обозначенным.
:
).ис- пользуем.встроенный.цикл.
getopts
..Для.получения.дополнительной.информации.
о.
getopts
.см..пример.5.4.
.Поскольку.нам.требуется.разрешить.указывать.несколько.каталогов,.мы.добав- ляем.каждый.каталог.в.массив.
DIR
.После.завершения.цикла.
getopts
.нам.нужно.настроить.количество.аргументов..
Чтобы.избавиться.от.аргументов,.которые.были.«использованы».
getopts
,.при- меняем.
shift
.Если.каталоги.не.указаны,.то.по.умолчанию.данные.расположены.в.корне.фай- ловой.системы..Если.для.выполнения.данной.операции.ваших.прав.доступа.будет.
достаточно,.все.файлы.окажутся.в.файловой.системе.
.Эта.строка.считывает.значение.хеша.и.имя.файла..Но.откуда.эти.данные.считы- ваются,.если.нет.конвейера.команд,.передающих.данные.на.чтение?.Ответ.можно.
найти.в.конце.цикла.
while
.Вот.ответ,.указывающий.на.источник.данных..Помещая.перенаправление.
в.оператор.
while/do/done
,.вы.в.этом.цикле.перенаправляете.все.операторы.в.stdin.
(в.данном.случае)..Для.нашего.сценария.это.означает,.что.оператор.
read
.получает.
входные.данные.из.файла,.указанного.в.
$B2ND
Вот.результат.выполнения.примера:
$ bash baseline.sh -d . baseline.txt baseln2.txt
./analyze/Project1/fd2.bck
./analyze/Project1/farm2.sh
./caveat.sample.ch
./x.x
166 Часть II • Защитные операции с использованием bash
.Этот.тег.определяет.хост.и.относительный.путь.
.Данный.тег.идентифицирует.новый.файл,.созданный.после.созания.исходного.
базового.файла.
.Данный.файл.после.создания.базового.файла.был.перемещен.в.новое.место.
.После.создания.базового.файла.содержимое.файла.изменилось.
.После.создания.базового.файла.этот.файл.был.удален.
Выводы
Создание.базового.файла.и.периодическая.его.проверка.—.это.эффективный.способ.
выявления.подозрительного.поведения.в.ваших.системах..Это.особенно.полезно.
для.систем,.состояние.которых.редко.изменяется.
В.следующей.главе.мы.подробнее.разберем,.как.использовать.командную.строку.
и.bash.для.анализа.отдельных.файлов,.чтобы.определить,.являются.ли.они.вредо- носными.
Упражнения
1.. Улучшите.для.
baseline.sh
.пользовательский.интерфейс,.предотвратив.случай- ную.перезапись.базового.файла..Как?.Если.пользователь.указывает.только.один.
файл,.проверьте,.существует.ли.этот.файл..Если.это.так,.спросите.пользователя,.
можно.ли.перезаписать.файл,.и.в.зависимости.от.ответа.выберите.один.из.ва- риантов:.продолжить.или.выйти.
2.. Измените.сценарий.
baseline.sh
.следующим.образом:.напишите.функцию.обо- лочки.для.преобразования.записей.в.массиве.DIR.в.абсолютные.пути..Вызовите.
эту.функцию.непосредственно.перед.печатью.XML,.чтобы.тег.
filesystem в.атрибуте.
dir
.перечислял.абсолютные.пути.
3.. Измените.сценарий.
baseline.sh
.следующим.образом:.для.тега.
relocated
.про- верьте,.находятся.ли.исходный.и.перемещенный.файл.в.одном.каталоге.(то.
есть.имеют.одно.и.то.же.имя.каталога);.если.это.так,.выведите.только.
basename в.атрибуте.
orig
=
""
..Например,.то,.что.печаталось.так:
./ProjectAA/farm2.sh
будет.выводиться.таким.образом:
./ProjectAA/farm2.sh
Глава 10. Инструмент: контроль файловой системы 167
4.. Как.можно.изменить.сценарий.
baseline.sh
,.чтобы.для.ускорения.его.работы.
запустить.параллельные.друг.другу.процессы?.Реализуйте.свои.идеи.для.парал- лельного.запуска.процессов.сценария.
baseline.sh
,.которые.позволят.повысить.
производительность..Если.поместить.часть.сценария.в.фоновый.режим,.как.
перед.продолжением.работы.выполнить.повторную.синхронизацию?.
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
11
Анализ вредоносных программ
Обнаружение.вредоносного.кода.—.это.основное.и.самое.сложное.действие.при.
обеспечении.кибербезопасности..При.анализе.фрагмента.кода.вы.можете.исполь- зовать.два.основных.варианта:.статический.и.динамический..Во.время.статического.
анализа.вы.анализируете.сам.код,.чтобы.определить,.существуют.ли.признаки.вре- доносной.активности..Во.время.динамического.анализа.вы.выполняете.код,.а.затем.
смотрите,.что.он.делает.и.как.влияет.на.систему..В.этой.главе.мы.сосредоточимся.
на.методах.статического.анализа.
При работе с потенциально вредоносными файлами обязательно выполните анализ системы, не подключенной к сети и не содержащей конфиденциальной информации. После этого предположите, что система заражена, и, прежде чем вводить ее обратно в сеть, полностью очистите и восстановите систему.
Используемые команды
В.этой.главе.мы.рассмотрим.команду.
curl
,.которая.позволяет.взаимодействовать.
с.сайтами,.команду.
vi
.для.редактирования.файлов.и.команду.
xxd
.для.выполнения.
базовых.преобразований.и.анализа.файлов.
curl
Команду.
curl
.можно.использовать.для.передачи.данных.по.сети.между.клиентом.
и.сервером..Команда.поддерживает.несколько.протоколов,.включая.HTTP,.HTTPS,.
FTP,.SFTP.и.Telnet..Это.универсальная.команда..Представленные.ниже.параме- тры.предлагают.лишь.небольшую.часть.доступных.возможностей..Для.получения.
дополнительной.информации.относительно.этой.команды.не.забудьте.посетить.
соответствующую.страницу.руководства.Linux.
Глава 11. Анализ вредоносных программ 169
Общие параметры команды
-А
.—.для.отправки.на.сервер.указать.строку.агента.пользователя.HTTP.
-d
.—.данные.для.отправки.с.запросом.HTTP.POST.
-G
.—.использовать.для.отправки.данных.запрос.HTTP.GET,.а.не.POST.
-I
.—.получить.только.заголовок.протокола.(HTTP,.FTP).
-L
.—.следовать.за.перенаправлениями.
-s
.—.не.показывать.индикатор.выполнения.или.сообщения.об.ошибках.
Пример команды
Чтобы.получить.стандартную.веб-страницу,.в.качестве.первого.аргумента.нужно.
передать.только.URL-адрес..По.умолчанию.
curl
.отображает.содержимое.веб- страницы.в.стандартном.режиме..Вы.можете.перенаправить.вывод.в.файл,.исполь- зуя.перенаправление.и.параметр.
-o
:
curl https://www.digadel.com
Не знаете, куда указывает потенциально опасный сокращенный URL? Разверните его с помощью curl:
curl -ILs http://bitly.com/1k5eYPw | grep '^Location:'
vi
Команда.
vi
.—.это.не.типичная.команда,.а.полнофункциональный.текстовый.
редактор.командной.строки..Он.обладает.широкими.возможностями.и.даже.под- держивает.плагины.
Пример команды
Чтобы.открыть.файл.
somefile.txt
.в.
vi
,.выполните.команду:
vi somefile.txt
Находясь.в.среде.
vi
,.нажмите.клавишу.
Esc
,.а.затем,.чтобы.войти.в.режим.вставки.
и.отредактировать.текст,.введите.
i
..Для.выхода.из.режима.вставки.нажмите.
Esc
Для.перехода.в.командный.режим.нажмите.клавишу.
Esc
..Вы.можете.ввести.одну.
из.команд,.приведенных.в.табл..11.1,.и,.чтобы.она.вступила.в.силу,.нажать.кла- вишу.
Enter
170 Часть II • Защитные операции с использованием bash
Таблица 11.1. Общие команды vi
Команда
Назначение
b
Одно.слово.назад cc
Заменить.текущую.строку cw
Заменить.текущее.слово dw
Удалить.текущее.слово dd
Удалить.текущую.строку
:w
Записать/сохранить.файл
:w.filename
Записать/сохранить.файл.с.именем.filename
:q!
Выйти.без.сохранения
ZZ
Сохранить.и.выйти
:set.number
Показать.номера.строк
/
Поиск.вперед
?
Поиск.в.обратном.направлении n
Найти.следующее.вхождение
Полный.обзор.
vi
.выходит.за.рамки.этой.книги..Для.получения.дополнительной.
информации.вы.можете.посетить.страницу.редактора.Vim.(
https://www.vim.org/
).
xxd
Команда.
xxd
.выводит.на.экран.файл.в.двоичном.или.шестнадцатеричном.формате.
Общие параметры команды
-b
.—.отобразить.файл.с.использованием.двоичного,.а.не.шестнадцатеричного.
формата.
-l
.—.вывести.количество.байт.двоичного.или.шестнадцатеричного.файла.
-s
.—.начать.печать.с.позиции.байта.n.
Пример команды
Для.отображения.файла.
somefile.txt
.начать.печать.с.35-го.байта.и.распечатать.
следующие.50.байт:
xxd -s 35 -l 50 somefile.txt
Глава 11. Анализ вредоносных программ 171
Реверс-инжиниринг
Подробности.того,.как.выполнить.реверс-инжиниринг.(reverse-engineering).дво- ичного.кода,.выходят.за.рамки.этой.книги..Тем.не.менее.мы.рассмотрим,.как.ис- пользовать.стандартную.командную.строку.для.проведения.реверс-инжиниринга..
Описанные.методы.анализа.с.помощью.командной.строки.не.заменяют.такие.ин- струменты,.как.IDA.Pro.или.OllyDbg;.они.скорее.предназначены.для.расширения.
возможностей.этих.инструментов.или.для.предоставления.некоторого.недоступ- ного.ранее.функционала.
Подробную информацию об анализе вредоносных программ см. в книге «Вскрытие покажет! Практический анализ вредоносного ПО» Майкла Сикорски и Эндрю Хо- нига (Питер, 2018). Дополнительную информацию о компании IDA Pro вы найдете в книге Криса Игла (Chris Eagle) The IDA Pro Book (No Starch Press).
Шестнадцатеричные, десятичные, двоичные и ASCII-преобразования
При.анализе.файлов.важно.иметь.возможность.их.простого.перекодирования.из.
десятичного.формата.в.шестнадцатеричный.или.ASCII.и.наоборот..К.счастью,.это.
можно.легко.сделать.из.командной.строки..Например,.возьмем.шестнадцатерич- ное.значение.0x41..Можно.использовать.команду.
printf
.для.его.преобразования.
в.десятичный.формат.с.помощью.строки.формата.
"%d"
:
$ printf "%d" 0x41 65
Чтобы.преобразовать.десятичное.число.обратно.в.шестнадцатеричное,.замените.
символы,.определяющие.формат,.на.
%x
:
$ printf "%x" 65 41
Чтобы.преобразовать.из.ASCII.в.шестнадцатеричный,.можно.передать.символ.из.
команды.
printf
.в.команду.
xxd
:
$ printf 'A' | xxd
00000000: 41
172 Часть II • Защитные операции с использованием bash
Для.преобразования.шестнадцатеричного.кода.в.ASCII.используйте.команду.
xxd с.параметром.
-r
:
$ printf 0x41 | xxd –r
A
Чтобы.преобразовать.из.ASCII.в.двоичный.код,.вы.можете.передать.символ.в.
xxd и.использовать.параметр.
-b
:
$ printf 'A' | xxd –b
00000000: 01000001
В показанных примерах вместо команды echo умышленно используется команда printf. Это объясняется тем, что команда echo автоматически добавляет в вывод лишний символ. Его можно увидеть здесь:
$ echo 'A' | xxd
00000000: 410a
Далее.рассмотрим.команду.
xxd
.и.способы.ее.использования.для.анализа.файла..
Для.примера.проанализируем.исполняемый.файл.
Анализ с помощью xxd
Для.изучения.функциональности.команды.
xxd
.возьмем.исполняемый.файл.
helloworld
Исходный.код.показан.в.примере.11.1..Файл.
helloworld
.компилируется.для.Linux.
в.Executable.and.Linkable.Format.(ELF).—.формат.исполняемых.и.компонуемых.моду- лей..Компиляция.производится.с.помощью.компилятора.GNU.C.Compiler.(GCC).
Пример 11.1. helloworld.c
#include
int main()
{
printf("Hello World!\n");
return 0;
}
Команда.
xxd
.может.использоваться.для.проверки.любой.части.исполняемого.
файла..В.качестве.примера.можно.посмотреть.магическое.число.файла,.которое.
начинается.с.позиции.0x00.и.имеет.размер.4.байта..Чтобы.выбрать.начальную.
позицию,.используйте.параметр.
-s
.(если.формат.файла.десятичный)..Для.опре-
Глава 11. Анализ вредоносных программ 173
деления.количества.возвращаемых.байтов.добавьте.параметр.
-l
.(для.десятичного.
формата)..Начальную.позицию.и.длину.также.можно.указать.в.шестнадцатеричном.
формате,.добавив.к.числу.символы.0x.(то.есть.0x2A)..Как.и.ожидалось,.мы.увидели.
магическое.число.ELF:
$ xxd -s 0 -l 4 helloworld
00000000: 7f45 4c46 .ELF
Пятый.байт.файла.покажет.вам.архитектуру.этого.файла:.является.ли.он.32-раз- рядным.(0x01).или.64-разрядным.(0x02).исполняемым.файлом..В.данном.случае.
это.64-разрядный.исполняемый.файл:
$ xxd -s 4 -l 1 helloworld
00000004: 02
Шестой.байт.описывает.порядок.записи.байтов:.little-endian.(от.младшего.к.стар- шему).(0x01).или.big-endian.(от.старшего.к.младшему).(0x02)..В.данном.случае.
порядок.записи.байтов.little-endian:
$ xxd -s 5 -l 1 helloworld
00000005: 01
Формат.и.порядок.байтов.—.важная.информация,.используемая.для.анализа.
остальной.части.файла..Например,.8.байт.64-битного.файла.ELF,.начинающихся.
с.0x20,.определяют.заголовок.программы:
$ xxd -s 0x20 -l 8 helloworld
00000020: 4000 0000 0000 0000
Нам.уже.известно,.что.порядок.записи.нашего.файла.—.little-endian,.поэтому.за- головок.начинается.с.0x40.
Эти.данные.мы.можем.использовать.для.отображения.заголовка.программы,.длина.
которого.для.64-битного.ELF-файла.должна.составлять.0x38.байт:
$ xxd -s 0x40 -l 0x38 helloworld
00000040: 0600 0000 0500 0000 4000 0000 0000 0000 ........@.......
00000050: 4000 4000 0000 0000 4000 4000 0000 0000 @.@.....@.@.....
00000060: f801 0000 0000 0000 f801 0000 0000 0000 ................
00000070: 0800 0000 0000 0000
Дополнительные.сведения.о.формате.файла.Linux.ELF.можно.найти.в.специфика- ции.Tool.Interface.Standard.(TIS).и.Executable.and.Linking.Format.(ELF).по.адресу.
http://bit.ly/2HVOMu7
174 Часть II • Защитные операции с использованием bash
Для.получения.дополнительной.информации.о.формате.исполняемых.файлов.
Windows.см..документацию.формата.переносимых.исполняемых.файлов.Microsoft:.
http://bit.ly/2FDm67s
Hex-редактор..Иногда.вам.может.потребоваться.отобразить.и.отредактировать.
файл.в.шестнадцатеричном.формате..Для.этого.следует.использовать.команду.
xxd при.работе.с.редактором.
vi
..Сначала,.как.обычно,.в.
vi
.откройте.файл,.который.
хотите.отредактировать:
vi helloworld
Открыв.файл,.введите.следующую.команду:
:%!xxd
В.
vi
.символ.
%
.представляет.диапазон.адресов.всего.файла,.а.символ.
!
.можно.ис- пользовать.для.выполнения.команды.оболочки,.заменяя.исходные.строки.выводом.
команды..Объединение.этих.двух.символов,.как.показано.в.предыдущей.команде.
(
:%!xxd
),.вызовет.текущий.файл.через.
xxd
.(или.любую.команду.оболочки).и.оста- вит.результаты.в.
vi
:
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
00000010: 0200 3e00 0100 0000 3004 4000 0000 0000 ..>.....0.@.....
00000020: 4000 0000 0000 0000 efbf bd19 0000 0000 @...............
00000030: 0000 0000 0000 4000 3800 0900 4000 1f00 ......@.8...@...
00000040: 1c00 0600 0000 0500 0000 4000 0000 0000 ..........@.....
После.внесения.изменений.можно.вернуть.файл.в.обычное.состояние.с.помощью.
команды.
vi:%!xxd
-r
..По.завершении.запишите.внесенные.изменения.(
ZZ
)..Конеч- но,.в.любой.момент.можно.просто.выйти.без.записи.внесенных.изменений.(
:q!
).
Чтобы преобразовать загруженный в vi файл в стандарт кодирования Base64, вве- дите :%!Base64. Чтобы преобразовать из Base64 обратно, введите :%!Base64 -d.
Извлечение строк
Один.из.основных.методов.анализа.неизвестного.исполняемого.файла.—.извлече- ние.всех.содержащихся.в.файле.строк.ASCII..Из.этих.строк.мы.можем.получить.
такие.данные,.как.имена.файлов,.пути,.IP-адреса,.имена.авторов,.информацию.
Глава 11. Анализ вредоносных программ 175
о.компиляторе,.URL-адреса.и.другую.ценную.информацию.о.функциональности.
или.происхождении.программы.
Команда.
strings
.может.извлекать.для.нас.данные.ASCII,.но.по.умолчанию.она.
недоступна.для.многих.дистрибутивов,.включая.Git.Bash..Чтобы.решить.эту.про- блему,.можно.воспользоваться.хорошей.командой.
egrep
:
egrep -a -o '\b[[:print:]]{2,}\b' somefile.exe
Это.регулярное.выражение.выполняет.поиск.в.указанном.файле.двух.или.более.
(здесь.конструкция.
{2,}
).печатаемых.символов.в.строке,.которые.отображаются.
как.непрерывное.слово..С.помощью.параметра.
-а
.двоичный.исполняемый.файл.
обрабатывается.как.текстовый..Параметр.
-o
.выводит.только.соответствующий.
текст,.а.не.всю.строку,.тем.самым.устраняя.любые.непечатаемые.двоичные.дан- ные..Поиск.осуществляется.по.двум.или.более.символам,.поскольку.одиночные.
символы.вполне.вероятны.в.любом.двоичном.байте.и,.таким.образом,.не.являются.
значимыми.
Чтобы.сделать.вывод.еще.более.чистым,.можно.с.помощью.параметра.
-u
.отсорти- ровать.результаты,.удалив.при.этом.все.дубликаты:
egrep -a -o '\b[[:print:]]{2,}\b' somefile.exe | sort -u
Возможно,.было.бы.полезно.отсортировать.строки.по.размеру,.от.самых.длинных.
до.самых.коротких,.так.как.наиболее.длинные.строки.чаще.содержат.интересную.
информацию..В.исходном.виде.команда.
sort
.не.предоставляет.возможности.для.
выполнения.этой.задачи..В.дополнение.вместе.с.ней.можно.использовать.команду.
awk
:
egrep -a -o '\b[[:print:]]{2,}\b' somefile.exe |
awk '{print length(), $0}' | sort -rnu
В.данном.случае.вы.сначала.отправляете.вывод.
egrep
.в.
awk
,.чтобы.увеличить.длину,.
добавив.символы.в.начале.каждой.строки..Затем.этот.вывод.сортируется.в.обрат- ном.порядке,.а.дубликаты.удаляются.
Метод.извлечения.строк.из.исполняемого.файла.имеет.свои.ограничения..Если.стро- ка.не.является.непрерывной,.то.есть.непечатаемые.символы.находятся.между.
печатаемыми.символами,.разделяя.их,.то.будет.выводиться.набор.отдельных.сим- волов,.а.не.целая.строка..Иногда.это.просто.артефакт,.полученный.при.создании.
исполняемого.файла..Но.разработчики.вредоносных.программ.могут.специально.
добавить.непечатаемые.символы,.чтобы.избежать.обнаружения..Для.аналогичной.
маскировки.существования.строк.в.двоичном.файле.они.также.могут.использовать.
кодировку.или.шифрование.
176 Часть II • Защитные операции с использованием bash
Взаимодействие с VirusTotal
VirusTotal.—.это.коммерческий.онлайн-инструмент,.который.используется.для.
выгрузки.файлов.и.проверки.их.множеством.антивирусных.движков.и.дру- гих.инструментов.статического.анализа,.чтобы.определить,.являются.ли.эти.
файлы.вредоносными..VirusTotal.также.может.предоставить.информацию.о.том,.
как.часто.конкретный.файл.встречался.и.был.ли.он.ранее.определен.как.вре- доносный..Это.называется.репутацией.файла..Если.файл.ранее.не.встречался.
и.поэтому.имеет.низкую.репутацию,.существует.большая.вероятность,.что.он.
вредоносный.
Будьте осторожны при выгрузке файлов в VirusTotal и подобные сервисы. По- скольку они содержат базы данных всех загруженных файлов, файлы с по- тенциально конфиденциальной или привилегированной информацией никогда не должны загружаться в эти сервисы. Кроме того, при определенных обстоя- тельствах загрузка вредоносных файлов в общедоступные хранилища может предупредить противника о том, что вы определили его присутствие в вашей системе.
VirusTotal.предоставляет.API.(интерфейс.прикладного.программирования),.
который.с.помощью.
curl
.можно.использовать.для.взаимодействия.с.сервисом..
Для.применения.API.необходимо.иметь.уникальный.ключ..Чтобы.его.получить,.
перейдите.на.сайт.VirusTotal.(
https://www.virustotal.com/
).и.запросите.учетную.запись..
После.ее.создания.войдите.в.систему.и.перейдите.в.настройки.учетной.записи,.что- бы.просмотреть.ключ.API..В.этой.книге.из.соображений.безопасности.мы.не.будем.
указывать.для.примеров.реальный.ключ.API;.вместо.этого.воспользуемся.текстом.
replace withapikey
.в.любом.месте,.где.требуется.ключ.API.
Полное описание API VirusTotal можно найти в документации VirusTotal: http://
bit.ly/2UXvQyB.
Поиск в базе данных по хеш-значению
Для.взаимодействия.с.сервисом.VirusTotal.через.Интернет.используется.запрос.
на.передачу.репрезентативного.состояния.(Representational.State.Transfer,.REST)..
В.табл..11.2.перечислены.некоторые.URL-адреса.REST.для.основных.функций.
сканирования.файлов.VirusTotal.
Глава 11. Анализ вредоносных программ 177
Таблица 11.2. Элементы API VirusTotal
Описание
Запросить URL
Параметры
Получение.отчета.о.сканировании https://www.virustotal.com/vtapi/v2/
file/report apikey,.resource,.
allinfo
Выгрузка.и.сканирование.файла https://www.virustotal.com/vtapi/v2/
file/scan apikey,.file
VirusTotal.хранит.историю.всех.файлов,.которые.ранее.были.загружены.и.проана- лизированы..Чтобы.определить,.есть.ли.отчет.по.этому.файлу,.можно.выполнить.
поиск.в.базе.данных.с.помощью.хеша.подозрительного.файла..Это.избавит.вас.от.
необходимости.фактически.выгружать.файл..Недостаток.этого.метода.в.том,.что,.
если.данный.файл.в.VirusTotal.еще.никто.не.загружал,.отчета.по.нему.не.будет.
VirusTotal.принимает.форматы.хешей.MD5,.SHA1.и.SHA256,.которые.можно.ге- нерировать.с.помощью.
md5sum
,.
sha1sum
.и.
sha256sum
.соответственно..После.того.как.
вы.сгенерировали.хеш.вашего.файла,.с.помощью.
curl
.и.запроса.REST.его.можно.
отправить.в.VirusTotal.
Запрос.REST.находится.в.виде.URL-адреса,.который.начинается.с.
https://www.virus- total.com/vtapi/v2/file/report
.и.имеет.три.основных.параметра:
apikey
.—.ваш.ключ.API,.полученный.от.VirusTotal;
resource
.—.хеш.файла.MD5,.SHA1.или.SHA256;
allinfo
.—.если.равен.
true
,.будет.возвращена.дополнительная.информация.от.
других.инструментов.
В.качестве.примера.возьмем.образец.вредоносного.ПО.WannaCry,.который.имеет.
MD5-хеш.
db349b97c37d22f5ea1d1841e3c89eb4
:
curl 'https://www.virustotal.com/vtapi/v2/file/report?apikey=replacewithapikey& resource=db349b97c37d22f5ea1d1841e3c89eb4&allinfo=false > WannaCry_VirusTotal.txt
Полученный.ответ.JSON.содержит.список.всех.антивирусных.программ,.в.которых.
был.запущен.файл,.и.определение.того,.был.ли.этот.файл.определен.как.вредонос- ный..Здесь.мы.видим.ответы.от.первых.двух.движков,.Bkav.и.MicroWorld-eScan:
{"scans":
{"Bkav":
{"detected": true,
"version": "1.3.0.9466",
"result": "W32.WannaCrypLTE.Trojan",
"update": "20180712"},
"MicroWorld-eScan":
{"detected": true,
178 Часть II • Защитные операции с использованием bash
"version": "14.0.297.0",
"result": "Trojan.Ransom.WannaCryptor.H",
"update": "20180712"}
Хотя.JSON.отлично.подходит.для.структурирования.данных,.у.людей.при.чтении.
могут.возникнуть.трудности..С.помощью.
grep
.вы.можете.извлечь.некоторые.важ- ные.сведения,.например,.был.ли.файл.определен.как.вредоносный:
$ grep -Po '{"detected": true.*?"result":.*?,' Calc_VirusTotal.txt
{"detected": true, "version": "1.3.0.9466", "result": "W32.WannaCrypLTE.Trojan",
{"detected": true, "version": "14.0.297.0", "result": "Trojan.Ransom.WannaCryptor.H",
{"detected": true, "version": "14.00", "result": "Trojan.Mauvaise.SL1",
В.
grep
.параметр.
-P
.применяется.для.включения.движка.Perl,.который.позволяет.
использовать.шаблон.
.*?
.как.ленивый.квантификатор..Этот.ленивый.квантифи- катор.соответствует.только.минимальному.количеству.символов,.необходимых.
для.соответствия.всему.регулярному.выражению,.что.позволяет.извлекать.ответ.
из.каждого.антивирусного.ядра.по.отдельности,.а.не.из.большой.группы.
Хотя.этот.метод.работает,.наилучшее.решение.можно.создать.с.помощью.сценария.
bash,.как.показано.в.примере.11.2.
Пример 11.2. vtjson.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# vtjson.sh
#
# Описание:
# Поиск вредоносных программ в файле JSON
#
# Использование:
# vtjson.awk []
# Файл с результатами VirusTotal
# по умолчанию: Calc_VirusTotal.txt
#
RE='^.(.*)...\{.*detect..(.*),..vers.*result....(.*).,..update.*$'
FN="${1:-Calc_VirusTotal.txt}"
sed -e 's/{"scans": {/&\n /' -e 's/},/&\n/g' "$FN" |
while read ALINE
do if [[ $ALINE = $RE ]]
Глава 11. Анализ вредоносных программ 179
then
VIRUS="${BASH_REMATCH[1]}"
FOUND="${BASH_REMATCH[2]}"
RESLT="${BASH_REMATCH[3]}"
if [[ $FOUND = .*true.* ]]
then echo $VIRUS "- result:" $RESLT
fi fi done
.Это.сложное.регулярное.выражение.(или.
RE
).ищет.строки,.содержащие.слова.
DETECT
,.
RESULT
.и.
UPDATE
.в.указанной.последовательности..Более.того,.
RE
.также.на- ходит.в.пределах.любой.строки.три.подстроки,.которые.соответствуют.этим.трем.
ключевым.словам..Подстроки.обозначены.круглыми.скобками;.скобок.не.должно.
быть.в.строках,.которые.мы.ищем,.—.они.скорее.являются.синтаксисом.
RE
,.обо- значающим.группировку.
Рассмотрим.в.этом.примере.первую.группу..
RE
.заключено.в.одинарные.кавычки..
Здесь.может.быть.много.специальных.символов,.но.нам.не.нужно,.чтобы.они.были.
интерпретированы.как.специальные.символы.оболочки;.желательно,.чтобы.они.
передавались.буквально.процессору.regex..Следующий.символ,.
^
,.говорит.о.том,.что.
этот.поиск.следует.привязать.к.началу.строки..Символ.«точка».(
).соответствует.
любому.символу.в.строке.ввода..Затем.идет.группа.любых.символов.(
),.повторя- ющаяся.любое.количество.раз,.обозначаемое.символом.
*
Итак,.сколько.символов.потребуется.для.заполнения.этой.первой.группы?.
Мы.должны.и.дальше.просматривать.
RE
,.чтобы.найти.соответствия..То,.что.должно.
находиться.после.данной.группы,.—.это.три.символа,.за.которыми.следует.левая.
скобка..Итак,.теперь.мы.можем.описать.эту.первую.группировку.как.все.символы,.
начиная.со.второго.символа.строки.вплоть.до.трех.символов.перед.левой.скобкой,.
но.эти.три.символа.исключаются.
Данная.ситуация.похожа.на.ситуацию.с.другими.группами,.местоположение.ко- торых.ограничивается.точками.и.ключевыми.словами..Да,.это.довольно.жесткий.
формат,.но.предсказуемый..Данный.сценарий.мог.быть.написан.для.более.гибкой.
обработки.формата.ввода.(см..упражнения.в.конце.главы).
.Команда.
sed
.готовит.наши.входные.данные.для.более.легкой.обработки..Она.са- мостоятельно.помещает.в.строку.исходное.ключевое.слово.JSON.
scans
.и.связанные.
с.ним.знаки.пунктуации..Далее.в.конце.каждой.правой.скобки.(с.запятой.после.нее).
также.добавляется.символ.новой.строки..В.обоих.выражениях.редактирования.
символ.
&
.в.правой.части.подстановки.представляет.собой.то,.что.было.сопоставлено.
с.левой.стороны..Например,.во.второй.замене.амперсанд.является.сокращением.
для.правой.скобки.и.запятой.
180 Часть II • Защитные операции с использованием bash
.Здесь.используется.регулярное.выражение..Не.задавайте.
$RE
.внутри.кавычек,.
иначе.
$RE
.будет.соответствовать.таким.специальным.символам,.как.литералы..Чтобы.
определить.поведение.регулярного.выражения,.не.заключайте.его.в.кавычки.
.Если.в.регулярном.выражении.используются.скобки,.они.обозначают.подстроку,.
которую.можно.извлечь.из.переменной.массива.оболочки.
BASH_REMATCH
..Индекс.1.
обозначает.первую.подстроку.и.т..д.
.Это.еще.один.вариант.использования.сопоставления.регулярных.выражений..
Мы.ищем.слово.true.в.любом.месте.строки..Здесь.делается.предположение.о.наших.
входных.данных:.что.слово.true.не.появляется.ни.в.каком.другом.поле,.кроме.того,.
в.котором.мы.ожидаем.его.встретить..Мы.могли.бы.сделать.сопоставление.более.
конкретным.(например,.расположив.слово.true.рядом.со.словом.detected),.но.такой.
оператор.гораздо.лучше.читается.и.будет.работать.до.тех.пор,.пока.четыре.буквы.
t-r-u-e.не.появятся.в.данной.последовательности.в.любом.другом.поле.
Для.решения.этой.задачи.не.обязательно.использовать.регулярные.выражения..
В.примере.11.3.приводится.решение.с.использованием.
awk
..Теперь.в.
awk
.можно.эф- фективно.задействовать.регулярные.выражения,.но.они.вам.здесь.не.нужны.из-за.
другой.мощной.функции.
awk
:.синтаксического.разбора.входных.данных.на.поля.
Пример 11.3. vtjson.awk
# Bash и кибербезопасность
# vtjson.awk
#
# Описание:
# Поиск вредоносных программ в файле JSON
#
# Использование:
# vtjson.awk
# Файл с результатами VirusTotal
#
FN="${1:-Calc_VirusTotal.txt}"
sed -e 's/{"scans": {/&\n /' -e 's/},/&\n/g' "$FN" |
awk '
NF == 9 {
COMMA=","
QUOTE="\""
if ( $3 == "true" COMMA ) {
VIRUS=$1
gsub(QUOTE, "", VIRUS)
RESLT=$7
gsub(QUOTE, "", RESLT)
gsub(COMMA, "", RESLT)
Глава 11. Анализ вредоносных программ 181
print VIRUS, "- result:", RESLT
}
}'
.Мы.начинаем.с.той.же.предварительной.обработки.входных.данных,.что.и.в.пре- дыдущем.сценарии..На.этот.раз.передаем.результаты.в.
awk
.Код.внутри.этих.фигурных.скобок.будет.выполняться.только.для.входных.строк.
с.девятью.полями.
.Мы.устанавливаем.переменные.для.хранения.этих.строковых.констант..Обратите.
внимание,.что.мы.не.можем.использовать.одинарные.кавычки.вокруг.одного.симво- ла.двойной.кавычки..Почему?.Потому.что.весь.сценарий.
awk
.защищен.(от.интерпре- тации.специальных.символов.в.оболочке).одинарными.кавычками.(вернитесь.на.три.
строки.назад.или.перейдите.в.конец.этого.сценария)..Вместо.этого.мы.экранируем.
двойную.кавычку,.поставив.перед.ней.обратный.слеш.
.Здесь.третье.поле.входной.строки.сравнивается.со.строкой.
"true"
,.поскольку.
в.
awk
.сочетание.строк.подразумевает.конкатенацию..Мы.не.используем.знак.плюс.
для.добавления.двух.строк,.как.это.делается.в.некоторых.языках;.мы.просто.ука- зываем.их.рядом.друг.с.другом.
.Как.и.в.случае.с.
$3
,.который.используется.в.условии.
if
,.
$1
.здесь.относится.к.но- меру.поля.входной.строки.—.первому.слову.ввода..Это.не.переменная.оболочки,.
ссылающаяся.на.параметр.сценария..Помните.про.одинарные.кавычки,.в.которые.
заключен.этот.сценарий.
awk
.
gsub
.—.это.функция.
awk
,.выполняющая.глобальное.замещение..При.поиске.
через.третий.аргумент.она.заменяет.все.вхождения.первого.аргумента.вторым..
Поскольку.второй.аргумент.—.это.пустая.строка,.то.из.строки.в.переменной.
VIRUS
(которой.было.присвоено.значение.первого.поля.строки.ввода).удаляются.все.
символы.кавычек.
Остальная.часть.сценария,.выполняющая.эти.замены.и.выводящая.результаты,.во.
многом.совпадает.с.предыдущим..Помните,.что.в.
awk
.сценарий.продолжает.читать.
stdin.и.выполнять.код.по.одному.разу.для.каждой.строки.ввода.до.его.конца.
Сканирование файла
Вы.можете.выгрузить.новые.файлы.для.анализа.в.VirusTotal,.если.информа- ции.о.них.еще.нет.в.базе.данных..Для.этого.вам.нужно.отправить.запрос.HTML.
POST.на.URL-адрес.
https://www.virustotal.com/vtapi/v2/file/scan
..Вы.также.должны.
предоставить.свой.ключ.API.и.путь.для.выгрузки.файла..Ниже.приведен.пример.
182 Часть II • Защитные операции с использованием bash использования.файла.Windows.
calc.exe
,.который.обычно.можно.найти.в.каталоге.
C:\Windows\System32
:
curl --request POST --url 'https://www.virustotal.com/vtapi/v2/file/scan'
--form 'apikey=replacewithapikey' --form 'file=@/c/Windows/System32/calc.exe'
Результаты.после.выгрузки.файла.будут.получены.не.сразу..Возвращается,.напри- мер,.следующий.объект.JSON,.содержащий.метаданные.файла,.который.можно.
использовать.для.последующего.получения.отчета.с.применением.идентификатора.
сканирования.или.одного.из.значений.хеш-функции:
{
"scan_id": "5543a258a819524b477dac619efa82b7f42822e3f446c9709fadc25fdff94226-1...",
"sha1": "7ffebfee4b3c05a0a8731e859bf20ebb0b98b5fa",
"resource": "5543a258a819524b477dac619efa82b7f42822e3f446c9709fadc25fdff94226",
"response_code": 1,
"sha256": "5543a258a819524b477dac619efa82b7f42822e3f446c9709fadc25fdff94226",
"permalink": "https://www.virustotal.com/file/5543a258a819524b477dac619efa82b7...",
"md5": "d82c445e3d484f31cd2638a4338e5fd9",
"verbose_msg": "Scan request successfully queued, come back later for the report"
}
Сканирование URL-адресов, доменов и IP-адресов
VirusTotal.также.предоставляет.возможность.сканирования.определенного.URL,.
домена.или.IP-адреса..Все.вызовы.API.схожи.в.том,.что.они.отправляют.HTTP- запрос.GET.на.соответствующий.URL-адрес,.указанный.в.табл..11.3.с.соответству- ющими.параметрами.
Таблица 11.3. VirusTotal URL API
Описание
Запросить URL
Параметры
Отчет.по.URL
https://www.virustotal.com/vtapi/v2/url/report apikey,.resource,.
allinfo,.scan
Доменный.отчет https://www.virustotal.com/vtapi/v2/domain/report apikey,.domain
Отчет.по.IP
https://www.virustotal.com/vtapi/v2/ip-address/report apikey,.ip
Вот.пример.запроса.отчета.сканирования.по.URL-адресу:
curl 'https://www.virustotal.com/vtapi/v2/url/report?apikey=replacewithapikey
&resource=www.oreilly.com&allinfo=false&scan=1'
Параметр.
scan=1
.автоматически.отправит.URL-адрес.для.анализа,.если.его.еще.
нет.в.базе.данных.
Глава 11. Анализ вредоносных программ 183
Выводы
Используя.только.командную.строку,.нельзя.обеспечить.тот.же.уровень.произ- водительности,.что.предоставляют.полнофункциональные.инструменты.реверс- инжиниринга..Но.с.ее.помощью.можно.обеспечить.проверку.исполняемого.файла..
Не.забывайте,.что.анализировать.подозрительные.вредоносные.программы.следует.
только.на.системах,.отключенных.от.сети,.и.помните.о.проблемах.конфиденциаль- ности,.которые.могут.возникнуть.при.выгрузке.файлов.в.VirusTotal.или.другие.
подобные.сервисы.
В.следующей.главе.мы.рассмотрим,.как.улучшить.визуализацию.данных.после.их.
сбора.и.анализа.
Упражнения
1.. Создайте.регулярное.выражение.для.поиска.в.двоичном.файле.одиночных.
печатаемых.символов,.разделенных.одиночными.непечатаемыми.символами..
Например,.
p.
a.
s.
s.
w.
o.
r.
d
,.где.
.представляет.непечатаемый.символ.
2.. Выполните.поиск.вхождения.одного.печатаемого.символа.в.двоичном.файле..
Вместо.того.чтобы.печатать.найденные.символы,.распечатайте.символы,.ко- торые.не.были.найдены..Чтобы.немного.упростить.упражнение,.учитывайте.
только.буквенно-цифровые.символы.
3.. С.помощью.одной.команды.напишите.сценарий.для.взаимодействия.с.API.
VirusTotal..Используйте.параметр.
-H
.для.проверки.хеша,.
-F
.—.для.загрузки.
файла.и.
-U
.—.для.проверки.URL-адреса..Например:
$ ./vt.sh -h db349b97c37d22f5ea1d1841e3c89eb4
Detected: W32.WannaCrypLTE.Trojan
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
12
Форматирование и отчетность
Для.получения.максимальной.пользы.все.собранные.ранее.и.проанализированные.
данные.должны.быть.представлены.в.понятном.и.удобочитаемом.формате..Часто.
формат.стандартного.вывода.командной.строки.не.позволяет.выводить.большое.
количество.информации..Поэтому.для.улучшения.читаемости.можно.воспользо- ваться.дополнительными.методами.
Используемые команды
В.этой.главе.для.форматирования.вывода.мы.будем.применять.команду.
tput tput
Команда.
tput
,.используя.базу.данных.
terminfo
,.управляет.вашими.сеансами.работы.
с.терминалом..С.помощью.команды.
tput
.можно.управлять.различными.функция- ми.терминала,.такими.как.перемещение.или.изменение.вида.курсора,.изменение.
свойств.текста.и.очистка.определенных.областей.экрана.терминала.
Общие параметры команды
clear
.—.очистить.экран.
cols
.—.распечатать.количество.столбцов.терминала.
cup
.—.переместить.курсор.в.положение.
,.
lines
.—.распечатать.количество.строк.терминала.
rmcup
.—.вернуться.к.обычному.экрану.терминала.
Глава 12. Форматирование и отчетность 185
setab
.—.установить.цвет.фона.терминала.
setaf
.—.установить.основной.цвет.терминала.
smcup
.—.сохранить.текущий.экран.терминала.и.очистить.экран.
Форматирование для отображения в виде HTML-документа
Если.результат.не.требуется.просматривать.непосредственно.в.командной.стро- ке,.отличным.способом.обеспечить.аккуратное.и.понятное.форматирование.вы- водимых.данных.будет.преобразование.информации.в.формат.HTML..Данные.
в.формате.HTML.удобно.выводить.на.печать,.используя.встроенные.в.браузер.
возможности.для.печати.
Полный.синтаксис.HTML.выходит.за.рамки.этой.книги,.здесь.же.мы.рассмотрим.
основные.принципы.форматирования..HTML.—.это.компьютерный.язык,.который.
определяется.рядом.тегов,.управляющих.форматированием.данных.и.их.поведени- ем.в.браузере..В.HTML.обычно.используются.открывающие.теги.(
)..В.табл..12.1.
перечислены.несколько.наиболее.популярных.тегов.и.их.назначение.
Таблица 12.1. Основные HTML-теги
Тег
Назначение
Внешний.тег.в.HTML-документе
Тег,.содержащий.основное.содержимое.HTML-документа
Заголовок
Полужирный.текст
Нумерованный.список
Маркированный.список
В.примере.12.1.показан.образец.документа.HTML.
Пример 12.1. Заготовка HTML-документа
1 ... 12 13 14 15 16 17 18 19 ... 23
Символ.
>
.определяет.строки,.уникальные.для.
filelist.txt
,.которые.в.этом.случае.
будут.именами.добавленных.файлов..Символ.
<
.показывает.строки,.находящиеся.
только.в.первом.файле.(
baseline.txt
),.которые.в.данном.случае.являются.именами.
удаленных.файлов..Символ.
|
.обозначает.строки,.отличающиеся.в.двух.файлах..
Это.может.быть.переименованный.файл..Возможно,.один.файл.был.удален.и.в.эту.
позицию.был.добавлен.новый.файл.
Шаг 3. Автоматизация и уведомление
Вы.можете.автоматизировать.предыдущие.процессы,.позволяющие.собрать.и.про- верить.базовые.показатели.системы,.чтобы.с.помощью.bash.сделать.их.более.эф- фективными.и.полнофункциональными..Вывод.этого.сценария.bash.представлен.
в.формате.XML.и.содержит.следующие.теги:.
.(который.будет.иметь.
атрибуты.
host
.и.
dir
),.
,.
,.
.и.
..Тег.
будет.иметь.атрибут.
orig
,.чтобы.можно.было.указать.предыдущее.местоположение.
файла.(пример.10.3).
Пример 10.3. baseline.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# baseline.sh
#
# Описание:
# Создает базовый файл или сравнивает текущее состояние
# файловой системы с предыдущим базовым файлом
#
# Использование: ./baseline.sh [-d path]
# -d Стартовый каталог для базового файла
#
# [
#
function usageErr ()
{
echo 'usage: baseline.sh [-d path] file1 [file2]'
echo 'creates or compares a baseline from path'
echo 'default for path is /'
exit 2
} >&2
function dosumming ()
{
Глава 10. Инструмент: контроль файловой системы 163
find "${DIR[@]}" -type f | xargs -d '\n' sha1sum
}
function parseArgs ()
{
while getopts "d:" MYOPT
do
# не проверяется MYOPT, так как существует только один вариант
DIR+=( "$OPTARG" )
done shift $((OPTIND-1))
# нет аргументов? слишком много?
(( $# == 0 || $# > 2 )) && usageErr
(( ${#DIR[*]} == 0 )) && DIR=( "/" )
}
declare -a DIR
# создайте базовый файл (предоставляется только одно имя файла)
# либо сделайте вторичные краткие выводы (при наличии двух имен файлов)
parseArgs
BASE="$1"
B2ND="$2"
if (( $# == 1 )) # только один аргумент then
# создание "$BASE"
dosumming > "$BASE"
# все сделано для базового файла exit fi if [[ ! -r "$BASE" ]]
then usageErr fi
# если второй файл существует, сравнить оба файла
# иначе создать/заполнить его if [[ ! -e "$B2ND" ]]
then echo creating "$B2ND"
dosumming > "$B2ND"
fi
164 Часть II • Защитные операции с использованием bash
# что мы имеем: создано два файла sha1sum declare -A BYPATH BYHASH INUSE # ассоциативные массивы
# в качестве базового загрузите первый файл while read HNUM FN
do
BYPATH["$FN"]=$HNUM
BYHASH[$HNUM]="$FN"
INUSE["$FN"]="X"
done < "$BASE"
# ------ теперь начинаем вывод
# смотрим, есть ли каждое имя файла, указанное во втором файле,
# по такому же месторасположению (пути), что и в первом (базовом файле)
printf '
while read HNUM FN
do
WASHASH="${BYPATH[${FN}]}"
# нашел ли он его? если нет, то это будет null if [[ -z $WASHASH ]]
then
ALTFN="${BYHASH[$HNUM]}"
if [[ -z $ALTFN ]]
then printf '
else printf '
INUSE["$ALTFN"]='_' # пометить как просмотренное fi else
INUSE["$FN"]='_' # пометить как просмотренное if [[ $HNUM == $WASHASH ]]
then continue; # ничего не изменилось;
else printf '
fi fi done < "$B2ND"
for FN in "${!INUSE[@]}"
do if [[ "${INUSE[$FN]}" == 'X' ]]
then printf '
fi done printf '
Глава 10. Инструмент: контроль файловой системы 165
.В.этой.функции.весь.вывод.stdout.перенаправляется.в.stderr..Таким.образом,.нам.
не.нужно.задавать.перенаправление.для.каждого.оператора.
echo
..Мы.отправляем.
вывод.в.stderr,.потому.что.это.не.предполагаемый.вывод.программы,.а.просто.со- общения.об.ошибках.
.Данная.функция.выполняет.основную.работу.по.созданию.
sha1sum
.для.всех.фай- лов.в.указанных.каталогах..Программа.
xargs
.выведет.столько.имен.файлов,.сколько.
может.поместиться.в.командной.строке.команды.
sha1sum
..Это.позволяет.избежать.
необходимости.каждый.раз.отдельно.вызывать.
sha1sum
.для.каждого.файла.(вызов.
sha1sum
.для.всех.файлов.сильно.замедлит.работу.программы)..Вместо.этого.при.
каждом.вызове.
sha1sum
.обрабатывает.1000.или.более.имен.файлов.
.Для.поиска.параметра.
-d
.со.связанным.с.ним.аргументом.(обозначенным.
:
).ис- пользуем.встроенный.цикл.
getopts
..Для.получения.дополнительной.информации.
о.
getopts
.см..пример.5.4.
.Поскольку.нам.требуется.разрешить.указывать.несколько.каталогов,.мы.добав- ляем.каждый.каталог.в.массив.
DIR
.После.завершения.цикла.
getopts
.нам.нужно.настроить.количество.аргументов..
Чтобы.избавиться.от.аргументов,.которые.были.«использованы».
getopts
,.при- меняем.
shift
.Если.каталоги.не.указаны,.то.по.умолчанию.данные.расположены.в.корне.фай- ловой.системы..Если.для.выполнения.данной.операции.ваших.прав.доступа.будет.
достаточно,.все.файлы.окажутся.в.файловой.системе.
.Эта.строка.считывает.значение.хеша.и.имя.файла..Но.откуда.эти.данные.считы- ваются,.если.нет.конвейера.команд,.передающих.данные.на.чтение?.Ответ.можно.
найти.в.конце.цикла.
while
.Вот.ответ,.указывающий.на.источник.данных..Помещая.перенаправление.
в.оператор.
while/do/done
,.вы.в.этом.цикле.перенаправляете.все.операторы.в.stdin.
(в.данном.случае)..Для.нашего.сценария.это.означает,.что.оператор.
read
.получает.
входные.данные.из.файла,.указанного.в.
$B2ND
Вот.результат.выполнения.примера:
$ bash baseline.sh -d . baseline.txt baseln2.txt
166 Часть II • Защитные операции с использованием bash
.Этот.тег.определяет.хост.и.относительный.путь.
.Данный.тег.идентифицирует.новый.файл,.созданный.после.созания.исходного.
базового.файла.
.Данный.файл.после.создания.базового.файла.был.перемещен.в.новое.место.
.После.создания.базового.файла.содержимое.файла.изменилось.
.После.создания.базового.файла.этот.файл.был.удален.
Выводы
Создание.базового.файла.и.периодическая.его.проверка.—.это.эффективный.способ.
выявления.подозрительного.поведения.в.ваших.системах..Это.особенно.полезно.
для.систем,.состояние.которых.редко.изменяется.
В.следующей.главе.мы.подробнее.разберем,.как.использовать.командную.строку.
и.bash.для.анализа.отдельных.файлов,.чтобы.определить,.являются.ли.они.вредо- носными.
Упражнения
1.. Улучшите.для.
baseline.sh
.пользовательский.интерфейс,.предотвратив.случай- ную.перезапись.базового.файла..Как?.Если.пользователь.указывает.только.один.
файл,.проверьте,.существует.ли.этот.файл..Если.это.так,.спросите.пользователя,.
можно.ли.перезаписать.файл,.и.в.зависимости.от.ответа.выберите.один.из.ва- риантов:.продолжить.или.выйти.
2.. Измените.сценарий.
baseline.sh
.следующим.образом:.напишите.функцию.обо- лочки.для.преобразования.записей.в.массиве.DIR.в.абсолютные.пути..Вызовите.
эту.функцию.непосредственно.перед.печатью.XML,.чтобы.тег.
filesystem в.атрибуте.
dir
.перечислял.абсолютные.пути.
3.. Измените.сценарий.
baseline.sh
.следующим.образом:.для.тега.
relocated
.про- верьте,.находятся.ли.исходный.и.перемещенный.файл.в.одном.каталоге.(то.
есть.имеют.одно.и.то.же.имя.каталога);.если.это.так,.выведите.только.
basename в.атрибуте.
orig
=
""
..Например,.то,.что.печаталось.так:
будет.выводиться.таким.образом:
Глава 10. Инструмент: контроль файловой системы 167
4.. Как.можно.изменить.сценарий.
baseline.sh
,.чтобы.для.ускорения.его.работы.
запустить.параллельные.друг.другу.процессы?.Реализуйте.свои.идеи.для.парал- лельного.запуска.процессов.сценария.
baseline.sh
,.которые.позволят.повысить.
производительность..Если.поместить.часть.сценария.в.фоновый.режим,.как.
перед.продолжением.работы.выполнить.повторную.синхронизацию?.
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
11
Анализ вредоносных программ
Обнаружение.вредоносного.кода.—.это.основное.и.самое.сложное.действие.при.
обеспечении.кибербезопасности..При.анализе.фрагмента.кода.вы.можете.исполь- зовать.два.основных.варианта:.статический.и.динамический..Во.время.статического.
анализа.вы.анализируете.сам.код,.чтобы.определить,.существуют.ли.признаки.вре- доносной.активности..Во.время.динамического.анализа.вы.выполняете.код,.а.затем.
смотрите,.что.он.делает.и.как.влияет.на.систему..В.этой.главе.мы.сосредоточимся.
на.методах.статического.анализа.
При работе с потенциально вредоносными файлами обязательно выполните анализ системы, не подключенной к сети и не содержащей конфиденциальной информации. После этого предположите, что система заражена, и, прежде чем вводить ее обратно в сеть, полностью очистите и восстановите систему.
Используемые команды
В.этой.главе.мы.рассмотрим.команду.
curl
,.которая.позволяет.взаимодействовать.
с.сайтами,.команду.
vi
.для.редактирования.файлов.и.команду.
xxd
.для.выполнения.
базовых.преобразований.и.анализа.файлов.
curl
Команду.
curl
.можно.использовать.для.передачи.данных.по.сети.между.клиентом.
и.сервером..Команда.поддерживает.несколько.протоколов,.включая.HTTP,.HTTPS,.
FTP,.SFTP.и.Telnet..Это.универсальная.команда..Представленные.ниже.параме- тры.предлагают.лишь.небольшую.часть.доступных.возможностей..Для.получения.
дополнительной.информации.относительно.этой.команды.не.забудьте.посетить.
соответствующую.страницу.руководства.Linux.
Глава 11. Анализ вредоносных программ 169
Общие параметры команды
-А
.—.для.отправки.на.сервер.указать.строку.агента.пользователя.HTTP.
-d
.—.данные.для.отправки.с.запросом.HTTP.POST.
-G
.—.использовать.для.отправки.данных.запрос.HTTP.GET,.а.не.POST.
-I
.—.получить.только.заголовок.протокола.(HTTP,.FTP).
-L
.—.следовать.за.перенаправлениями.
-s
.—.не.показывать.индикатор.выполнения.или.сообщения.об.ошибках.
Пример команды
Чтобы.получить.стандартную.веб-страницу,.в.качестве.первого.аргумента.нужно.
передать.только.URL-адрес..По.умолчанию.
curl
.отображает.содержимое.веб- страницы.в.стандартном.режиме..Вы.можете.перенаправить.вывод.в.файл,.исполь- зуя.перенаправление.и.параметр.
-o
:
curl https://www.digadel.com
Не знаете, куда указывает потенциально опасный сокращенный URL? Разверните его с помощью curl:
curl -ILs http://bitly.com/1k5eYPw | grep '^Location:'
vi
Команда.
vi
.—.это.не.типичная.команда,.а.полнофункциональный.текстовый.
редактор.командной.строки..Он.обладает.широкими.возможностями.и.даже.под- держивает.плагины.
Пример команды
Чтобы.открыть.файл.
somefile.txt
.в.
vi
,.выполните.команду:
vi somefile.txt
Находясь.в.среде.
vi
,.нажмите.клавишу.
Esc
,.а.затем,.чтобы.войти.в.режим.вставки.
и.отредактировать.текст,.введите.
i
..Для.выхода.из.режима.вставки.нажмите.
Esc
Для.перехода.в.командный.режим.нажмите.клавишу.
Esc
..Вы.можете.ввести.одну.
из.команд,.приведенных.в.табл..11.1,.и,.чтобы.она.вступила.в.силу,.нажать.кла- вишу.
Enter
170 Часть II • Защитные операции с использованием bash
Таблица 11.1. Общие команды vi
Команда
Назначение
b
Одно.слово.назад cc
Заменить.текущую.строку cw
Заменить.текущее.слово dw
Удалить.текущее.слово dd
Удалить.текущую.строку
:w
Записать/сохранить.файл
:w.filename
Записать/сохранить.файл.с.именем.filename
:q!
Выйти.без.сохранения
ZZ
Сохранить.и.выйти
:set.number
Показать.номера.строк
/
Поиск.вперед
?
Поиск.в.обратном.направлении n
Найти.следующее.вхождение
Полный.обзор.
vi
.выходит.за.рамки.этой.книги..Для.получения.дополнительной.
информации.вы.можете.посетить.страницу.редактора.Vim.(
https://www.vim.org/
).
xxd
Команда.
xxd
.выводит.на.экран.файл.в.двоичном.или.шестнадцатеричном.формате.
Общие параметры команды
-b
.—.отобразить.файл.с.использованием.двоичного,.а.не.шестнадцатеричного.
формата.
-l
.—.вывести.количество.байт.двоичного.или.шестнадцатеричного.файла.
-s
.—.начать.печать.с.позиции.байта.n.
Пример команды
Для.отображения.файла.
somefile.txt
.начать.печать.с.35-го.байта.и.распечатать.
следующие.50.байт:
xxd -s 35 -l 50 somefile.txt
Глава 11. Анализ вредоносных программ 171
Реверс-инжиниринг
Подробности.того,.как.выполнить.реверс-инжиниринг.(reverse-engineering).дво- ичного.кода,.выходят.за.рамки.этой.книги..Тем.не.менее.мы.рассмотрим,.как.ис- пользовать.стандартную.командную.строку.для.проведения.реверс-инжиниринга..
Описанные.методы.анализа.с.помощью.командной.строки.не.заменяют.такие.ин- струменты,.как.IDA.Pro.или.OllyDbg;.они.скорее.предназначены.для.расширения.
возможностей.этих.инструментов.или.для.предоставления.некоторого.недоступ- ного.ранее.функционала.
Подробную информацию об анализе вредоносных программ см. в книге «Вскрытие покажет! Практический анализ вредоносного ПО» Майкла Сикорски и Эндрю Хо- нига (Питер, 2018). Дополнительную информацию о компании IDA Pro вы найдете в книге Криса Игла (Chris Eagle) The IDA Pro Book (No Starch Press).
Шестнадцатеричные, десятичные, двоичные и ASCII-преобразования
При.анализе.файлов.важно.иметь.возможность.их.простого.перекодирования.из.
десятичного.формата.в.шестнадцатеричный.или.ASCII.и.наоборот..К.счастью,.это.
можно.легко.сделать.из.командной.строки..Например,.возьмем.шестнадцатерич- ное.значение.0x41..Можно.использовать.команду.
printf
.для.его.преобразования.
в.десятичный.формат.с.помощью.строки.формата.
"%d"
:
$ printf "%d" 0x41 65
Чтобы.преобразовать.десятичное.число.обратно.в.шестнадцатеричное,.замените.
символы,.определяющие.формат,.на.
%x
:
$ printf "%x" 65 41
Чтобы.преобразовать.из.ASCII.в.шестнадцатеричный,.можно.передать.символ.из.
команды.
printf
.в.команду.
xxd
:
$ printf 'A' | xxd
00000000: 41
172 Часть II • Защитные операции с использованием bash
Для.преобразования.шестнадцатеричного.кода.в.ASCII.используйте.команду.
xxd с.параметром.
-r
:
$ printf 0x41 | xxd –r
A
Чтобы.преобразовать.из.ASCII.в.двоичный.код,.вы.можете.передать.символ.в.
xxd и.использовать.параметр.
-b
:
$ printf 'A' | xxd –b
00000000: 01000001
В показанных примерах вместо команды echo умышленно используется команда printf. Это объясняется тем, что команда echo автоматически добавляет в вывод лишний символ. Его можно увидеть здесь:
$ echo 'A' | xxd
00000000: 410a
Далее.рассмотрим.команду.
xxd
.и.способы.ее.использования.для.анализа.файла..
Для.примера.проанализируем.исполняемый.файл.
Анализ с помощью xxd
Для.изучения.функциональности.команды.
xxd
.возьмем.исполняемый.файл.
helloworld
Исходный.код.показан.в.примере.11.1..Файл.
helloworld
.компилируется.для.Linux.
в.Executable.and.Linkable.Format.(ELF).—.формат.исполняемых.и.компонуемых.моду- лей..Компиляция.производится.с.помощью.компилятора.GNU.C.Compiler.(GCC).
Пример 11.1. helloworld.c
#include
int main()
{
printf("Hello World!\n");
return 0;
}
Команда.
xxd
.может.использоваться.для.проверки.любой.части.исполняемого.
файла..В.качестве.примера.можно.посмотреть.магическое.число.файла,.которое.
начинается.с.позиции.0x00.и.имеет.размер.4.байта..Чтобы.выбрать.начальную.
позицию,.используйте.параметр.
-s
.(если.формат.файла.десятичный)..Для.опре-
Глава 11. Анализ вредоносных программ 173
деления.количества.возвращаемых.байтов.добавьте.параметр.
-l
.(для.десятичного.
формата)..Начальную.позицию.и.длину.также.можно.указать.в.шестнадцатеричном.
формате,.добавив.к.числу.символы.0x.(то.есть.0x2A)..Как.и.ожидалось,.мы.увидели.
магическое.число.ELF:
$ xxd -s 0 -l 4 helloworld
00000000: 7f45 4c46 .ELF
Пятый.байт.файла.покажет.вам.архитектуру.этого.файла:.является.ли.он.32-раз- рядным.(0x01).или.64-разрядным.(0x02).исполняемым.файлом..В.данном.случае.
это.64-разрядный.исполняемый.файл:
$ xxd -s 4 -l 1 helloworld
00000004: 02
Шестой.байт.описывает.порядок.записи.байтов:.little-endian.(от.младшего.к.стар- шему).(0x01).или.big-endian.(от.старшего.к.младшему).(0x02)..В.данном.случае.
порядок.записи.байтов.little-endian:
$ xxd -s 5 -l 1 helloworld
00000005: 01
Формат.и.порядок.байтов.—.важная.информация,.используемая.для.анализа.
остальной.части.файла..Например,.8.байт.64-битного.файла.ELF,.начинающихся.
с.0x20,.определяют.заголовок.программы:
$ xxd -s 0x20 -l 8 helloworld
00000020: 4000 0000 0000 0000
Нам.уже.известно,.что.порядок.записи.нашего.файла.—.little-endian,.поэтому.за- головок.начинается.с.0x40.
Эти.данные.мы.можем.использовать.для.отображения.заголовка.программы,.длина.
которого.для.64-битного.ELF-файла.должна.составлять.0x38.байт:
$ xxd -s 0x40 -l 0x38 helloworld
00000040: 0600 0000 0500 0000 4000 0000 0000 0000 ........@.......
00000050: 4000 4000 0000 0000 4000 4000 0000 0000 @.@.....@.@.....
00000060: f801 0000 0000 0000 f801 0000 0000 0000 ................
00000070: 0800 0000 0000 0000
Дополнительные.сведения.о.формате.файла.Linux.ELF.можно.найти.в.специфика- ции.Tool.Interface.Standard.(TIS).и.Executable.and.Linking.Format.(ELF).по.адресу.
http://bit.ly/2HVOMu7
174 Часть II • Защитные операции с использованием bash
Для.получения.дополнительной.информации.о.формате.исполняемых.файлов.
Windows.см..документацию.формата.переносимых.исполняемых.файлов.Microsoft:.
http://bit.ly/2FDm67s
Hex-редактор..Иногда.вам.может.потребоваться.отобразить.и.отредактировать.
файл.в.шестнадцатеричном.формате..Для.этого.следует.использовать.команду.
xxd при.работе.с.редактором.
vi
..Сначала,.как.обычно,.в.
vi
.откройте.файл,.который.
хотите.отредактировать:
vi helloworld
Открыв.файл,.введите.следующую.команду:
:%!xxd
В.
vi
.символ.
%
.представляет.диапазон.адресов.всего.файла,.а.символ.
!
.можно.ис- пользовать.для.выполнения.команды.оболочки,.заменяя.исходные.строки.выводом.
команды..Объединение.этих.двух.символов,.как.показано.в.предыдущей.команде.
(
:%!xxd
),.вызовет.текущий.файл.через.
xxd
.(или.любую.команду.оболочки).и.оста- вит.результаты.в.
vi
:
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
00000010: 0200 3e00 0100 0000 3004 4000 0000 0000 ..>.....0.@.....
00000020: 4000 0000 0000 0000 efbf bd19 0000 0000 @...............
00000030: 0000 0000 0000 4000 3800 0900 4000 1f00 ......@.8...@...
00000040: 1c00 0600 0000 0500 0000 4000 0000 0000 ..........@.....
После.внесения.изменений.можно.вернуть.файл.в.обычное.состояние.с.помощью.
команды.
vi:%!xxd
-r
..По.завершении.запишите.внесенные.изменения.(
ZZ
)..Конеч- но,.в.любой.момент.можно.просто.выйти.без.записи.внесенных.изменений.(
:q!
).
Чтобы преобразовать загруженный в vi файл в стандарт кодирования Base64, вве- дите :%!Base64. Чтобы преобразовать из Base64 обратно, введите :%!Base64 -d.
Извлечение строк
Один.из.основных.методов.анализа.неизвестного.исполняемого.файла.—.извлече- ние.всех.содержащихся.в.файле.строк.ASCII..Из.этих.строк.мы.можем.получить.
такие.данные,.как.имена.файлов,.пути,.IP-адреса,.имена.авторов,.информацию.
Глава 11. Анализ вредоносных программ 175
о.компиляторе,.URL-адреса.и.другую.ценную.информацию.о.функциональности.
или.происхождении.программы.
Команда.
strings
.может.извлекать.для.нас.данные.ASCII,.но.по.умолчанию.она.
недоступна.для.многих.дистрибутивов,.включая.Git.Bash..Чтобы.решить.эту.про- блему,.можно.воспользоваться.хорошей.командой.
egrep
:
egrep -a -o '\b[[:print:]]{2,}\b' somefile.exe
Это.регулярное.выражение.выполняет.поиск.в.указанном.файле.двух.или.более.
(здесь.конструкция.
{2,}
).печатаемых.символов.в.строке,.которые.отображаются.
как.непрерывное.слово..С.помощью.параметра.
-а
.двоичный.исполняемый.файл.
обрабатывается.как.текстовый..Параметр.
-o
.выводит.только.соответствующий.
текст,.а.не.всю.строку,.тем.самым.устраняя.любые.непечатаемые.двоичные.дан- ные..Поиск.осуществляется.по.двум.или.более.символам,.поскольку.одиночные.
символы.вполне.вероятны.в.любом.двоичном.байте.и,.таким.образом,.не.являются.
значимыми.
Чтобы.сделать.вывод.еще.более.чистым,.можно.с.помощью.параметра.
-u
.отсорти- ровать.результаты,.удалив.при.этом.все.дубликаты:
egrep -a -o '\b[[:print:]]{2,}\b' somefile.exe | sort -u
Возможно,.было.бы.полезно.отсортировать.строки.по.размеру,.от.самых.длинных.
до.самых.коротких,.так.как.наиболее.длинные.строки.чаще.содержат.интересную.
информацию..В.исходном.виде.команда.
sort
.не.предоставляет.возможности.для.
выполнения.этой.задачи..В.дополнение.вместе.с.ней.можно.использовать.команду.
awk
:
egrep -a -o '\b[[:print:]]{2,}\b' somefile.exe |
awk '{print length(), $0}' | sort -rnu
В.данном.случае.вы.сначала.отправляете.вывод.
egrep
.в.
awk
,.чтобы.увеличить.длину,.
добавив.символы.в.начале.каждой.строки..Затем.этот.вывод.сортируется.в.обрат- ном.порядке,.а.дубликаты.удаляются.
Метод.извлечения.строк.из.исполняемого.файла.имеет.свои.ограничения..Если.стро- ка.не.является.непрерывной,.то.есть.непечатаемые.символы.находятся.между.
печатаемыми.символами,.разделяя.их,.то.будет.выводиться.набор.отдельных.сим- волов,.а.не.целая.строка..Иногда.это.просто.артефакт,.полученный.при.создании.
исполняемого.файла..Но.разработчики.вредоносных.программ.могут.специально.
добавить.непечатаемые.символы,.чтобы.избежать.обнаружения..Для.аналогичной.
маскировки.существования.строк.в.двоичном.файле.они.также.могут.использовать.
кодировку.или.шифрование.
176 Часть II • Защитные операции с использованием bash
Взаимодействие с VirusTotal
VirusTotal.—.это.коммерческий.онлайн-инструмент,.который.используется.для.
выгрузки.файлов.и.проверки.их.множеством.антивирусных.движков.и.дру- гих.инструментов.статического.анализа,.чтобы.определить,.являются.ли.эти.
файлы.вредоносными..VirusTotal.также.может.предоставить.информацию.о.том,.
как.часто.конкретный.файл.встречался.и.был.ли.он.ранее.определен.как.вре- доносный..Это.называется.репутацией.файла..Если.файл.ранее.не.встречался.
и.поэтому.имеет.низкую.репутацию,.существует.большая.вероятность,.что.он.
вредоносный.
Будьте осторожны при выгрузке файлов в VirusTotal и подобные сервисы. По- скольку они содержат базы данных всех загруженных файлов, файлы с по- тенциально конфиденциальной или привилегированной информацией никогда не должны загружаться в эти сервисы. Кроме того, при определенных обстоя- тельствах загрузка вредоносных файлов в общедоступные хранилища может предупредить противника о том, что вы определили его присутствие в вашей системе.
VirusTotal.предоставляет.API.(интерфейс.прикладного.программирования),.
который.с.помощью.
curl
.можно.использовать.для.взаимодействия.с.сервисом..
Для.применения.API.необходимо.иметь.уникальный.ключ..Чтобы.его.получить,.
перейдите.на.сайт.VirusTotal.(
https://www.virustotal.com/
).и.запросите.учетную.запись..
После.ее.создания.войдите.в.систему.и.перейдите.в.настройки.учетной.записи,.что- бы.просмотреть.ключ.API..В.этой.книге.из.соображений.безопасности.мы.не.будем.
указывать.для.примеров.реальный.ключ.API;.вместо.этого.воспользуемся.текстом.
replace withapikey
.в.любом.месте,.где.требуется.ключ.API.
Полное описание API VirusTotal можно найти в документации VirusTotal: http://
bit.ly/2UXvQyB.
Поиск в базе данных по хеш-значению
Для.взаимодействия.с.сервисом.VirusTotal.через.Интернет.используется.запрос.
на.передачу.репрезентативного.состояния.(Representational.State.Transfer,.REST)..
В.табл..11.2.перечислены.некоторые.URL-адреса.REST.для.основных.функций.
сканирования.файлов.VirusTotal.
Глава 11. Анализ вредоносных программ 177
Таблица 11.2. Элементы API VirusTotal
Описание
Запросить URL
Параметры
Получение.отчета.о.сканировании https://www.virustotal.com/vtapi/v2/
file/report apikey,.resource,.
allinfo
Выгрузка.и.сканирование.файла https://www.virustotal.com/vtapi/v2/
file/scan apikey,.file
VirusTotal.хранит.историю.всех.файлов,.которые.ранее.были.загружены.и.проана- лизированы..Чтобы.определить,.есть.ли.отчет.по.этому.файлу,.можно.выполнить.
поиск.в.базе.данных.с.помощью.хеша.подозрительного.файла..Это.избавит.вас.от.
необходимости.фактически.выгружать.файл..Недостаток.этого.метода.в.том,.что,.
если.данный.файл.в.VirusTotal.еще.никто.не.загружал,.отчета.по.нему.не.будет.
VirusTotal.принимает.форматы.хешей.MD5,.SHA1.и.SHA256,.которые.можно.ге- нерировать.с.помощью.
md5sum
,.
sha1sum
.и.
sha256sum
.соответственно..После.того.как.
вы.сгенерировали.хеш.вашего.файла,.с.помощью.
curl
.и.запроса.REST.его.можно.
отправить.в.VirusTotal.
Запрос.REST.находится.в.виде.URL-адреса,.который.начинается.с.
https://www.virus- total.com/vtapi/v2/file/report
.и.имеет.три.основных.параметра:
apikey
.—.ваш.ключ.API,.полученный.от.VirusTotal;
resource
.—.хеш.файла.MD5,.SHA1.или.SHA256;
allinfo
.—.если.равен.
true
,.будет.возвращена.дополнительная.информация.от.
других.инструментов.
В.качестве.примера.возьмем.образец.вредоносного.ПО.WannaCry,.который.имеет.
MD5-хеш.
db349b97c37d22f5ea1d1841e3c89eb4
:
curl 'https://www.virustotal.com/vtapi/v2/file/report?apikey=replacewithapikey& resource=db349b97c37d22f5ea1d1841e3c89eb4&allinfo=false > WannaCry_VirusTotal.txt
Полученный.ответ.JSON.содержит.список.всех.антивирусных.программ,.в.которых.
был.запущен.файл,.и.определение.того,.был.ли.этот.файл.определен.как.вредонос- ный..Здесь.мы.видим.ответы.от.первых.двух.движков,.Bkav.и.MicroWorld-eScan:
{"scans":
{"Bkav":
{"detected": true,
"version": "1.3.0.9466",
"result": "W32.WannaCrypLTE.Trojan",
"update": "20180712"},
"MicroWorld-eScan":
{"detected": true,
178 Часть II • Защитные операции с использованием bash
"version": "14.0.297.0",
"result": "Trojan.Ransom.WannaCryptor.H",
"update": "20180712"}
Хотя.JSON.отлично.подходит.для.структурирования.данных,.у.людей.при.чтении.
могут.возникнуть.трудности..С.помощью.
grep
.вы.можете.извлечь.некоторые.важ- ные.сведения,.например,.был.ли.файл.определен.как.вредоносный:
$ grep -Po '{"detected": true.*?"result":.*?,' Calc_VirusTotal.txt
{"detected": true, "version": "1.3.0.9466", "result": "W32.WannaCrypLTE.Trojan",
{"detected": true, "version": "14.0.297.0", "result": "Trojan.Ransom.WannaCryptor.H",
{"detected": true, "version": "14.00", "result": "Trojan.Mauvaise.SL1",
В.
grep
.параметр.
-P
.применяется.для.включения.движка.Perl,.который.позволяет.
использовать.шаблон.
.*?
.как.ленивый.квантификатор..Этот.ленивый.квантифи- катор.соответствует.только.минимальному.количеству.символов,.необходимых.
для.соответствия.всему.регулярному.выражению,.что.позволяет.извлекать.ответ.
из.каждого.антивирусного.ядра.по.отдельности,.а.не.из.большой.группы.
Хотя.этот.метод.работает,.наилучшее.решение.можно.создать.с.помощью.сценария.
bash,.как.показано.в.примере.11.2.
Пример 11.2. vtjson.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# vtjson.sh
#
# Описание:
# Поиск вредоносных программ в файле JSON
#
# Использование:
# vtjson.awk [
#
# по умолчанию: Calc_VirusTotal.txt
#
RE='^.(.*)...\{.*detect..(.*),..vers.*result....(.*).,..update.*$'
FN="${1:-Calc_VirusTotal.txt}"
sed -e 's/{"scans": {/&\n /' -e 's/},/&\n/g' "$FN" |
while read ALINE
do if [[ $ALINE = $RE ]]
Глава 11. Анализ вредоносных программ 179
then
VIRUS="${BASH_REMATCH[1]}"
FOUND="${BASH_REMATCH[2]}"
RESLT="${BASH_REMATCH[3]}"
if [[ $FOUND = .*true.* ]]
then echo $VIRUS "- result:" $RESLT
fi fi done
.Это.сложное.регулярное.выражение.(или.
RE
).ищет.строки,.содержащие.слова.
DETECT
,.
RESULT
.и.
UPDATE
.в.указанной.последовательности..Более.того,.
RE
.также.на- ходит.в.пределах.любой.строки.три.подстроки,.которые.соответствуют.этим.трем.
ключевым.словам..Подстроки.обозначены.круглыми.скобками;.скобок.не.должно.
быть.в.строках,.которые.мы.ищем,.—.они.скорее.являются.синтаксисом.
RE
,.обо- значающим.группировку.
Рассмотрим.в.этом.примере.первую.группу..
RE
.заключено.в.одинарные.кавычки..
Здесь.может.быть.много.специальных.символов,.но.нам.не.нужно,.чтобы.они.были.
интерпретированы.как.специальные.символы.оболочки;.желательно,.чтобы.они.
передавались.буквально.процессору.regex..Следующий.символ,.
^
,.говорит.о.том,.что.
этот.поиск.следует.привязать.к.началу.строки..Символ.«точка».(
).соответствует.
любому.символу.в.строке.ввода..Затем.идет.группа.любых.символов.(
),.повторя- ющаяся.любое.количество.раз,.обозначаемое.символом.
*
Итак,.сколько.символов.потребуется.для.заполнения.этой.первой.группы?.
Мы.должны.и.дальше.просматривать.
RE
,.чтобы.найти.соответствия..То,.что.должно.
находиться.после.данной.группы,.—.это.три.символа,.за.которыми.следует.левая.
скобка..Итак,.теперь.мы.можем.описать.эту.первую.группировку.как.все.символы,.
начиная.со.второго.символа.строки.вплоть.до.трех.символов.перед.левой.скобкой,.
но.эти.три.символа.исключаются.
Данная.ситуация.похожа.на.ситуацию.с.другими.группами,.местоположение.ко- торых.ограничивается.точками.и.ключевыми.словами..Да,.это.довольно.жесткий.
формат,.но.предсказуемый..Данный.сценарий.мог.быть.написан.для.более.гибкой.
обработки.формата.ввода.(см..упражнения.в.конце.главы).
.Команда.
sed
.готовит.наши.входные.данные.для.более.легкой.обработки..Она.са- мостоятельно.помещает.в.строку.исходное.ключевое.слово.JSON.
scans
.и.связанные.
с.ним.знаки.пунктуации..Далее.в.конце.каждой.правой.скобки.(с.запятой.после.нее).
также.добавляется.символ.новой.строки..В.обоих.выражениях.редактирования.
символ.
&
.в.правой.части.подстановки.представляет.собой.то,.что.было.сопоставлено.
с.левой.стороны..Например,.во.второй.замене.амперсанд.является.сокращением.
для.правой.скобки.и.запятой.
180 Часть II • Защитные операции с использованием bash
.Здесь.используется.регулярное.выражение..Не.задавайте.
$RE
.внутри.кавычек,.
иначе.
$RE
.будет.соответствовать.таким.специальным.символам,.как.литералы..Чтобы.
определить.поведение.регулярного.выражения,.не.заключайте.его.в.кавычки.
.Если.в.регулярном.выражении.используются.скобки,.они.обозначают.подстроку,.
которую.можно.извлечь.из.переменной.массива.оболочки.
BASH_REMATCH
..Индекс.1.
обозначает.первую.подстроку.и.т..д.
.Это.еще.один.вариант.использования.сопоставления.регулярных.выражений..
Мы.ищем.слово.true.в.любом.месте.строки..Здесь.делается.предположение.о.наших.
входных.данных:.что.слово.true.не.появляется.ни.в.каком.другом.поле,.кроме.того,.
в.котором.мы.ожидаем.его.встретить..Мы.могли.бы.сделать.сопоставление.более.
конкретным.(например,.расположив.слово.true.рядом.со.словом.detected),.но.такой.
оператор.гораздо.лучше.читается.и.будет.работать.до.тех.пор,.пока.четыре.буквы.
t-r-u-e.не.появятся.в.данной.последовательности.в.любом.другом.поле.
Для.решения.этой.задачи.не.обязательно.использовать.регулярные.выражения..
В.примере.11.3.приводится.решение.с.использованием.
awk
..Теперь.в.
awk
.можно.эф- фективно.задействовать.регулярные.выражения,.но.они.вам.здесь.не.нужны.из-за.
другой.мощной.функции.
awk
:.синтаксического.разбора.входных.данных.на.поля.
Пример 11.3. vtjson.awk
# Bash и кибербезопасность
# vtjson.awk
#
# Описание:
# Поиск вредоносных программ в файле JSON
#
# Использование:
# vtjson.awk
#
#
FN="${1:-Calc_VirusTotal.txt}"
sed -e 's/{"scans": {/&\n /' -e 's/},/&\n/g' "$FN" |
awk '
NF == 9 {
COMMA=","
QUOTE="\""
if ( $3 == "true" COMMA ) {
VIRUS=$1
gsub(QUOTE, "", VIRUS)
RESLT=$7
gsub(QUOTE, "", RESLT)
gsub(COMMA, "", RESLT)
Глава 11. Анализ вредоносных программ 181
print VIRUS, "- result:", RESLT
}
}'
.Мы.начинаем.с.той.же.предварительной.обработки.входных.данных,.что.и.в.пре- дыдущем.сценарии..На.этот.раз.передаем.результаты.в.
awk
.Код.внутри.этих.фигурных.скобок.будет.выполняться.только.для.входных.строк.
с.девятью.полями.
.Мы.устанавливаем.переменные.для.хранения.этих.строковых.констант..Обратите.
внимание,.что.мы.не.можем.использовать.одинарные.кавычки.вокруг.одного.симво- ла.двойной.кавычки..Почему?.Потому.что.весь.сценарий.
awk
.защищен.(от.интерпре- тации.специальных.символов.в.оболочке).одинарными.кавычками.(вернитесь.на.три.
строки.назад.или.перейдите.в.конец.этого.сценария)..Вместо.этого.мы.экранируем.
двойную.кавычку,.поставив.перед.ней.обратный.слеш.
.Здесь.третье.поле.входной.строки.сравнивается.со.строкой.
"true"
,.поскольку.
в.
awk
.сочетание.строк.подразумевает.конкатенацию..Мы.не.используем.знак.плюс.
для.добавления.двух.строк,.как.это.делается.в.некоторых.языках;.мы.просто.ука- зываем.их.рядом.друг.с.другом.
.Как.и.в.случае.с.
$3
,.который.используется.в.условии.
if
,.
$1
.здесь.относится.к.но- меру.поля.входной.строки.—.первому.слову.ввода..Это.не.переменная.оболочки,.
ссылающаяся.на.параметр.сценария..Помните.про.одинарные.кавычки,.в.которые.
заключен.этот.сценарий.
awk
.
gsub
.—.это.функция.
awk
,.выполняющая.глобальное.замещение..При.поиске.
через.третий.аргумент.она.заменяет.все.вхождения.первого.аргумента.вторым..
Поскольку.второй.аргумент.—.это.пустая.строка,.то.из.строки.в.переменной.
VIRUS
(которой.было.присвоено.значение.первого.поля.строки.ввода).удаляются.все.
символы.кавычек.
Остальная.часть.сценария,.выполняющая.эти.замены.и.выводящая.результаты,.во.
многом.совпадает.с.предыдущим..Помните,.что.в.
awk
.сценарий.продолжает.читать.
stdin.и.выполнять.код.по.одному.разу.для.каждой.строки.ввода.до.его.конца.
Сканирование файла
Вы.можете.выгрузить.новые.файлы.для.анализа.в.VirusTotal,.если.информа- ции.о.них.еще.нет.в.базе.данных..Для.этого.вам.нужно.отправить.запрос.HTML.
POST.на.URL-адрес.
https://www.virustotal.com/vtapi/v2/file/scan
..Вы.также.должны.
предоставить.свой.ключ.API.и.путь.для.выгрузки.файла..Ниже.приведен.пример.
182 Часть II • Защитные операции с использованием bash использования.файла.Windows.
calc.exe
,.который.обычно.можно.найти.в.каталоге.
C:\Windows\System32
:
curl --request POST --url 'https://www.virustotal.com/vtapi/v2/file/scan'
--form 'apikey=replacewithapikey' --form 'file=@/c/Windows/System32/calc.exe'
Результаты.после.выгрузки.файла.будут.получены.не.сразу..Возвращается,.напри- мер,.следующий.объект.JSON,.содержащий.метаданные.файла,.который.можно.
использовать.для.последующего.получения.отчета.с.применением.идентификатора.
сканирования.или.одного.из.значений.хеш-функции:
{
"scan_id": "5543a258a819524b477dac619efa82b7f42822e3f446c9709fadc25fdff94226-1...",
"sha1": "7ffebfee4b3c05a0a8731e859bf20ebb0b98b5fa",
"resource": "5543a258a819524b477dac619efa82b7f42822e3f446c9709fadc25fdff94226",
"response_code": 1,
"sha256": "5543a258a819524b477dac619efa82b7f42822e3f446c9709fadc25fdff94226",
"permalink": "https://www.virustotal.com/file/5543a258a819524b477dac619efa82b7...",
"md5": "d82c445e3d484f31cd2638a4338e5fd9",
"verbose_msg": "Scan request successfully queued, come back later for the report"
}
Сканирование URL-адресов, доменов и IP-адресов
VirusTotal.также.предоставляет.возможность.сканирования.определенного.URL,.
домена.или.IP-адреса..Все.вызовы.API.схожи.в.том,.что.они.отправляют.HTTP- запрос.GET.на.соответствующий.URL-адрес,.указанный.в.табл..11.3.с.соответству- ющими.параметрами.
Таблица 11.3. VirusTotal URL API
Описание
Запросить URL
Параметры
Отчет.по.URL
https://www.virustotal.com/vtapi/v2/url/report apikey,.resource,.
allinfo,.scan
Доменный.отчет https://www.virustotal.com/vtapi/v2/domain/report apikey,.domain
Отчет.по.IP
https://www.virustotal.com/vtapi/v2/ip-address/report apikey,.ip
Вот.пример.запроса.отчета.сканирования.по.URL-адресу:
curl 'https://www.virustotal.com/vtapi/v2/url/report?apikey=replacewithapikey
&resource=www.oreilly.com&allinfo=false&scan=1'
Параметр.
scan=1
.автоматически.отправит.URL-адрес.для.анализа,.если.его.еще.
нет.в.базе.данных.
Глава 11. Анализ вредоносных программ 183
Выводы
Используя.только.командную.строку,.нельзя.обеспечить.тот.же.уровень.произ- водительности,.что.предоставляют.полнофункциональные.инструменты.реверс- инжиниринга..Но.с.ее.помощью.можно.обеспечить.проверку.исполняемого.файла..
Не.забывайте,.что.анализировать.подозрительные.вредоносные.программы.следует.
только.на.системах,.отключенных.от.сети,.и.помните.о.проблемах.конфиденциаль- ности,.которые.могут.возникнуть.при.выгрузке.файлов.в.VirusTotal.или.другие.
подобные.сервисы.
В.следующей.главе.мы.рассмотрим,.как.улучшить.визуализацию.данных.после.их.
сбора.и.анализа.
Упражнения
1.. Создайте.регулярное.выражение.для.поиска.в.двоичном.файле.одиночных.
печатаемых.символов,.разделенных.одиночными.непечатаемыми.символами..
Например,.
p.
a.
s.
s.
w.
o.
r.
d
,.где.
.представляет.непечатаемый.символ.
2.. Выполните.поиск.вхождения.одного.печатаемого.символа.в.двоичном.файле..
Вместо.того.чтобы.печатать.найденные.символы,.распечатайте.символы,.ко- торые.не.были.найдены..Чтобы.немного.упростить.упражнение,.учитывайте.
только.буквенно-цифровые.символы.
3.. С.помощью.одной.команды.напишите.сценарий.для.взаимодействия.с.API.
VirusTotal..Используйте.параметр.
-H
.для.проверки.хеша,.
-F
.—.для.загрузки.
файла.и.
-U
.—.для.проверки.URL-адреса..Например:
$ ./vt.sh -h db349b97c37d22f5ea1d1841e3c89eb4
Detected: W32.WannaCrypLTE.Trojan
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
12
Форматирование и отчетность
Для.получения.максимальной.пользы.все.собранные.ранее.и.проанализированные.
данные.должны.быть.представлены.в.понятном.и.удобочитаемом.формате..Часто.
формат.стандартного.вывода.командной.строки.не.позволяет.выводить.большое.
количество.информации..Поэтому.для.улучшения.читаемости.можно.воспользо- ваться.дополнительными.методами.
Используемые команды
В.этой.главе.для.форматирования.вывода.мы.будем.применять.команду.
tput tput
Команда.
tput
,.используя.базу.данных.
terminfo
,.управляет.вашими.сеансами.работы.
с.терминалом..С.помощью.команды.
tput
.можно.управлять.различными.функция- ми.терминала,.такими.как.перемещение.или.изменение.вида.курсора,.изменение.
свойств.текста.и.очистка.определенных.областей.экрана.терминала.
Общие параметры команды
clear
.—.очистить.экран.
cols
.—.распечатать.количество.столбцов.терминала.
cup
.—.переместить.курсор.в.положение.
,.
lines
.—.распечатать.количество.строк.терминала.
rmcup
.—.вернуться.к.обычному.экрану.терминала.
Глава 12. Форматирование и отчетность 185
setab
.—.установить.цвет.фона.терминала.
setaf
.—.установить.основной.цвет.терминала.
smcup
.—.сохранить.текущий.экран.терминала.и.очистить.экран.
Форматирование для отображения в виде HTML-документа
Если.результат.не.требуется.просматривать.непосредственно.в.командной.стро- ке,.отличным.способом.обеспечить.аккуратное.и.понятное.форматирование.вы- водимых.данных.будет.преобразование.информации.в.формат.HTML..Данные.
в.формате.HTML.удобно.выводить.на.печать,.используя.встроенные.в.браузер.
возможности.для.печати.
Полный.синтаксис.HTML.выходит.за.рамки.этой.книги,.здесь.же.мы.рассмотрим.
основные.принципы.форматирования..HTML.—.это.компьютерный.язык,.который.
определяется.рядом.тегов,.управляющих.форматированием.данных.и.их.поведени- ем.в.браузере..В.HTML.обычно.используются.открывающие.теги.(
)..В.табл..12.1.
перечислены.несколько.наиболее.популярных.тегов.и.их.назначение.
Таблица 12.1. Основные HTML-теги
Тег
Назначение
Внешний.тег.в.HTML-документе
Тег,.содержащий.основное.содержимое.HTML-документа
Заголовок
Полужирный.текст
Нумерованный.список
Маркированный.список
В.примере.12.1.показан.образец.документа.HTML.
Пример 12.1. Заготовка HTML-документа
1 ... 12 13 14 15 16 17 18 19 ... 23
This is a header
186 Часть II • Защитные операции с использованием bash
this is bold text
this is a link
- This is list item 1
- This is list item 2
Row 1, Column 1
Row 1, Column 2
Row 2, Column 1
Row 2, Column 2
.Тег.
.предназначен.для.создания.нумерованного.списка,.а.тег.
.—.для.
создания.маркированного.
.Тег.
-
.определяет.элемент.списка.
.Тег.
.используется.для.определения.таблицы.
.Тег.
.применяется.для.определения.строки.таблицы.
.Тег.
.используется.для.определения.ячейки.таблицы.
Для получения дополнительной информации о HTML обратитесь к справочным материалам HTML5 Консорциума World Wide Web (http://bit.ly/2U1TRbz).
На.рис..12.1.показано,.как.выглядит.страница.из.примера.12.1.при.отображении.
в.браузере.
Чтобы.упростить.вывод.в.HTML,.вы.можете.создать.простой.сценарий.для.упа- ковки.элементов.в.теги..Сценарий,.показанный.в.примере.12.2,.принимает.строку.
и.тег,.после.чего.выводит.эту.строку,.окруженную.тегом,.а.затем.символ.новой.
строки.
Глава 12. Форматирование и отчетность 187
Рис. 12.1. Визуализированная HTML-страница
Пример 12.2. tagit.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# tagit.sh
#
# Описание:
# Поместить открывающие и закрывающие теги вокруг строки
#
# Использование:
# tagit.sh
# Используемый тег
# Строка с тегами
#
printf '<%s>%s%s>\n' "${1}" "${2}" "${1}"
Полученный.вывод.также.можно.превратить.в.простую.функцию,.которую.впо- следствии.можно.включить.в.другие.сценарии:
function tagit ()
{
printf '<%s>%s%s>\n' "${1}" "${2}" "${1}"
}
Вы.можете.использовать.HTML-теги.для.переформатирования.практически.
любого.типа.данных,.после.чего.чтение.этих.данных.значительно.облегчится..
188 Часть II • Защитные операции с использованием bash
В.примере.12.3.показан.сценарий,.читающий.файл.Apache.
access.log
,.приведенный.
в.примере.7.2..Для.переформатирования.и.вывода.файла.журнала.в.виде.HTML.
используется.функция.
tagit
Пример 12.3. weblogfmt.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# weblogfmt.sh
#
# Описание:
# Чтение веб-журнала Apache и его вывод в виде HTML
#
# Использование:
# weblogfmt.sh < input.file > output.file
#
function tagit()
{
printf '<%s>%s%s>\n' "${1}" "${2}" "${1}"
}
# основные теги заголовка echo ""
echo ""
echo "$1
" # заголовок echo "" # таблица с границами echo "" # новая строка таблицы echo "IP Address " # заголовок столбца echo "Date "
echo "URL Requested "
echo "Status Code "
echo "Size "
echo "Referrer "
echo "User Agent "
echo " "
while read f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12plus
do echo ""
tagit "td" "${f1}"
tagit "td" "${f4} ${f5}"
tagit "td" "${f6} ${f7}"
tagit "td" "${f9}"
tagit "td" "${f10}"
tagit "td" "${f11}"
Глава 12. Форматирование и отчетность 189
tagit "td" "${f12plus}"
echo "
"
done < $1
# закрывающие теги echo "
"
echo "
$1
EOF
Преимущество.этого.кода.в.том,.что.не.требуется.повторять.все.команды.
echo
Обратите.внимание:.все.равно.потребуется.выполнить.замену.
$1
,.если.при.вызове.
не.будет.ссылки.на.
EOF
.в.любой.форме..Однако.в.этом.решении.есть.один.недоста- ток:.в.таком.случае.мы.не.сможем.добавлять.в.наш.ввод.комментарии.
.Файл.журнала.—.это.файл.фиксированного.формата,.по.крайней.мере.для.не- скольких.первых.полей..Здесь.мы.можем.прочитать.каждую.строку.из.файла.жур- нала.и.разобрать.ее.на.поля..Для.чтения.всех.полей.в.массив.можно.использовать.
конструкцию.
read
-a
RAOFTXT
,.по.одному.полю.для.каждого.индекса..Но.при.таком.
подходе.становится.сложно.распечатать.все.оставшиеся.поля,.расположенные.по- сле.12-го..Поэтому.все.оставшиеся.слова.были.включены.в.последнее.поле,.которое.
мы.назвали.
f12plus
.Обратите.внимание,.что.в.этой.и.следующей.строках.два.аргумента.заключены.
в.пару.двойных.кавычек..В.данной.строке.объединены.аргументы.
f4
.и.
f5
..После.
того.как.их.совместно.взяли.в.кавычки,.для.сценария.
tagit
.они.превращаются.
в.один.аргумент.(
$2
)..Таким.образом.можно.сделать.вывод,.что.
f12plus
.следует.
заключить.в.кавычки..При.этом.все.слова.в.данном.поле.будут.рассматриваться.
как.один.аргумент.
tagit
На.рис..12.2.показан.пример.вывода.из.примера.12.3.
Прежде.чем.отправлять.эти.данные.в.сценарий,.например.в.
weblogfmt.sh
,.кото- рый.их.отформатирует,.их.следует.отфильтровать.и.отсортировать..Для.филь- трации.и.сортировки.данных.можно.воспользоваться.методами,.описанными.
в.главе.7.
190 Часть II • Защитные операции с использованием bash
Рис.
12.2.
Визуализация вывода из weblogf mt.sh
Глава 12. Форматирование и отчетность 191
Создание панели мониторинга
Панели.инструментов.полезны,.если.требуется.отобразить.несколько.блоков.ин- формации,.меняющейся.со.временем..Панель.инструментов,.которую.мы.далее.
рассмотрим,.отобразит.выводы.трех.сценариев.и.станет.обновлять.их.через.равные.
промежутки.времени.
Здесь.используются.графические.функции.окна.терминала..Вместо.того.чтобы.
просто.прокручивать.данные.страницу.за.страницей,.сценарий.каждый.раз.будет.
перерисовывать.экран.с.одной.и.той.же.начальной.позиции,.чтобы.при.перерисовке.
он.полностью.обновлялся.
Чтобы.сценарий.можно.было.переносить.между.различными.программами,.за- пущенными.в.терминале,.нужно.использовать.команду.
tput
,.которая.будет.запра- шивать.последовательность.символов,.выполняющих.графические.функции.для.
открытого.в.данный.момент.окна.программы.
Поскольку.экран.постоянно.«перерисовывается»,.вы.не.можете.просто.переме- ститься.в.верхнюю.часть.экрана.и.восстановить.результат..Почему?.Поскольку.
при.следующей.итерации.могут.быть.отображены.более.короткие.строки,.чем.
в.предыдущем.выводе,.старые.данные.с.экрана.следует.удалить.
Сначала.следует.очистить.экран,.но,.если.на.нем.перед.заполнением.ничего.не.будет.
(например,.из-за.задержек.в.командах,.предоставляющих.вывод.для.отображения),.
этот.эффект.будет.раздражать..В.таком.случае.вы.можете.отправлять.весь.вывод.
через.функцию.(нашей.собственной.разработки),.печатающую.каждую.строку.вы- вода,.и.добавлять.в.конец.каждой.строки.последовательность.символов,.которая.
будет.очищать.каждую.строку.по.ее.окончании,.удаляя.тем.самым.весь.предыду- щий.вывод..Данная.функция.позволит.немного.украсить.вывод,.завершая.каждую.
строку.пунктирной.линией.
В.примере.12.4.показано.создание.экранной.панели.управления,.содержащей.три.
отдельных.раздела.вывода.
Пример 12.4. webdash.sh
#!/bin/bash -
#
# Rapid Cybersecurity Ops
# webdash.sh
#
# Описание:
# Создание информационной панели
192 Часть II • Защитные операции с использованием bash
# Заголовок
# --------------
# Однострочный вывод
# --------------
# Вывод из пяти строк
# ...
# --------------
# Метки столбцов, а затем
# восемь строк гистограммы
# ...
# --------------
#
# некоторые важные постоянные строки
UPTOP=$(tput cup 0 0)
ERAS2EOL=$(tput el)
REV=$(tput rev) # негативное изображение
OFF=$(tput sgr0) # общий сброс
SMUL=$(tput smul) # режим подчеркивания включен (пуск)
RMUL=$(tput rmul) # режим подчеркивания выключен (сброс)
COLUMNS=$(tput cols) # ширина нашего окна
# DASHES(ТИРЕ)='------------------------------------'
printf -v DASHES '%*s' $COLUMNS '-'
DASHES=${DASHES// /-}
#
# prSection – напечатать фрагмент экрана
# напечатать $1-many строк из stdin
# каждая строка представляет собой полную строку текста
# с последующим стиранием до конца строки
# разделы заканчиваются штриховой линией
#
function prSection ()
{
local -i i
for((i=0; i < ${1:-5}; i++))
do read aline printf '%s%s\n' "$aline" "${ERAS2EOL}"
done printf '%s%s\n%s' "$DASHES" "${ERAS2EOL}" "${ERAS2EOL}"
}
function cleanup()
{
if [[ -n $BGPID ]]
then kill %1
rm -f $TMPFILE
fi
} &> /dev/null
Глава 12. Форматирование и отчетность 193
trap cleanup EXIT
# запустить процесс bg
TMPFILE=$(tempfile)
{ bash tailcount.sh $1 | \
bash livebar.sh > $TMPFILE ; } &
BGPID=$!
clear while true do printf '%s' "$UPTOP"
# заголовок:
echo "${REV}Rapid Cyber Ops Ch. 12 -- Security Dashboard${OFF}" \
| prSection 1
#----------------------------------------
{
printf 'connections:%4d %s\n' \
$(netstat -an | grep 'ESTAB' | wc -l) "$(date)"
} | prSection 1
#---------------------------------------- tail -5 /var/log/syslog | cut -c 1-16,45-105 | prSection 5
#----------------------------------------
{ echo "${SMUL}yymmdd${RMUL}" \
"${SMUL}hhmmss${RMUL}" \
"${SMUL}count of events${RMUL}"
tail -8 $TMPFILE
} | prSection 9
sleep 3
done
.Команда.
tput
.предоставляет.независимую.от.терминала.последовательность.
символов,.позволяющую.переместиться.в.левый.верхний.угол.экрана..Чтобы.
не.вызывать.данную.команду.при.каждом.цикле,.мы.вызываем.ее.только.один.раз.
и.сохраняем.вывод.для.повторного.использования.при.каждой.итерации..Далее.
следуют.другие.вызовы.специальных.последовательностей,.сохраненных.для.по- вторного.использования.
.Существует.несколько.способов.создания.пунктирной.линии..Здесь.мы.выбрали.
один,.хоть.немного.и.замысловатый,.но.очень.интересный.вариант..При.этом.двух- этапном.процессе.используется.заполнение.функцией.
printf
.всей.пустой.резуль- тирующей.строки..Символ.
*
.указывает.функции.
printf
.использовать.для.задания.
ширины.отформатированного.поля.первую.переменную..В.результате.получается.
строка.из.49.пробелов.и.одного.знака.минус..Напечатанная.строка.сохраняется.
в.переменной,.заданной.параметром.
-v
..Вторая.часть.создания.пунктирной.линии.
заключается.в.том,.чтобы.заменить.каждый.пробел.знаком.минус.(двойной.слеш.
указывает.bash.заменить.не.только.первое,.но.и.все.остальные.вхождения).
194 Часть II • Защитные операции с использованием bash
.Объявление.в.нашем.сценарии.переменной.
i
.как.локальной.—.хорошая.практика,.
хотя.для.нашего.сценария.это.некритично..Тем.не.менее.так.ваш.цикл.
for
.не.будет.
изменять.какой-либо.другой.индекс.или.счетчик.
.К.каждой.строке,.отправляемой.через.данную.функцию,.мы.добавляем.указание.
erase-to-end-of-line.(«стереть.до.конца.строки»).как.в.текущей,.так.и.в.следующей.
функции.
printf
..После.печати.пунктирной.линии.вторая.функция.
printf
.стирает.
следующую.строку,.где.курсор.будет.находиться.до.следующей.итерации.
.Функция.очистки.вызывается.при.выходе.из.сценария.панели.мониторинга,.
когда.пользователь.для.прерывания.и.выхода.из.сценария.нажмет.сочетание.кла- виш.
Ctrl
+
C
..Как.и.наша.функция.очистки.в.сценарии.
tailcount.sh
.(см..главу.8),.эта.
функция.завершит.работу.функций,.находящихся.в.фоновом.режиме.
.В.отличие.от.предыдущей.версии,.где.системный.вызов.
kill
.отправляет.сигнал.
определенному.процессу,.здесь.мы.используем.нотацию.
%1
,.чтобы.дать.системному.
вызову.
kill
.указание,.согласно.которому.сигнал.должен.быть.передан.всем.процес- сам,.запущенным.в.результате.работы.процесса.в.фоновом.режиме..Все.эти.процессы.
считаются.частью.одной.и.той.же.«работы»..Их.рабочие.номера.(
%1
,.
%2
,.
%3
.и.т..д.).
определяются.порядком.их.размещения.в.фоновом.режиме..В.этом.сценарии.у.нас.
есть.только.один.фоновый.процесс.
.Мы.перенаправляем.вывод.в.функцию.
clear
.таким.образом,.что.все.выходные.
данные,.поступающие.из.stdout.или.stderr,.будут.отброшены..Такая.очистка.гаран- тирует.отсутствие.любых.неожиданных.сообщений,.хотя.ничего.подобного.мы.и.не.
ожидаем.(это.плохо.для.отладки,.но.экран.будет.намного.чище).
.Команда.
tempfile
.генерирует.уникальное.имя.и.проверяет,.не.используется.ли.
оно.в.данный.момент..В.результате.нам.будет.известно,.что,.независимо.от.количе- ства.запущенных.экземпляров.сценария.и.расположенных.рядом.других.файлов,.
для.этого.сценария.рабочий.файл.будет.доступен..В.функции.
clear
.есть.код,.уда- ляющий.данный.файл.при.каждом.выходе.из.сценария.
.Эта.строка.запускает.два.сценария,.которые.описаны.в.главе.8..Данные.сценарии.
подсчитывают.строки,.добавляемые.в.конце.файла..Фигурные.скобки.группируют.
все.процессы.этого.конвейера.команд.вместе.и.помещают.в.«фон»,.отключая.их.от.
ввода.с.клавиатуры..Эти.процессы.и.все,.что.они.создали,.являются.частью.зада- ния.1.(
%1
),.то.есть.задания,.работу.которого.прекратит.функция.
clear
.Каждый.раздел.вывода.отправляется.отдельно.в.функцию.
prSection
..Команды.
для.раздела.не.нужно.группировать.внутри.фигурных.скобок,.если.для.этого.
раздела.одна.команда.генерирует.вывод..Это.относится.к.первым.трем.разделам,.
Глава 12. Форматирование и отчетность 195
но.четвертому.разделу.для.группировки.двух.операторов.(
echo
.и.
tail
),.записы- вающих.вывод,.требуются.скобки..Во.втором.разделе.фигурные.скобки.хотя.и.не.
нужны,.но.предусмотрены.в.случае,.если.мы.когда-нибудь.захотим.расширить.этот.
раздел.и.иметь.разные.выходные.данные..Команды.для.раздела.не.нужно.группи- ровать.внутри.фигурных.скобок,.если.одна.команда.генерирует.вывод..Для.всех.
остальных.разделов.в.качестве.меры.предосторожности.при.расширении.можно.
сделать.то.же.самое..Обратите.внимание.на.небольшую.разницу.в.синтаксисе.
между.использованием.фигурных.скобок.в.этой.и.предыдущей.строке.с.пометкой..
Нам.не.нужна.точка.с.запятой,.потому.что.мы.помещаем.закрывающую.скобку.на.
новую.строку.
На.рис..12.3.показан.пример.вывода.сценария.панели.управления.
Рис. 12.3. Вывод на панели управления
Выводы
Полученные.ранее.данные.принесут.пользу.только.в.том.случае,.если.будут.удоб- ны.для.чтения.пользователю,.которому.эта.информация.предназначалась..HTML.
предоставляет.простой.способ.форматирования.данных.для.отображения.на.экране.
или.для.печати..Панель.мониторинга,.созданная.в.этой.главе,.может.быть.особенно.
полезной.при.отслеживании.информации.в.режиме.реального.времени.
В.следующей.главе.мы.рассмотрим,.как.командная.строка.и.bash.могут.помочь.вам.
выполнить.тестирование.на.проникновение.
196 Часть II • Защитные операции с использованием bash
Упражнения
1.. Измените.сценарий.
webdash.sh
.так,.чтобы.захватить.два.аргумента.командной.
строки,.определяющие.записи.журнала,.используемого.для.мониторинга..На- пример:
./webdash.sh /var/log/apache2/error.log /var/log/apache2/access.log
2.. Напишите.сценарий,.подобный.примеру.12.3,.который.преобразует.журнал.
ошибок.Apache.в.HTML-код.
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
Часть III
Тестирование на проникновение
Пусть.планы.твои.пребывают.во.тьме,.
непроницаемые,.словно.ночь,.так,.
чтобы,.когда.ты.двинешь.свои.силы,.они.
обрушились.подобно.молнии
1
Сунь-цзы. Искусство войны
В.части.III.мы.рассмотрим.использование.командной.строки.
во.время.тестов.на.проникновение,.чтобы.проводить.разведку,.
выявлять.уязвимости.и.предоставлять.удаленный.доступ.
1.
Оригинальная.цитата:.Let.your.plans.be.dark.and.impenetrable.as.night,.and.when.you.move,.
fall.like.a.thunderbolt.
13
Разведка
Разведка.—.это,.как.правило,.первый.шаг.при.тестировании.на.проникновение..
Основная.задача.данного.этапа.—.используя.все.доступные.ресурсы,.собрать.как.
можно.больше.информации.о.цели..Нас.интересуют.такие.сведения,.как.имена,.
адреса.электронной.почты.и.номера.телефонов,.пространство.IP-адресов,.открытые.
сетевые.порты.и.используемое.программное.обеспечение.
Используемые команды
В.этой.главе.мы.познакомимся.с.командой.
ftp ftp
Команда.
ftp
.предназначена.для.передачи.файлов.на.FTP-сервер.и.обратно.
Общие параметры команды
-n
.—.запретить.автоматический.вход.на.сервер.
Пример команды
Для.подключения.к.FTP-серверу.с.IP-адресом.192.168.0.125.напишите.следующее:
ftp 192.168.0.125
По.умолчанию.команда.
ftp
.попытается.подключиться.через.TCP-порт.21..Если.вы.
хотите.подключиться.через.другой.порт,.укажите.номер,.введя.его.после.IP-адреса.
хоста..Например,.подключимся.к.порту.50:
ftp 192.168.0.125 50
После.подключения.к.FTP-серверу.для.отправки.и.получения.файлов.используйте.
интерактивные.команды..Чтобы.вывести.список.каталогов,.введите.команду.
ls
;.
Глава 13. Разведка 199
для.перехода.из.каталога.в.каталог.воспользуйтесь.командой.
cd
;.для.передачи.
файлов.на.FTP-сервер.применяется.команда.
put
,.а.для.передачи.файлов.с.FTP- сервера.—.команда.
get
Просмотр веб-сайтов
Для.копирования.веб-страницы.из.сети.можно.использовать.команду.
curl
Она.проста.в.использовании,.но.имеет.множество.дополнительных.параметров,.
предоставляющих.возможность.обработки.удаленной.аутентификации.и.сеан- совых.файлов.cookie..Обычно.вместе.с.командой.
curl
.используется.параметр.
-L
,.
позволяющий.команде.следовать.перенаправлениям.HTTP.при.изменении.место- положения.страницы..По.умолчанию.
curl
.будет.выводить.необработанный.HTML- код.в.stdout..Но.вывод.с.помощью.параметра.
-o
.можно.перенаправить.в.файл:
curl -L -o output.html https://www.oreilly.com
Параметр.
-I
.позволит.команде.
curl
.получать.только.HTTP-заголовки,.а.все.осталь- ное.содержимое.страницы.игнорировать..Это.может.быть.полезно.при.попытке.
идентификации.версии.веб-сервера.или.операционной.системы..В.приведенном.
ниже.примере.можно.увидеть,.что.сервер.использует.Apache.2.4.7.и.операционную.
систему.Ubuntu:
$ curl -LI https://www.oreilly.com
HTTP/1.1 200 OK
Server: Apache/2.4.7 (Ubuntu)
Last-Modified: Fri, 19 Oct 2018 08:30:02 GMT
Content-Type: text/html
Cache-Control: max-age=7428
Expires: Fri, 19 Oct 2018 16:16:48 GMT
Date: Fri, 19 Oct 2018 14:13:00 GMT
Connection: keep-alive
Вы хотите узнать, доступен ли сайт? Перехватите заголовок с помощью curl, а затем для поиска кода состояния HTTP 200 используйте команду grep:
$ curl -LIs https://www.oreilly.com | grep '200 OK'
HTTP/1.1 200 OK
К.сожалению,.
curl
.может.извлекать.только.указанную.страницу.и.не.имеет.функ- ций.просмотра.содержимого.всего.сайта.или.перехода.по.ссылкам.на.странице.
200 Часть III • Тестирование на проникновение
WGET
Команда.
wget
.также.предназначена.для.загрузки.веб-страниц,.но.по.умолчанию.во.
многих. дистрибутивах.Linux. она. не. установлена..В. Git. Bash. эта. команда. тоже. от- сутствует..Чтобы.установить.
wget
.в.дистрибутив.Linux.на.основе.Debian,.выполните.
следующие.действия:
sudo apt-get install wget
Одно.из.главных.преимуществ.
wget
.перед.
curl
.в.том,.что.
wget
.позволяет.зеркально.
отображать.или.копировать.весь.веб-сайт,.а.не.просто.получить.одну.страницу.или.
файл..При.использовании.зеркального.режима.
wget
.будет.сканировать.сайт.по.ссыл- кам.и.загружать.содержимое.каждой.найденной.страницы.в.указанный.каталог:
wget -p -m -k -P ./mirror https://www.digadel.com
Параметр.
-p
.используется.для.загрузки.файлов,.связанных.с.веб-сайтом,.таких.как.
каскадные.таблицы.стилей.(CSS).и.файлы.изображений;.параметр.
-m
.включает.ре- жим. зеркального. отображения,. параметр.
-k
. преобразует. ссылки. на. загруженные.
страницы.в.локальные.пути;.а.параметр.
-P
.указывает.путь.(то.есть.каталог),.в.кото- ром.сохраняется.зеркальный.веб-сайт.
Автоматический захват баннера
При.подключении.к.серверу.иногда.появляется.информация.о.приложении.веб- сервиса.или.об.операционной.системе.—.баннер..При.подключении.к.веб-серверу.
O’Reilly.в.заголовке.HTTP.можно.увидеть.такой.баннер.операционной.системы:
HTTP/1.1 200 OK
Server: Apache/2.4.7 (Ubuntu)
Last-Modified: Fri, 19 Oct 2018 08:30:02 GMT
Content-Type: text/html
Cache-Control: max-age=7428
Expires: Fri, 19 Oct 2018 16:16:48 GMT
Date: Fri, 19 Oct 2018 14:13:00 GMT
Connection: keep-alive
Ценной.считается.информация.о.том,.в.какой.операционной.системе.работает.по- тенциальная.цель..Получив.эту.информацию,.вы.можете.узнать,.какие.уязвимости.
могут.существовать.в.данной.системе..Впоследствии.эти.уязвимости.можно.ис- пользовать.на.начальном.этапе.жизненного.цикла.атаки.
Баннеры.обычно.отображают.несколько.типов.систем,.включая.веб-серверы,.FTP- серверы.и.серверы.протокола.SMTP.(Simple.Mail.Transfer.Protocol)..В.табл..13.1.
показаны.сетевые.порты,.которые.обычно.используются.этими.службами.
Глава 13. Разведка 201
Таблица 13.1. Стандартные порты
Протокол сервера
Номер порта
FTP
TCP.21
SMTP
TCP.25
HTTP
TCP.80
В большинстве операционных систем баннер может быть изменен системным администратором. Баннер можно удалить полностью либо заставить его сооб- щать ложную информацию. Его также можно рассматривать как индикатор типа операционной системы или приложения, но полностью ему доверять нельзя.
В.главе.9.мы.рассматривали,.как.с.помощью.сценария.
scan.sh
.сканировать.сетевой.
порт..Этот.сценарий.можно.расширить.таким.образом,.что.при.каждом.обнаруже- нии.узла.с.одним.из.открытых.портов.(FTP,.SMTP.или.HTTP).он.будет.пытаться.
получить.и.сохранить.баннер.сервера.
Вы.уже.видели,.как.можно.использовать.команду.
curl
.для.захвата.заголовка.
HTTP,.который.может.содержать.баннер:
curl -LI https://www.oreilly.com
Для.захвата.баннера.с.FTP-сервера.можно.использовать.команду.
ftp
:
$ ftp -n 192.168.0.16
Connected to 192.168.0.16.
220 (vsFTPd 3.0.3)
ftp>
Параметр.
-n
.применяется,.чтобы.команда.
ftp
.не.пыталась.автоматически.войти.
на.сервер..Чтобы.после.подключения.закрыть.FTP-соединение,.с.терминала.
ftp>
введите.команду.
quit
Самый.простой.способ.перехватить.баннер.с.SMTP-сервера.—.использовать.
команду.
telnet
.с.сетевым.портом.
25
:
$ telnet 192.168.0.16 25
Connected to 192.168.0.16
Escape character is '^]'.
220 localhost.localdomain ESMTP Postfix (Ubuntu)
202 Часть III • Тестирование на проникновение
Команда.
telnet
.доступна.в.большинстве.версий.Linux,.но.в.Git.Bash.и.во.многих.
версиях.Windows.она.отсутствует..В.этих.случаях,.чтобы.получить.аналог.коман- ды.
telnet
,.вы.можете.написать.небольшой.сценарий,.используя.дескриптор.bash.
/dev/tcp
В.примере.13.1.показано,.как.для.подключения.к.SMTP-серверу.и.захвата.баннера.
использовать.файловый.дескриптор.bash.TCP.
Пример 13.1. smtpconnect.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# smtpconnect.sh
#
# Описание:
# Подключение к SMTP-серверу и печать приветственного баннера
#
# Использование:
# smtpconnect.sh
1 ... 13 14 15 16 17 18 19 20 ... 23
186 Часть II • Защитные операции с использованием bash
this is bold text
this is a link
- This is list item 1
- This is list item 2
Row 1, Column 1 | Row 1, Column 2 |
Row 2, Column 1 | Row 2, Column 2 |
.Тег.
.предназначен.для.создания.нумерованного.списка,.а.тег.
-
.определяет.элемент.списка.
.Тег.
.используется.для.определения.таблицы.
.Тег.
.применяется.для.определения.строки.таблицы.
.Тег.
.используется.для.определения.ячейки.таблицы.
Для получения дополнительной информации о HTML обратитесь к справочным материалам HTML5 Консорциума World Wide Web (http://bit.ly/2U1TRbz).
На.рис..12.1.показано,.как.выглядит.страница.из.примера.12.1.при.отображении.
в.браузере.
Чтобы.упростить.вывод.в.HTML,.вы.можете.создать.простой.сценарий.для.упа- ковки.элементов.в.теги..Сценарий,.показанный.в.примере.12.2,.принимает.строку.
и.тег,.после.чего.выводит.эту.строку,.окруженную.тегом,.а.затем.символ.новой.
строки.
Глава 12. Форматирование и отчетность 187
Рис. 12.1. Визуализированная HTML-страница
Пример 12.2. tagit.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# tagit.sh
#
# Описание:
# Поместить открывающие и закрывающие теги вокруг строки
#
# Использование:
# tagit.sh
#Используемый тег
#Строка с тегами
#
printf '<%s>%s%s>\n' "${1}" "${2}" "${1}"
Полученный.вывод.также.можно.превратить.в.простую.функцию,.которую.впо- следствии.можно.включить.в.другие.сценарии:
function tagit ()
{
printf '<%s>%s%s>\n' "${1}" "${2}" "${1}"
}
Вы.можете.использовать.HTML-теги.для.переформатирования.практически.
любого.типа.данных,.после.чего.чтение.этих.данных.значительно.облегчится..
188 Часть II • Защитные операции с использованием bash
В.примере.12.3.показан.сценарий,.читающий.файл.Apache.
access.log
,.приведенный.
в.примере.7.2..Для.переформатирования.и.вывода.файла.журнала.в.виде.HTML.
используется.функция.
tagit
Пример 12.3. weblogfmt.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# weblogfmt.sh
#
# Описание:
# Чтение веб-журнала Apache и его вывод в виде HTML
#
# Использование:
# weblogfmt.sh < input.file > output.file
#
function tagit()
{
printf '<%s>%s%s>\n' "${1}" "${2}" "${1}"
}
# основные теги заголовка echo ""
echo ""
echo "$1
" # заголовок echo "" # таблица с границами echo "
"" # новая строка таблицы echo " "IP Address " # заголовок столбца echo "Date "
echo "URL Requested "
echo "Status Code "
echo "Size "
echo "Referrer "
echo "User Agent "
echo "
while read f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12plus
do echo "" "
tagit "td" "${f1}"
tagit "td" "${f4} ${f5}"
tagit "td" "${f6} ${f7}"
tagit "td" "${f9}"
tagit "td" "${f10}"
tagit "td" "${f11}"
Глава 12. Форматирование и отчетность 189
tagit "td" "${f12plus}"
echo "
done < $1
# закрывающие теги echo "
echo "$1
EOF
Преимущество.этого.кода.в.том,.что.не.требуется.повторять.все.команды.
echo
Обратите.внимание:.все.равно.потребуется.выполнить.замену.
$1
,.если.при.вызове.
не.будет.ссылки.на.
EOF
.в.любой.форме..Однако.в.этом.решении.есть.один.недоста- ток:.в.таком.случае.мы.не.сможем.добавлять.в.наш.ввод.комментарии.
.Файл.журнала.—.это.файл.фиксированного.формата,.по.крайней.мере.для.не- скольких.первых.полей..Здесь.мы.можем.прочитать.каждую.строку.из.файла.жур- нала.и.разобрать.ее.на.поля..Для.чтения.всех.полей.в.массив.можно.использовать.
конструкцию.
read
-a
RAOFTXT
,.по.одному.полю.для.каждого.индекса..Но.при.таком.
подходе.становится.сложно.распечатать.все.оставшиеся.поля,.расположенные.по- сле.12-го..Поэтому.все.оставшиеся.слова.были.включены.в.последнее.поле,.которое.
мы.назвали.
f12plus
.Обратите.внимание,.что.в.этой.и.следующей.строках.два.аргумента.заключены.
в.пару.двойных.кавычек..В.данной.строке.объединены.аргументы.
f4
.и.
f5
..После.
того.как.их.совместно.взяли.в.кавычки,.для.сценария.
tagit
.они.превращаются.
в.один.аргумент.(
$2
)..Таким.образом.можно.сделать.вывод,.что.
f12plus
.следует.
заключить.в.кавычки..При.этом.все.слова.в.данном.поле.будут.рассматриваться.
как.один.аргумент.
tagit
На.рис..12.2.показан.пример.вывода.из.примера.12.3.
Прежде.чем.отправлять.эти.данные.в.сценарий,.например.в.
weblogfmt.sh
,.кото- рый.их.отформатирует,.их.следует.отфильтровать.и.отсортировать..Для.филь- трации.и.сортировки.данных.можно.воспользоваться.методами,.описанными.
в.главе.7.
190 Часть II • Защитные операции с использованием bash
Рис.
12.2.
Визуализация вывода из weblogf mt.sh
Глава 12. Форматирование и отчетность 191
Создание панели мониторинга
Панели.инструментов.полезны,.если.требуется.отобразить.несколько.блоков.ин- формации,.меняющейся.со.временем..Панель.инструментов,.которую.мы.далее.
рассмотрим,.отобразит.выводы.трех.сценариев.и.станет.обновлять.их.через.равные.
промежутки.времени.
Здесь.используются.графические.функции.окна.терминала..Вместо.того.чтобы.
просто.прокручивать.данные.страницу.за.страницей,.сценарий.каждый.раз.будет.
перерисовывать.экран.с.одной.и.той.же.начальной.позиции,.чтобы.при.перерисовке.
он.полностью.обновлялся.
Чтобы.сценарий.можно.было.переносить.между.различными.программами,.за- пущенными.в.терминале,.нужно.использовать.команду.
tput
,.которая.будет.запра- шивать.последовательность.символов,.выполняющих.графические.функции.для.
открытого.в.данный.момент.окна.программы.
Поскольку.экран.постоянно.«перерисовывается»,.вы.не.можете.просто.переме- ститься.в.верхнюю.часть.экрана.и.восстановить.результат..Почему?.Поскольку.
при.следующей.итерации.могут.быть.отображены.более.короткие.строки,.чем.
в.предыдущем.выводе,.старые.данные.с.экрана.следует.удалить.
Сначала.следует.очистить.экран,.но,.если.на.нем.перед.заполнением.ничего.не.будет.
(например,.из-за.задержек.в.командах,.предоставляющих.вывод.для.отображения),.
этот.эффект.будет.раздражать..В.таком.случае.вы.можете.отправлять.весь.вывод.
через.функцию.(нашей.собственной.разработки),.печатающую.каждую.строку.вы- вода,.и.добавлять.в.конец.каждой.строки.последовательность.символов,.которая.
будет.очищать.каждую.строку.по.ее.окончании,.удаляя.тем.самым.весь.предыду- щий.вывод..Данная.функция.позволит.немного.украсить.вывод,.завершая.каждую.
строку.пунктирной.линией.
В.примере.12.4.показано.создание.экранной.панели.управления,.содержащей.три.
отдельных.раздела.вывода.
Пример 12.4. webdash.sh
#!/bin/bash -
#
# Rapid Cybersecurity Ops
# webdash.sh
#
# Описание:
# Создание информационной панели
192 Часть II • Защитные операции с использованием bash
# Заголовок
# --------------
# Однострочный вывод
# --------------
# Вывод из пяти строк
# ...
# --------------
# Метки столбцов, а затем
# восемь строк гистограммы
# ...
# --------------
#
# некоторые важные постоянные строки
UPTOP=$(tput cup 0 0)
ERAS2EOL=$(tput el)
REV=$(tput rev) # негативное изображение
OFF=$(tput sgr0) # общий сброс
SMUL=$(tput smul) # режим подчеркивания включен (пуск)
RMUL=$(tput rmul) # режим подчеркивания выключен (сброс)
COLUMNS=$(tput cols) # ширина нашего окна
# DASHES(ТИРЕ)='------------------------------------'
printf -v DASHES '%*s' $COLUMNS '-'
DASHES=${DASHES// /-}
#
# prSection – напечатать фрагмент экрана
# напечатать $1-many строк из stdin
# каждая строка представляет собой полную строку текста
# с последующим стиранием до конца строки
# разделы заканчиваются штриховой линией
#
function prSection ()
{
local -i i
for((i=0; i < ${1:-5}; i++))
do read aline printf '%s%s\n' "$aline" "${ERAS2EOL}"
done printf '%s%s\n%s' "$DASHES" "${ERAS2EOL}" "${ERAS2EOL}"
}
function cleanup()
{
if [[ -n $BGPID ]]
then kill %1
rm -f $TMPFILE
fi
} &> /dev/null
Глава 12. Форматирование и отчетность 193
trap cleanup EXIT
# запустить процесс bg
TMPFILE=$(tempfile)
{ bash tailcount.sh $1 | \
bash livebar.sh > $TMPFILE ; } &
BGPID=$!
clear while true do printf '%s' "$UPTOP"
# заголовок:
echo "${REV}Rapid Cyber Ops Ch. 12 -- Security Dashboard${OFF}" \
| prSection 1
#----------------------------------------
{
printf 'connections:%4d %s\n' \
$(netstat -an | grep 'ESTAB' | wc -l) "$(date)"
} | prSection 1
#---------------------------------------- tail -5 /var/log/syslog | cut -c 1-16,45-105 | prSection 5
#----------------------------------------
{ echo "${SMUL}yymmdd${RMUL}" \
"${SMUL}hhmmss${RMUL}" \
"${SMUL}count of events${RMUL}"
tail -8 $TMPFILE
} | prSection 9
sleep 3
done
.Команда.
tput
.предоставляет.независимую.от.терминала.последовательность.
символов,.позволяющую.переместиться.в.левый.верхний.угол.экрана..Чтобы.
не.вызывать.данную.команду.при.каждом.цикле,.мы.вызываем.ее.только.один.раз.
и.сохраняем.вывод.для.повторного.использования.при.каждой.итерации..Далее.
следуют.другие.вызовы.специальных.последовательностей,.сохраненных.для.по- вторного.использования.
.Существует.несколько.способов.создания.пунктирной.линии..Здесь.мы.выбрали.
один,.хоть.немного.и.замысловатый,.но.очень.интересный.вариант..При.этом.двух- этапном.процессе.используется.заполнение.функцией.
printf
.всей.пустой.резуль- тирующей.строки..Символ.
*
.указывает.функции.
printf
.использовать.для.задания.
ширины.отформатированного.поля.первую.переменную..В.результате.получается.
строка.из.49.пробелов.и.одного.знака.минус..Напечатанная.строка.сохраняется.
в.переменной,.заданной.параметром.
-v
..Вторая.часть.создания.пунктирной.линии.
заключается.в.том,.чтобы.заменить.каждый.пробел.знаком.минус.(двойной.слеш.
указывает.bash.заменить.не.только.первое,.но.и.все.остальные.вхождения).
194 Часть II • Защитные операции с использованием bash
.Объявление.в.нашем.сценарии.переменной.
i
.как.локальной.—.хорошая.практика,.
хотя.для.нашего.сценария.это.некритично..Тем.не.менее.так.ваш.цикл.
for
.не.будет.
изменять.какой-либо.другой.индекс.или.счетчик.
.К.каждой.строке,.отправляемой.через.данную.функцию,.мы.добавляем.указание.
erase-to-end-of-line.(«стереть.до.конца.строки»).как.в.текущей,.так.и.в.следующей.
функции.
printf
..После.печати.пунктирной.линии.вторая.функция.
printf
.стирает.
следующую.строку,.где.курсор.будет.находиться.до.следующей.итерации.
.Функция.очистки.вызывается.при.выходе.из.сценария.панели.мониторинга,.
когда.пользователь.для.прерывания.и.выхода.из.сценария.нажмет.сочетание.кла- виш.
Ctrl
+
C
..Как.и.наша.функция.очистки.в.сценарии.
tailcount.sh
.(см..главу.8),.эта.
функция.завершит.работу.функций,.находящихся.в.фоновом.режиме.
.В.отличие.от.предыдущей.версии,.где.системный.вызов.
kill
.отправляет.сигнал.
определенному.процессу,.здесь.мы.используем.нотацию.
%1
,.чтобы.дать.системному.
вызову.
kill
.указание,.согласно.которому.сигнал.должен.быть.передан.всем.процес- сам,.запущенным.в.результате.работы.процесса.в.фоновом.режиме..Все.эти.процессы.
считаются.частью.одной.и.той.же.«работы»..Их.рабочие.номера.(
%1
,.
%2
,.
%3
.и.т..д.).
определяются.порядком.их.размещения.в.фоновом.режиме..В.этом.сценарии.у.нас.
есть.только.один.фоновый.процесс.
.Мы.перенаправляем.вывод.в.функцию.
clear
.таким.образом,.что.все.выходные.
данные,.поступающие.из.stdout.или.stderr,.будут.отброшены..Такая.очистка.гаран- тирует.отсутствие.любых.неожиданных.сообщений,.хотя.ничего.подобного.мы.и.не.
ожидаем.(это.плохо.для.отладки,.но.экран.будет.намного.чище).
.Команда.
tempfile
.генерирует.уникальное.имя.и.проверяет,.не.используется.ли.
оно.в.данный.момент..В.результате.нам.будет.известно,.что,.независимо.от.количе- ства.запущенных.экземпляров.сценария.и.расположенных.рядом.других.файлов,.
для.этого.сценария.рабочий.файл.будет.доступен..В.функции.
clear
.есть.код,.уда- ляющий.данный.файл.при.каждом.выходе.из.сценария.
.Эта.строка.запускает.два.сценария,.которые.описаны.в.главе.8..Данные.сценарии.
подсчитывают.строки,.добавляемые.в.конце.файла..Фигурные.скобки.группируют.
все.процессы.этого.конвейера.команд.вместе.и.помещают.в.«фон»,.отключая.их.от.
ввода.с.клавиатуры..Эти.процессы.и.все,.что.они.создали,.являются.частью.зада- ния.1.(
%1
),.то.есть.задания,.работу.которого.прекратит.функция.
clear
.Каждый.раздел.вывода.отправляется.отдельно.в.функцию.
prSection
..Команды.
для.раздела.не.нужно.группировать.внутри.фигурных.скобок,.если.для.этого.
раздела.одна.команда.генерирует.вывод..Это.относится.к.первым.трем.разделам,.
Глава 12. Форматирование и отчетность 195
но.четвертому.разделу.для.группировки.двух.операторов.(
echo
.и.
tail
),.записы- вающих.вывод,.требуются.скобки..Во.втором.разделе.фигурные.скобки.хотя.и.не.
нужны,.но.предусмотрены.в.случае,.если.мы.когда-нибудь.захотим.расширить.этот.
раздел.и.иметь.разные.выходные.данные..Команды.для.раздела.не.нужно.группи- ровать.внутри.фигурных.скобок,.если.одна.команда.генерирует.вывод..Для.всех.
остальных.разделов.в.качестве.меры.предосторожности.при.расширении.можно.
сделать.то.же.самое..Обратите.внимание.на.небольшую.разницу.в.синтаксисе.
между.использованием.фигурных.скобок.в.этой.и.предыдущей.строке.с.пометкой..
Нам.не.нужна.точка.с.запятой,.потому.что.мы.помещаем.закрывающую.скобку.на.
новую.строку.
На.рис..12.3.показан.пример.вывода.сценария.панели.управления.
Рис. 12.3. Вывод на панели управления
Выводы
Полученные.ранее.данные.принесут.пользу.только.в.том.случае,.если.будут.удоб- ны.для.чтения.пользователю,.которому.эта.информация.предназначалась..HTML.
предоставляет.простой.способ.форматирования.данных.для.отображения.на.экране.
или.для.печати..Панель.мониторинга,.созданная.в.этой.главе,.может.быть.особенно.
полезной.при.отслеживании.информации.в.режиме.реального.времени.
В.следующей.главе.мы.рассмотрим,.как.командная.строка.и.bash.могут.помочь.вам.
выполнить.тестирование.на.проникновение.
196 Часть II • Защитные операции с использованием bash
Упражнения
1.. Измените.сценарий.
webdash.sh
.так,.чтобы.захватить.два.аргумента.командной.
строки,.определяющие.записи.журнала,.используемого.для.мониторинга..На- пример:
./webdash.sh /var/log/apache2/error.log /var/log/apache2/access.log
2.. Напишите.сценарий,.подобный.примеру.12.3,.который.преобразует.журнал.
ошибок.Apache.в.HTML-код.
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
Часть III
Тестирование на проникновение
Пусть.планы.твои.пребывают.во.тьме,.
непроницаемые,.словно.ночь,.так,.
чтобы,.когда.ты.двинешь.свои.силы,.они.
обрушились.подобно.молнии
1
Сунь-цзы. Искусство войны
В.части.III.мы.рассмотрим.использование.командной.строки.
во.время.тестов.на.проникновение,.чтобы.проводить.разведку,.
выявлять.уязвимости.и.предоставлять.удаленный.доступ.
1.
Оригинальная.цитата:.Let.your.plans.be.dark.and.impenetrable.as.night,.and.when.you.move,.
fall.like.a.thunderbolt.
13
Разведка
Разведка.—.это,.как.правило,.первый.шаг.при.тестировании.на.проникновение..
Основная.задача.данного.этапа.—.используя.все.доступные.ресурсы,.собрать.как.
можно.больше.информации.о.цели..Нас.интересуют.такие.сведения,.как.имена,.
адреса.электронной.почты.и.номера.телефонов,.пространство.IP-адресов,.открытые.
сетевые.порты.и.используемое.программное.обеспечение.
Используемые команды
В.этой.главе.мы.познакомимся.с.командой.
ftp ftp
Команда.
ftp
.предназначена.для.передачи.файлов.на.FTP-сервер.и.обратно.
Общие параметры команды
-n
.—.запретить.автоматический.вход.на.сервер.
Пример команды
Для.подключения.к.FTP-серверу.с.IP-адресом.192.168.0.125.напишите.следующее:
ftp 192.168.0.125
По.умолчанию.команда.
ftp
.попытается.подключиться.через.TCP-порт.21..Если.вы.
хотите.подключиться.через.другой.порт,.укажите.номер,.введя.его.после.IP-адреса.
хоста..Например,.подключимся.к.порту.50:
ftp 192.168.0.125 50
После.подключения.к.FTP-серверу.для.отправки.и.получения.файлов.используйте.
интерактивные.команды..Чтобы.вывести.список.каталогов,.введите.команду.
ls
;.
Глава 13. Разведка 199
для.перехода.из.каталога.в.каталог.воспользуйтесь.командой.
cd
;.для.передачи.
файлов.на.FTP-сервер.применяется.команда.
put
,.а.для.передачи.файлов.с.FTP- сервера.—.команда.
get
Просмотр веб-сайтов
Для.копирования.веб-страницы.из.сети.можно.использовать.команду.
curl
Она.проста.в.использовании,.но.имеет.множество.дополнительных.параметров,.
предоставляющих.возможность.обработки.удаленной.аутентификации.и.сеан- совых.файлов.cookie..Обычно.вместе.с.командой.
curl
.используется.параметр.
-L
,.
позволяющий.команде.следовать.перенаправлениям.HTTP.при.изменении.место- положения.страницы..По.умолчанию.
curl
.будет.выводить.необработанный.HTML- код.в.stdout..Но.вывод.с.помощью.параметра.
-o
.можно.перенаправить.в.файл:
curl -L -o output.html https://www.oreilly.com
Параметр.
-I
.позволит.команде.
curl
.получать.только.HTTP-заголовки,.а.все.осталь- ное.содержимое.страницы.игнорировать..Это.может.быть.полезно.при.попытке.
идентификации.версии.веб-сервера.или.операционной.системы..В.приведенном.
ниже.примере.можно.увидеть,.что.сервер.использует.Apache.2.4.7.и.операционную.
систему.Ubuntu:
$ curl -LI https://www.oreilly.com
HTTP/1.1 200 OK
Server: Apache/2.4.7 (Ubuntu)
Last-Modified: Fri, 19 Oct 2018 08:30:02 GMT
Content-Type: text/html
Cache-Control: max-age=7428
Expires: Fri, 19 Oct 2018 16:16:48 GMT
Date: Fri, 19 Oct 2018 14:13:00 GMT
Connection: keep-alive
Вы хотите узнать, доступен ли сайт? Перехватите заголовок с помощью curl, а затем для поиска кода состояния HTTP 200 используйте команду grep:
$ curl -LIs https://www.oreilly.com | grep '200 OK'
HTTP/1.1 200 OK
К.сожалению,.
curl
.может.извлекать.только.указанную.страницу.и.не.имеет.функ- ций.просмотра.содержимого.всего.сайта.или.перехода.по.ссылкам.на.странице.
200 Часть III • Тестирование на проникновение
WGET
Команда.
wget
.также.предназначена.для.загрузки.веб-страниц,.но.по.умолчанию.во.
многих. дистрибутивах.Linux. она. не. установлена..В. Git. Bash. эта. команда. тоже. от- сутствует..Чтобы.установить.
wget
.в.дистрибутив.Linux.на.основе.Debian,.выполните.
следующие.действия:
sudo apt-get install wget
Одно.из.главных.преимуществ.
wget
.перед.
curl
.в.том,.что.
wget
.позволяет.зеркально.
отображать.или.копировать.весь.веб-сайт,.а.не.просто.получить.одну.страницу.или.
файл..При.использовании.зеркального.режима.
wget
.будет.сканировать.сайт.по.ссыл- кам.и.загружать.содержимое.каждой.найденной.страницы.в.указанный.каталог:
wget -p -m -k -P ./mirror https://www.digadel.com
Параметр.
-p
.используется.для.загрузки.файлов,.связанных.с.веб-сайтом,.таких.как.
каскадные.таблицы.стилей.(CSS).и.файлы.изображений;.параметр.
-m
.включает.ре- жим. зеркального. отображения,. параметр.
-k
. преобразует. ссылки. на. загруженные.
страницы.в.локальные.пути;.а.параметр.
-P
.указывает.путь.(то.есть.каталог),.в.кото- ром.сохраняется.зеркальный.веб-сайт.
Автоматический захват баннера
При.подключении.к.серверу.иногда.появляется.информация.о.приложении.веб- сервиса.или.об.операционной.системе.—.баннер..При.подключении.к.веб-серверу.
O’Reilly.в.заголовке.HTTP.можно.увидеть.такой.баннер.операционной.системы:
HTTP/1.1 200 OK
Server: Apache/2.4.7 (Ubuntu)
Last-Modified: Fri, 19 Oct 2018 08:30:02 GMT
Content-Type: text/html
Cache-Control: max-age=7428
Expires: Fri, 19 Oct 2018 16:16:48 GMT
Date: Fri, 19 Oct 2018 14:13:00 GMT
Connection: keep-alive
Ценной.считается.информация.о.том,.в.какой.операционной.системе.работает.по- тенциальная.цель..Получив.эту.информацию,.вы.можете.узнать,.какие.уязвимости.
могут.существовать.в.данной.системе..Впоследствии.эти.уязвимости.можно.ис- пользовать.на.начальном.этапе.жизненного.цикла.атаки.
Баннеры.обычно.отображают.несколько.типов.систем,.включая.веб-серверы,.FTP- серверы.и.серверы.протокола.SMTP.(Simple.Mail.Transfer.Protocol)..В.табл..13.1.
показаны.сетевые.порты,.которые.обычно.используются.этими.службами.
Глава 13. Разведка 201
Таблица 13.1. Стандартные порты
Протокол сервера
Номер порта
FTP
TCP.21
SMTP
TCP.25
HTTP
TCP.80
В большинстве операционных систем баннер может быть изменен системным администратором. Баннер можно удалить полностью либо заставить его сооб- щать ложную информацию. Его также можно рассматривать как индикатор типа операционной системы или приложения, но полностью ему доверять нельзя.
В.главе.9.мы.рассматривали,.как.с.помощью.сценария.
scan.sh
.сканировать.сетевой.
порт..Этот.сценарий.можно.расширить.таким.образом,.что.при.каждом.обнаруже- нии.узла.с.одним.из.открытых.портов.(FTP,.SMTP.или.HTTP).он.будет.пытаться.
получить.и.сохранить.баннер.сервера.
Вы.уже.видели,.как.можно.использовать.команду.
curl
.для.захвата.заголовка.
HTTP,.который.может.содержать.баннер:
curl -LI https://www.oreilly.com
Для.захвата.баннера.с.FTP-сервера.можно.использовать.команду.
ftp
:
$ ftp -n 192.168.0.16
Connected to 192.168.0.16.
220 (vsFTPd 3.0.3)
ftp>
Параметр.
-n
.применяется,.чтобы.команда.
ftp
.не.пыталась.автоматически.войти.
на.сервер..Чтобы.после.подключения.закрыть.FTP-соединение,.с.терминала.
ftp>
введите.команду.
quit
Самый.простой.способ.перехватить.баннер.с.SMTP-сервера.—.использовать.
команду.
telnet
.с.сетевым.портом.
25
:
$ telnet 192.168.0.16 25
Connected to 192.168.0.16
Escape character is '^]'.
220 localhost.localdomain ESMTP Postfix (Ubuntu)
202 Часть III • Тестирование на проникновение
Команда.
telnet
.доступна.в.большинстве.версий.Linux,.но.в.Git.Bash.и.во.многих.
версиях.Windows.она.отсутствует..В.этих.случаях,.чтобы.получить.аналог.коман- ды.
telnet
,.вы.можете.написать.небольшой.сценарий,.используя.дескриптор.bash.
/dev/tcp
В.примере.13.1.показано,.как.для.подключения.к.SMTP-серверу.и.захвата.баннера.
использовать.файловый.дескриптор.bash.TCP.
Пример 13.1. smtpconnect.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# smtpconnect.sh
#
# Описание:
# Подключение к SMTP-серверу и печать приветственного баннера
#
# Использование:
# smtpconnect.sh1 ... 13 14 15 16 17 18 19 20 ... 23
.—.для.
создания.маркированного.
.Тег.