Файл: Paul Troncone and Carl AlbingCybersecurity Ops with bashAttack, Defend, and Analyze from the.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 455
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
266 Часть IV • Администрирование систем обеспечения безопасности
Реализация
Для.определения.операционной.системы.мы.могли.бы.использовать.сценарий,.
показанный.в.примере.2.3..Но,.кроме.типа.операционной.системы,.при.работе.
в.Linux.нам.необходимо.определить.дистрибутив.Linux..Некоторые.из.этих.дис- трибутивов.основаны.на.Debian.и.используют.его.систему.управления.пакетами..
Другие.предусматривают.иной.подход.с.соответствующим.набором.инструментов..
Мы.просто.посмотрим,.существует.ли.в.нашей.системе.определенный.исполня- емый.файл,.и.если.это.так,.выведем.соответствующий.тип.операционной.системы.
(пример.20.1).
Пример 20.1. softinv.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# softinv.sh
#
# Описание:
# Перечисление установленного в системе программного обеспечения
# для последующего агрегирования и анализа
#
# Использование: ./softinv.sh [filename]
# вывод записывается в $1 или 1ms>
1 ... 15 16 17 18 19 20 21 22 23
#
# задаем имя файла вывода
OUTFN="${1:-${HOSTNAME}_softinv.txt}"
# какая команда будет запущена, зависит от типа и дистрибутива ОС
OSbase=win type -t rpm &> /dev/null
(( $? == 0 )) && OSbase=rpm
type -t dpkg &> /dev/null
(( $? == 0 )) && OSbase=deb type -t apt &> /dev/null
(( $? == 0 )) && OSbase=apt case ${OSbase} in
win)
INVCMD="wmic product get name,version //format:csv"
;;
rpm)
INVCMD="rpm -qa"
;;
deb)
INVCMD="dpkg -l"
;;
apt)
Глава 20. Инструмент: проверка установленного программного обеспечения 267
INVCMD="apt list --installed"
;;
*)
echo "error: OSbase=${OSbase}"
exit -1
;;
esac
#
# запустить проверку
#
$INVCMD 2>/dev/null > $OUTFN
.Сначала.мы.даем.определение.файлу.вывода..Если.при.вызове.этого.сценария.
пользователь.указал.аргумент.(в.нашем.случае.это.
$1
),.он.будет.задан.в.имени.
файла.вывода..Если.нет,.по.умолчанию.будет.использовано.определенное.обо- лочкой.имя.
$HOSTNAME
,.к.которому.мы.добавим.оставшийся.текст.(
_softinv.txt
).
.Здесь.мы,.отбрасывая.и.stdout,.и.stderr,.проверяем,.доступен.ли.конкретный.ин- струмент.управления.пакетами:.только.после.получения.результата.(успех/неуда- ча).принимается.решение.о.том,.существует.ли.в.этой.системе.данный.инструмент.
.Оболочка.bash.помещает.полученное.значение.предыдущей.команды.в.
$?
,.
и.только.после.этого.проводится.сравнение..Если.значение.равно.
0
,.значит,.коман- да.выполнена.успешно..В.этом.случае.мы.присваиваем.значение.
OSbase
,.чтобы.
запомнить,.какой.дистрибутив.(или.версию.Windows).используем..Мы.делаем.
это.для.каждого.применяемого.инструмента.
.С.помощью.оператора.
case
.можем.выбрать,.какую.команду.будем.выполнять.
для.сбора.нужной.информации,.включая.все.аргументы.
.В.этой.части.сценария.выполняется.настоящая.работа:.команда.запускается,.и.ее.
вывод.направляется.в.файл.
Определение остального программного обеспечения
При.просмотре.списка.файлов.с.помощью.
apt
,.
dpkg
,.
wmic
.или.
yum
.будет.об- наружено.только.то.программное.обеспечение,.что.установлено.с.помощью.
менеджера.пакетов..Если.программное.обеспечение.—.это.исполняемый.файл,.
который.был.скопирован.в.систему,.не.попав.в.менеджер.пакетов,.он.не.будет.
виден..Трудно.определить.программное.обеспечение,.которое.таким.образом.
было.введено.в.систему,.но.все-таки.некоторые.методы.для.обнаружения.таких.
файлов.существуют.
268 Часть IV • Администрирование систем обеспечения безопасности
В.операционных.системах.Linux.исполняемые.файлы.в.основном.хранятся.в.ката- логах.
/bin
.и.
/usr/bin
..Сначала.нужно.просмотреть.эти.каталоги..Переменная.
$PATH
,.
определяемая.пользователем,.указывает.оболочке,.где.искать.исполняемые.файлы..
Вы.можете.перечислить.в.
$PATH
.каждый.из.этих.каталогов.(разделяя.двоеточием)..
Конечно,.любой.пользователь.может.установить.свое.собственное.значение.для.
$PATH
,.но.было.бы.разумнее.использовать.один.базовый.корневой.каталог.
В.операционной.системе.Windows.наиболее.очевидным.методом.станет.поиск.
файлов.с.расширением.
.exe
..Такой.поиск.можно.выполнить.с.помощью.команды.
find
:.
find /c -type f -name '*.exe'
Этот.метод.работает.только.в.том.случае,.если.файл.имеет.расширение.
.exe
..Однако.
расширение.можно.легко.изменить..Для.более.надежного.определения.исполняемых.
файлов.стоит.выполнить.поиск.с.помощью.файла.
typesearch.sh
.из.примера.5.4.
Сначала.необходимо.определить.вывод.команды.
file
.для.исполняемых.файлов.
Windows.и.Linux..Ниже.приведен.вывод.для.исполняемого.файла.Windows:
winexample.exe: PE32 executable (GUI) Intel 80386, for MS Windows
Далее.показан.вывод.исполняемого.файла.Linux:
nixexample.exe: ELF 64-bit LSB executable, x86-64, version 1 (SYSV)
Слово.
executable
.мы.видим.в.выводе.для.обоих.файлов..Для.поиска.этого.слова.
можно.использовать.сценарий.
typesearch.sh
,.хотя.в.этом.случае.есть.риск.полу- чить.ложные.срабатывания,.если.поисковый.запрос.будет.обширным.
Чтобы.использовать.сценарий.
typesearch.sh
.для.поиска.исполняемых.файлов,.
введите.следующее:
$ ./typesearch.sh -i executable .
./nixexample.exe
./winexample.exe
./typesearch.sh
Обратите.внимание,.что.сценарий.
typesearch.sh
.для.bash.также.выбран,.так.как.
он.содержит.исполняемый.код.
Последний.вариант.—.поиск.файлов,.для.которых.установлено.разрешение.на.вы- полнение..Это.не.значит,.что.данный.файл.исполняемый,.но.лучше.продолжить.
проверку.и.таких.файлов.
Чтобы.найти.файлы.с.разрешениями.на.выполнение.в.Linux,.введите.такую.команду:
find / -perm /111
Глава 20. Инструмент: проверка установленного программного обеспечения 269
В.среде.Windows.этот.метод.менее.действенен.из-за.способа.обработки.прав.до- ступа..Для.каждого.файла.владельцами.часто.устанавливаются.полные.права.
(включая.выполнение),.что.при.поиске.на.основе.прав.доступа.может.привести.
к.большому.количеству.ложных.срабатываний.
Выводы
Определение.программного.обеспечения,.установленного.в.системах,.—.важный.
шаг.к.пониманию.текущего.состояния.вашей.среды.
После.того.как.вы.провели.обзор.программного.обеспечения,.для.агрегирования.
и.анализа.данных.можете.использовать.методы,.представленные.в.главах.6.и.7.
Далее.мы.разработаем.инструмент.для.проверки.текущей.конфигурации.системы.
Упражнения
Попробуйте.расширить.и.настроить.функции.сценария.
softinv.sh
,.добавив.сле- дующие.возможности.
1.. Измените.сценарий.таким.образом,.чтобы,.если.аргументом.является.символ.
-
,.
вывод.записывался.в.stdout..(Можете.ли.вы.это.написать.одной.строкой?)
2.. Для.дистрибутивов.Linux.измените.сценарий.так,.чтобы.просмотреть.содержи- мое.каталогов.
/bin
.и.
/usr/bin
.с.помощью.команды.
ls
3.. Добавьте.функцию,.которая.с.помощью.SSH.автоматически.загружает.файл.
вывода.в.центральный.репозиторий..Для.управления.аутентификацией.можете.
создать.ключ.SSH.
4.. Добавьте.функцию,.которая.будет.сравнивать.предыдущий.список.установ- ленного.программного.обеспечения.(содержащегося.в.файле).с.текущим.про- граммным.обеспечением.и.выводить.информацию.о.любых.различиях.
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
21
Инструмент: проверка конфигурации
Для.системного.администратора.или.специалиста.по.безопасности.полезно.иметь.
инструмент,.который.позволит.проверить.текущую.конфигурацию.системы,.напри- мер.существующие.файлы,.значения.реестра.или.учетные.записи.пользователей..
В.дополнение.к.проверке.конфигурации.этот.инструмент.может.использоваться.
в.качестве.облегченной.системы.обнаружения.вторжений..Для.этого.следует.
сравнить.запись.базовой.конфигурации.с.текущим.состоянием.системы.и.выявить.
изменения..Вы.также.можете.использовать.его.для.поиска.конкретных.данных,.со- держащихся.в.записях.или.файлах.системного.журнала,.несущих.угрозу.для.работы.
системы.или.сети.(индикаторов.компрометации).
В.этой.главе.мы.разработаем.инструмент.для.чтения.ряда.конфигураций,.хра- нящихся.в.текстовом.файле..При.этом.нам.нужно.проверить,.есть.ли.этот.файл,.
заданы.ли.права.на.его.чтение.и.существует.ли.данная.конфигурация.в.системе..
Этот.инструмент.предназначен.для.работы.в.операционной.системе.Windows,.но.
его.можно.легко.изменить.для.работы.в.Linux.
Реализация
Сценарий.
validateconfig.sh
.проверяет.следующее:
наличие.или.отсутствие.файла;
хеш.SHA-1.файла;
значение.раздела.реестра.Windows;
наличие.или.отсутствие.пользователя.или.группы.
В.табл..21.1.показан.синтаксис.файла.конфигурации,.который.будет.считан.сце- нарием.
Глава 21. Инструмент: проверка конфигурации 271
Таблица 21.1. Формат файла проверки
Значение
Формат
Наличие.файла file.<_file.path_>
Отсутствие.файла
!.file.<_file.path_>
Хеш.файла hash.<_sha1.hash_>.<_file.path_>
Значение.раздела.реестра reg."<_key.path_>"."<_value_>"."<_expected_>"
Наличие.пользователя user.<_user.id_>
Отсутствие.пользователя
!user.<_user.id_>
Наличие.группы group.<_group.id_>
Отсутствие.группы
!.group.<_group.id_>
В.примере.21.1.показан.образец.файла.конфигурации.
Пример 21.1. validconfig.txt user jsmith file "c:\windows\system32\calc.exe"
!file "c:\windows\system32\bad.exe"
Сценарий.в.примере.21.2.считывает.ранее.созданный.файл.конфигурации.и.под- тверждает,.что.данная.конфигурация.в.системе.существует.
Пример 21.2. validateconfig.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# validateconfig.sh
#
# Описание:
# Проверка наличия указанной конфигурации
#
# Использование:
# validateconfig.sh < configfile
#
# спецификация конфигурации выглядит так:
# [[!]file|hash|reg|[!]user|[!]group] [args]
# примеры:
# file /usr/local/bin/sfx - файл существует
# hash 12384970347 /usr/local/bin/sfx - это хеш файла
# !user bono - нет разрешенного пользователя "bono"
# group students - должна быть группа students
#
# errexit - показать правильное использование и выйти
272 Часть IV • Администрирование систем обеспечения безопасности function errexit ()
{
echo "invalid syntax at line $ln"
echo "usage: [!]file|hash|reg|[!]user|[!]group [args]"
exit 2
} # errexit
# vfile - проверка наличия имени файла
# аргументы: 1: флаг "нет" - значение:1/0
# 2: имя файла
#
function vfile ()
{
local isThere=0
[[ -e $2 ]] && isThere=1
(( $1 )) && let isThere=1-$isThere
return $isThere
} # vfile
# проверить идентификатор пользователя function vuser ()
{
local isUser
$UCMD $2 &>/dev/null isUser=$?
if (( $1 ))
then let isUser=1-$isUser fi return $isUser
} # vuser
# проверить идентификатор группы function vgroup ()
{
local isGroup id $2 &>/dev/null isGroup=$?
if (( $1 ))
then let isGroup=1-$isGroup fi return $isGroup
} # vgroup
Глава 21. Инструмент: проверка конфигурации 273
# проверить хеш файла function vhash ()
{
local res=0
local X=$(sha1sum $2)
if [[ ${X%% *} == $1 ]]
then res=1
fi return $res
} # vhash
# проверить системный реестр windows function vreg ()
{
local res=0
local keypath=$1
local value=$2
local expected=$3
local REGVAL=$(query $keypath //v $value)
if [[ $REGVAL == $expected ]]
then res=1
fi return $res
} # vreg
#
# main
#
# выполнить один раз, чтобы использовать в проверке идентификаторов пользователей
UCMD="net user"
type -t net &>/dev/null || UCMD="id"
ln=0
while read cmd args do let ln++
donot=0
if [[ ${cmd:0:1} == '!' ]]
then donot=1
basecmd=${cmd#\!}
fi
274 Часть IV • Администрирование систем обеспечения безопасности case "$basecmd" in file)
OK=1
vfile $donot "$args"
res=$?
;;
hash)
OK=1
# разделить аргументы на первое слово и остаток vhash "${args%% *}" "${args#* }"
res=$?
;;
reg)
# Только для Windows!
OK=1
vreg $args res=$?
;;
user)
OK=0
vuser $args res=$?
;;
group)
OK=0
vgroup $args res=$?
;;
*) errexit
;;
esac if (( res != OK ))
then echo "FAIL: [$ln] $cmd $args"
fi done
.
errexit
.—удобная.вспомогательная.функция,.предоставляющая.пользователю.
некоторую.полезную.информацию.о.правильном.использовании.сценария,.—.с.по- следующим.завершением.работы,.если.появится.значение.ошибки..Синтаксис,.
используемый.в.сообщении.
usage
,.—.это.типичный.*nix-синтаксис:.элементы,.
разделенные.вертикальной.линией,.—.варианты;.элементы.в.квадратных.скобках.
являются.необязательными.
.Для.проверки.существования.файла.используется.
if-less
-оператор.
f
.Это.простой.способ.переключения.1.на.0.или.0.на.1.при.условии,.что.первый.
аргумент.не.равен.нулю.
Глава 21. Инструмент: проверка конфигурации 275
.Здесь.для.переключения.используется.удобочитаемый,.но.более.громоздкий.
оператор.
if
.После.запуска.команды.
sha1sum
.вывод.будет.сохранен.в.переменной.
X
..Вывод.
состоит.из.двух.«слов»:.хеш-значения.и.имени.файла.
.Чтобы.проверить,.совпадают.ли.значения.хеш-функции,.нам.нужно.из.вывода.
команды.
sha1sum
.удалить.имя.файла.и.второе.слово..
%%
.означает.самое.длинное.
возможное.совпадение.
.Команда.
type
.проинформирует.нас.о.существовании.команды.
net
;.если.команда.
net
.не.будет.найдена,.вместо.нее.используем.команду.
id
.Напоминание:.эта.строка.принимает.подстроку.
cmd
,.начинающуюся.в.позиции.
0
и.принимающую.только.один.символ;.то.есть.это.первый.символ.подстроки.
cmd
Это.восклицательный.знак?.Данный.символ.часто.используется.в.программиро- вании.для.обозначения.«нет».
.Нам.нужно.удалить.символ.восклицательного.знака.из.названия.команды.
.Как.уже.было.сказано.в.комментарии,.так.вызывается.наша.функция.
vhash
,.
аргумент.делится.на.две.части.—.первое.слово.и.остаток.
.Оператор.
case
.в.bash.в.отдельных.случаях.позволяет.сопоставлять.шаблоны.
между.собой..Общим.шаблоном.является.звездочка,.соответствующая.любой.
строке,.она.применяется.как.крайний.вариант,.чтобы.выполнить.действие.по.
умолчанию..Он.будет.использоваться,.если.остальные.шаблоны.не.будут.найдены..
Если.входные.данные.не.соответствуют.ни.одному.из.вариантов,.значит,.это.не- правильные.входные.данные..В.этом.случае.для.окончания.работы.мы.вызываем.
функцию.
errexit
Выводы
Сценарий.
validateconfig.sh
.позволяет.проверить,.существует.ли.в.системе.опре- деленная.конфигурация..Это.полезно.для.проверки.соответствия,.а.также.для.
понимания.того,.есть.ли.в.системе.вредоносные.программы.или.следы.вторжения..
Следы.вторжения.или.наличие.вредоносных.программ.выявляются.в.процессе.
поиска.конкретных.индикаторов.компрометации.
YARA является отличным источником индикаторов компрометации на основе хоста. Чтобы узнать больше, посетите сайт YARA: http://bit.ly/2FEsDPx.
276 Часть IV • Администрирование систем обеспечения безопасности
В.следующей.главе.мы.рассмотрим.аудит.учетных.записей.и.учетных.данных.поль- зователей,.чтобы.определить,.были.ли.они.скомпрометированы.
Упражнения
Попробуйте.расширить.и.настроить.функции.сценария.
validateconfig.sh
,.добавив.
следующие.возможности.
1.. Проверить,.существуют.ли.определенные.права.доступа.к.файлу.
2.. Проверить,.открыт.или.закрыт.конкретный.сетевой.порт.
3.. Проверить,.выполняется.ли.определенный.процесс.
4.. Предоставить.возможность.оставлять.комментарии.во.входном.потоке..Если.
первый.символ.считанной.строки.является.хештегом,.строка.отбрасывается.
(то.есть.ничего.не.обрабатывается).
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/
22
Инструмент: аудит учетных записей
Обычно.пользователи.и.организации.постоянно.проверяют.свои.учетные.записи,.что- бы.узнать,.были.ли.в.рамках.известной.утечки.данных.взломаны.их.адреса.электрон- ной.почты.или.пароли..Это.важно,.поскольку,.если.адрес.электронной.почты.украден,.
его.можно.использовать.в.рамках.фишинговой.кампании..Опасность.возрастает,.если.
при.этом.была.украдена.и.другая.идентифицирующая.информация..Украденные.
пароли.обычно.попадают.в.словари.паролей.и.хешей..Если.вы.продолжаете.исполь- зовать.пароль,.который.был.украден.во.время.взлома.(даже.если.он.не.был.связан.
с.вашей.учетной.записью),.это.делает.вашу.учетную.запись.более.уязвимой.для.атак.
В.этой.главе.для.аудита.учетных.записей.пользователей.мы.используем.сайт.Have.
I.Been.Pwned?.(
https://haveibeenpwned.com/
)..Ниже.перечислены.требования.к.ин- струменту:
выполнить.запрос.
haveibeenpwned.com
,.чтобы.проверить,.связан.ли.пароль.с.из- вестным.нарушением;
выполнить.запрос.
haveibeenpwned.com
,.чтобы.проверить,.связан.ли.адрес.элек- тронной.почты.с.известным.нарушением.
Меня взломали?
Сайт.
https://haveibeenpwned.com
.—.онлайн-сервис,.позволяющий.пользователям.опре- делять,.были.ли.во.время.существенного.взлома.данных.украдены.адреса.электрон- ной.почты.или.пароли..Сайт.имеет.RESTful.API,.который.позволяет.отправлять.за- прос.к.базе.данных,.используя.хеш.SHA-1.пароля.или.адрес.электронной.почты..Это.
не.требует.от.вас.регистрации.или.использования.ключа.API,.но.с.одного.и.того.же.
IP-адреса.не.получится.делать.запросы.быстрее.чем.один.раз.в.1500.миллисекунд.
Полную документацию по API можно найти на веб-странице API v2 (http://
bit.ly/2FDpHSY).
278 Часть IV • Администрирование систем обеспечения безопасности
Проверяем, не взломан ли пароль
Следующий.URL-адрес.используется.для.запроса.информации.о.пароле:
https://api.pwnedpasswords.com/range/
По.соображениям.безопасности.сайт.Have.I.Been.Pwned?.не.принимает.необ- работанные.пароли..Пароли.должны.быть.предоставлены.в.виде.частичного.
хеша.SHA-1..Например,.хешем.SHA-1.пароля.
password
.будет.строка.такого.
вида:.
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
..Для.завершения.запроса.
используются.первые.пять.шестнадцатеричных.символов.хеша:
https://api.pwnedpasswords.com/range/5baa6
Have.I.Been.Pwned.возвращает.список.всех.хеш-значений,.начинающихся.с.этих.
пяти.символов..Это.делается.в.целях.безопасности,.так.что.Have.I.Been.Pwned?.
или.тот,.кто.наблюдает.за.вашим.взаимодействием,.не.знает.точный.хеш.пароля,.
который.вы.запрашиваете..После.того.как.у.вас.появится.список.запрашиваемых.
хешей,.вы.можете.выполнить.поиск.хеша.своего.пароля,.используя.его.последние.
35.шестнадцатеричных.символов..Если.хеш.вашего.пароля.есть.в.списке,.значит,.
пароль.был.взломан..В.противном.случае.пароль,.скорее.всего,.безопасен:
1CC93AEF7B58A1B631CB55BF3A3A3750285:3 1D2DA4053E34E76F6576ED1DA63134B5E2A:2 1D72CD07550416C216D8AD296BF5C0AE8E0:10 1E2AAA439972480CEC7F16C795BBB429372:1 1E3687A61BFCE35F69B7408158101C8E414:1
1 ... 15 16 17 18 19 20 21 22 23
1E4C9B93F3F0682250B6CF8331B7EE68FD8:3533661
20597F5AC10A2F67701B4AD1D3A09F72250:3 20AEBCE40E55EDA1CE07D175EC293150A7E:1 20FFB975547F6A33C2882CFF8CE2BC49720:1
Число,.которое.вы.видите.в.каждой.строке.справа.после.двоеточия,.указывает.общее.
количество.взломанных.учетных.записей,.в.которых.использовался.данный.пароль..
Неудивительно,.что.пароль.
password
.применялся.во.многих.учетных.записях.
В.примере.22.1.показано,.как.с.помощью.bash.и.команды.
curl
.можно.автоматизи- ровать.этот.процесс.
Пример 22.1. checkpass.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# checkpass.sh
#
# Описание:
# Проверка пароля на соответствие
20597F5AC10A2F67701B4AD1D3A09F72250:3 20AEBCE40E55EDA1CE07D175EC293150A7E:1 20FFB975547F6A33C2882CFF8CE2BC49720:1
Число,.которое.вы.видите.в.каждой.строке.справа.после.двоеточия,.указывает.общее.
количество.взломанных.учетных.записей,.в.которых.использовался.данный.пароль..
Неудивительно,.что.пароль.
password
.применялся.во.многих.учетных.записях.
В.примере.22.1.показано,.как.с.помощью.bash.и.команды.
curl
.можно.автоматизи- ровать.этот.процесс.
Пример 22.1. checkpass.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# checkpass.sh
#
# Описание:
# Проверка пароля на соответствие
Глава 22. Инструмент: аудит учетных записей 279
# базе данных сайта Have I Been Pwned?
#
# Использование: ./checkpass.sh [
]
#
Пароль для проверки
# по умолчанию: читать из stdin
#
if (( "$#" == 0 ))
then printf 'Enter your password: '
read -s passin
echo else passin="$1"
fi passin=$(echo -n "$passin" | sha1sum)
passin=${passin:0:40}
firstFive=${passin:0:5}
ending=${passin:5}
pwned=$(curl -s "https://api.pwnedpasswords.com/range/$firstFive" | \
tr -d '\r' | grep -i "$ending" )
passwordFound=${pwned##*:}
if [ "$passwordFound" == "" ]
then exit 1
else printf 'Password is Pwned %d Times!\n' "$passwordFound"
exit 0
fi
.Здесь.проверяется,.был.ли.пароль.передан.в.качестве.аргумента..Если.нет,.поль- зователю.будет.предложено.ввести.пароль.
.Чтобы.не.показывать.вводимые.пользователем.данные,.для.команды.
read
.задан.
параметр.
-s
..Это.рекомендуется.делать.при.запросе.паролей.или.другой.конфиден- циальной.информации..При.использовании.параметра.
-s
.при.нажатии.клавиши.
Enter
.новая.строка.не.появится..Поэтому.после.оператора.
read
.мы.добавляем.пустой.
оператор.
echo
.Здесь.введенный.пароль.преобразуется.в.хеш.SHA-1..В.следующей.строке.ис- пользуется.операция.подстроки.bash.для.извлечения.первых.40.символов,.удаляя.
любые.дополнительные.символы,.которые.
sha1sum
.могла.включить.в.свой.вывод.
.Первые.пять.символов.хеша.хранятся.в.переменной.
firstFive
,.а.символы.с.6-го.
по.40-й.—.в.
ending
280 Часть IV • Администрирование систем обеспечения безопасности
.Запрос.сайта.Have.I.Been.Pwned?.производится.с.использованием.URL-адреса.
REST.API.и.первых.пяти.символов.хеша.пароля..Возвращаемый.результат.содер- жит.как.символы.возврата.каретки.(
\r
),.так.и.символы.новой.строки.(
\n
)..Чтобы.
избежать.путаницы.в.среде.Linux,.мы.удаляем.символ.возврата..Поиск.результата.
ведется.с.помощью.команды.
grep
.и.символов.хеша.пароля,.начиная.с.6-го.и.закан- чивая.40-м.символом..Параметр.
-i
.используется,.чтобы.
grep
.была.нечувствительна.
к.регистру.
.Чтобы.узнать,.сколько.раз.данный.пароль.был.взломан,.мы.удаляем.ведущий.
хеш,.то.есть.все.символы.до.двоеточия,.включая.сам.символ.двоеточия..Это.
удаление.префикса.оболочки,.где.двойной.хештег.означает.«самое.длинное.
возможное.совпадение»,.а.звездочка.—.шаблон,.который.соответствует.любым.
символам.
Обратите.внимание,.что.сценарий.
checkpass.sh
.завершит.свою.работу.с.кодом.со- стояния.
0
,.если.пароль.найден,.и.с.кодом.
1
,.если.пароль.не.найден..Это.похоже.на.
поведение.не.только.
grep
,.но.и.некоторых.других.команд.оболочки,.которые.заняты.
поиском.определенных.данных..Если.поиск.не.увенчался.успехом,.результатом.
будет.вывод.с.ошибкой.(ненулевой).(хотя.в.случае.
pwned
.можно.считать,.что.это.
невыявленный.успех).
Чтобы.использовать.сценарий,.просто.введите.пароль.в.командную.строку.или.
при.появлении.запроса:
$ ./checkpass.sh password
Password is Pwned 3533661 Times!
Будьте осторожны при передаче паролей в качестве аргументов командной строки, так как они видны в полном списке состояния процесса (см. команду ps) и могут быть сохранены в файле истории bash. Предпочтительным методом будет чтение пароля из stdin (например, при запросе). Если сценарий является частью более сложного командного конвейера, сделайте пароль первой строкой для чтения из stdin.
Проверяем, не взломан ли адрес электронной почты
Проверка.взломанного.адреса.электронной.почты.менее.сложна,.чем.проверка.
пароля..Для.начала.вам.понадобится.URL.API:
https://haveibeenpwned.com/api/v2/breachedaccount/
Глава 22. Инструмент: аудит учетных записей 281
Проверяемый.адрес.электронной.почты.добавляется.в.конец.URL-адреса..API.
вернет.список.нарушений,.с.которыми.был.связан.данный.адрес.электронной.по- чты..Список.будет.получен.в.формате.JSON..В.этот.список.будет.включен.большой.
объем.информации:.название.нарушения,.связанный.домен.и.описание..Если.элек- тронный.адрес.в.базе.данных.не.найден,.будет.возвращен.код.состояния.HTTP.404.
В.примере.22.2.показано,.как.автоматизировать.этот.процесс.
Пример 22.2. checkemail.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# checkemail.sh
#
# Описание:
# Проверка адреса электронной почты на соответствие
# базе данных сайта Have I Been Pwned?
#
# Использование: ./checkemail.sh [
#
#
if (( "$#" == 0 ))
then printf 'Enter email address: '
read emailin else emailin="$1"
fi pwned=$(curl -s "https://haveibeenpwned.com/api/v2/breachedaccount/$emailin")
if [ "$pwned" == "" ]
then exit 1
else echo 'Account pwned in the following breaches:'
echo "$pwned" | grep -Po '"Name":".*?"' | cut -d':' -f2 | tr -d '\"'
exit 0
fi
.Здесь.выполняется.проверка,.был.ли.адрес.электронной.почты.передан.в.каче- стве.аргумента;.если.нет,.пользователю.будет.направлен.запрос.
.Запрос.на.веб-сайт.Have.I.Been.Pwned?.
.Если.ответ.был.возвращен,.выполните.простой.синтаксический.анализ.JSON.
и.извлеките.пару.«имя/значение»..Дополнительную.информацию.об.обработке.
JSON.см..в.главе.11.
282 Часть IV • Администрирование систем обеспечения безопасности
Для.использования.сценария.
checkemail.sh
.передайте.в.качестве.аргумента.адрес.
электронной.почты.или.введите.его.при.появлении.запроса:
$ ./checkemail.sh example@example.com
Account pwned in the following breaches:
000webhost
AbuseWithUs
Adobe
Apollo
Рассмотрим.два.других.варианта.этого.сценария..Первый.показан.в.примере.22.3.
Пример 22.3. checkemailAlt.sh
#!/bin/bash
#
# checkemail.sh – проверяем, имеется ли адрес электронной почты
# в базе данных сайта Have I Been Pwned?
#
if (( "$#" == 0 ))
then printf 'Enter email address: '
read emailin else emailin="$1"
fi
URL="https://haveibeenpwned.com/api/v2/breachedaccount/$emailin"
pwned=$(curl –s "$URL" | grep –Po '"Name":".*?"' )
if [ "$pwned" == "" ]
then exit 1
else echo 'Account pwned in the following breaches:'
pwned="${pwned//\"/}" # удалить все кавычки pwned="${pwned//Name:/} " # удалить все 'Name:'
echo "${pwned}"
exit 0
fi
.Как.и.в.предыдущем.сценарии,.чтобы.определить,.предоставил.ли.пользователь.
нужное.количество.аргументов,.используйте.счетчик.аргументов..Если.аргументов.
недостаточно,.направьте.пользователю.запрос.
Глава 22. Инструмент: аудит учетных записей 283
.В.этой.версии.сценария.вместо.того,.чтобы.вернуть.все.выходные.данные.из.
команды.
curl
.и.только.после.этого.выполнить.команду.
grep
,.команда.
grep
.вы- полняется.сразу..Такая.организация.вызовов.более.эффективна,.так.как.вызов.
подоболочки.(через.конструкцию.
$
()
).происходит.один.раз,.а.не.дважды.(сначала.
для.
curl
,.а.затем.для.
grep
),.как.это.делалось.в.исходном.сценарии.
.Вместо.того.чтобы.для.редактирования.результатов.применять.
cut
.и.
tr
,.мы.
используем.подстановки.переменных.bash..Это.более.эффективно,.поскольку.по- зволяет.избежать.затрат.системных.ресурсов,.связанных.с.системными.вызовами.
fork
.и.
exec
,.которые.вызывают.две.дополнительные.программы.(
cut
.и.
tr
).
При.разовом.выполнении.данного.сценария.вы.скорее.всего.не.заметите.повы- шения.эффективности..Но.эта.разница.будет.заметна.при.написании.сценария,.
который.в.одном.сеансе.выполняет.множество.таких.вызовов.
В.примере.22.4.показан.еще.один.вариант.сценария,.уже.в.кратком.виде.
Пример 22.4. checkemail.1liner
#!/bin/bash
#
# checkemail.sh - проверяем, имеется ли адрес электронной почты
# в базе данных сайта Have I Been Pwned?
# в одной строке
EMAILIN="$1"
if (( "$#" == 0 ))
then printf 'Enter email address: '
read EMAILIN
fi
EMAILIN="https://haveibeenpwned.com/api/v2/breachedaccount/$EMAILIN"
echo 'Account pwned in the following breaches:'
curl -s "$EMAILIN" | grep -Po '"Name":".*?"' | cut -d':' -f2 | tr -d '\"'
.Это.та.же.проверка,.что.и.раньше,.но,.чтобы.захватить.полный.URL,.мы.будем.
использовать.только.одну.переменную.оболочки,.
EMAILIN
,.и.не.станем.вводить.
вторую.переменную.
URL
.В.данном.сценарии.используется.более.длинный.конвейер,.и.мы.можем.выпол- нить.все.манипуляции.в.одной.строке..Использование.переменных.оболочки.для.
анализа.наших.результатов.может.быть.более.эффективным,.но.требует.нескольких.
строк.кода..Некоторые.программисты.предпочитают.краткие.команды..Но.обратите.
внимание.на.одно.отличие.в.поведении.этого.сценария:.заголовок.по-прежнему.
выводится,.даже.если.нет.других.выходных.данных.(то.есть.адрес.не.был.взломан).
284 Часть IV • Администрирование систем обеспечения безопасности
Чтобы.показать.разнообразие.решений,.которые.вы.можете.найти.и.использовать.
при.написании.сценариев.оболочки,.мы.привели.три.варианта.сценария..Суще- ствует.множество.компромиссных.решений.как.по.стилю,.так.и.по.сути,.которые.
можно.использовать.при.выполнении.вашей.задачи.
Пакетная обработка электронных адресов
Если.нужно.проверить.несколько.адресов.электронной.почты.на.их.наличие.в.базе.
данных.сайта.Have.I.Been.Pwned?,.можете.автоматизировать.процесс..В.примере.22.5.
показано,.как.считать.файл.со.списком.подлежащих.проверке.адресов.электронной.
почты.и.выполнить.для.каждого.электронного.адреса.сценарий.
checkemail.sh
..Если.
адрес.электронной.почты.был.взломан,.он.будет.показан.на.экране.
Пример 22.5. emailbatch.sh
#!/bin/bash -
#
# Bash и кибербезопасность
# emailbatch.sh
#
# Описание:
# Чтение файла с адресами электронной почты
# и проверка их на сайте Have I Been Pwned?
#
# Использование: ./emailbatch.sh [
#
# по умолчанию: читать из stdin
#
cat "$1" | tr -d '\r' | while read fileLine
do
./checkemail.sh "$fileLine" > /dev/null
if (( "$?" == 0 ))
then echo "$fileLine is Pwned!"
fi sleep 0.25
done
.Прочитайте.файл,.переданный.через.первый.аргумент..Команда.
td
.использу- ется.для.удаления.разрывов.строк.Windows,.поэтому.они.не.включаются.в.адрес.
электронной.почты.
.Запускается.сценарий.
checkemail.sh
.и.в.качестве.аргумента.передаются.адреса.
электронной.почты..Вывод.перенаправляется.в.
/dev/null
,.поэтому.не.отображается.
на.экране.
Глава 22. Инструмент: аудит учетных записей 285
.Для.проверки.состояния.завершения.последней.выполненной.команды.исполь- зуется.
$?
..Сценарий.
checkemail.sh
.вернет.
0
,.если.электронный.адрес.найден,.и.
1
,.
если.не.найден.
.Задержка.на.2500.миллисекунд.нужна,.чтобы.убедиться,.что.сценарий.не.пре- вышает.ограничение.скорости.сайта.Have.I.Been.Pwned?.
Чтобы.запустить.сценарий.
emailbatch.sh
,.передайте.текстовый.файл,.содержащий.
список.адресов.электронной.почты:
$ ./emailbatch.sh emailaddresses.txt example@example.com is Pwned!
example@gmail.com is Pwned!
Выводы
Чтобы.определить,.были.ли.при.крупной.утечке.данных.взломаны.адреса.элек- тронной.почты.и.пароли,.эти.сведения.следует.регулярно.проверять..Просите.
пользователей.изменять.взломанные.пароли,.так.как.эти.пароли.с.высокой.веро- ятностью.могут.быть.частью.словарей.паролей.злоумышленников.
Упражнения
1.. Переработайте.сценарий.
checkpass.sh
.так,.чтобы.в.качестве.аргумента.команд- ной.строки.он.мог.также.принимать.хеш.SHA-1.пароля.
2.. Создайте.сценарий,.похожий.на.
emailbatch.sh
,.который.может.читать.из.файла.
список.хешей.паролей.SHA-1,.и.используйте.
checkpass.sh
.для.проверки.того,.
не.скомпрометированы.ли.они.
3.. Скомбинируйте.сценарии.
checkpass.sh
,.
checkemail.sh
.и.
emailbatch.sh
.в.один.
скрипт.
Чтобы.просмотреть.дополнительные.ресурсы.и.получить.ответы.на.эти.вопросы,.
зайдите.на.сайт.
https://www.rapidcyberops.com/