Псс, бра­ток... слы­шал, что вин­да уже всё? Все поваль­но перехо­дят на сво­бод­ное ПО, иног­да даже оте­чес­твен­ное. Ты безопас­ник, так что иди обес­печивай безопас­ность. И вот тебе кейс: комп с «Линук­сом» и инци­дент. Или инци­ден­та не было, а про­верить, что все чис­то, надо. Зна­ешь, что делать? Если нет, сей­час рас­ска­жем. А если зна­ешь, все рав­но пог­ляди! Мы соб­рали рецеп­ты на все слу­чаи жиз­ни, а в кон­це статьи поделим­ся под­боркой полез­ных инс­тру­мен­тов.

Имен­но здесь начина­ется наша исто­рия. По усло­виям задачи рас­смат­рива­ются дис­три­бути­вы Linux на осно­ве Debian: Kali, Astra и про­чие. Нуж­но соб­рать информа­цию о хос­те, поль­зователь­ской активнос­ти, иные арте­фак­ты, которые могут при­годить­ся для ана­лиза любой по­тусто­рон­ней активнос­ти. Очень желатель­но собирать все дан­ные авто­мати­чес­ки, без исполь­зования кучи пакетов с зависи­мос­тями. Веро­ятно, ты дума­ешь, что при­дет­ся вруч­ную вби­вать все коман­ды в тер­минал, делать себе чек‑лист... Но зачем? Напишем скрип­тец на Bash и будем носить его на флеш­ке!

Ты можешь соб­рать свой скрипт из при­веден­ных команд, как из конс­трук­тора. Или же вос­при­нимай этот матери­ал как шпар­галку по Linux для юно­го безопас­ника. Разуме­ется, все коман­ды ты можешь опро­бовать в тер­минале, все они толь­ко собира­ют и отоб­ража­ют информа­цию, ничего не меняя в сис­теме.

Пред­варитель­но отформа­тируй флеш­ку в NTFS, если ты будешь потом общать­ся с Windows, или в ext4, если нет. Соз­дадим фай­лик ifrit.sh (incident forensic response in terminal) и вне­сем в него пре­амбу­лу. Скрипт будет фик­сировать вре­мя запус­ка и соз­даст дирек­торию для сбо­ра фай­лов (арте­фак­тов) с машины и наших логов. Называть­ся она будет так:

<имя_хоста>_<юзер>_<дата и время>

В кон­це основной час­ти соз­даем в этой пап­ке под­каталог для будущих арте­фак­тов и раз­реша­ем его копиро­вать, затем счи­таем зат­рачен­ное вре­мя и откры­ваем пап­ку в фай­ловом менед­жере. Все свои дей­ствия будем писать в общий лог.

#!/bin/bash
# IFRIT. Stands for: Incident Forensic Response In Terminal =)
# Использование: chmod a+x ./ifrit.sh && ./ifrit.sh
# Фиксируем текущую дату
start=`date +%s`
# Проверка, что мы root
[[ $UID == 0 || $EUID == 0 ]] || (
echo "Current user:"
# «Без root будет бедная форензика»
echo $(id -u -n)
)
echo "Наш sudo-юзер:"
echo $SUDO_USER
# Делаем директорию для сохранения всех результатов (если не указан аргумент скрипта)
if [ -z $1 ]; then
part1=$(hostname) # Имя хоста
echo "Наш хост: $part1"
time_stamp=$(date +%Y-%m-%d-%H.%M.%S) # Берем дату и время
curruser=$(whoami) # Текущий юзер
saveto="./${part1}_${curruser}_$time_stamp" # Имя директории
else
saveto=$1
fi
# Создаем директорию и переходим в нее
mkdir -pv $saveto
cd $saveto
# Создаем вложенную директорию для триаж-файлов
mkdir -p ./artifacts
# Начинаем писать лог в файл
{
<основной код проверок>
# Пример команды в формате:
# <команда> >> <тематический файл>
# Сведения о релизе ОС, например из файла os-release
# Аналоги: cat /usr/lib/os-release или lsb_release
cat /etc/*release
# Список всех запущенных процессов вывод в тематический файл test
ps aux >> test
...
# Завершающая часть после выполнения необходимых команд
# Для выходной директории даем права всем на чтение и удаление
chmod -R ugo+rwx ./../$saveto
end=`date +%s`
echo ENDED! Execution time: `expr $end - $start` seconds.
echo "Проверяй директорию ${saveto}!"
# Открываем директорию в файловом менеджере работает не во всех дистрибутивах. В Astra также можно использовать команду fly-fm
xdg-open .
} |& tee ./console_log # Наш лог-файл

По­доб­ные скрип­ты обыч­но либо пишут всё в один общий лог или в мно­жес­тво малень­ких фай­лов, либо пыта­ются как‑то сис­темати­зиро­вать свой вывод, раз­мещая рядом архи­вец с соч­ными дан­ными. Мы выберем пос­ледний вари­ант, но об этом даль­ше.

В лис­тингах мы ука­зыва­ем толь­ко коман­ду, для эко­номии пишем в ком­мента­рии, что она дела­ет, а ее резуль­тат выводим в один из темати­чес­ких фай­лов, нап­ример >> case1.log (тоже опус­каем эту часть в лис­тингах). В реаль­ном скрип­те рекомен­дуем каж­дую коман­ду соп­ровож­дать выводом ее наз­вания и соп­роводи­тель­ной информа­ции, что­бы было понят­но, что про­исхо­дит:

# Выводим текущий этап в консоль
echo "Название модуля"
# Выводим текущий этап в профильный лог
echo "Название модуля" >> <тематический файл>
# Выводим результат работы команды в профильный лог
<выполняемая команда> >> <тематический файл>
# Вставляем пустую строку в файл для удобочитаемости и разделения результатов отдельных команд
echo -e "\n" >> <тематический файл>
 

Сбор данных о хосте

Для начала зафик­сиру­ем базовую информа­цию о хос­те и ОС и запишем в файл host_info. Вдруг машин мно­го и в будущем нуж­но будет их раз­личать. Скрипт сто­ит запус­кать от рута для мак­сималь­но под­робно­го вывода команд. Там, где это абсо­лют­но необ­ходимо, мы будем начинать коман­ду с sudo.

# Начинаем писать файл host_info. Далее вывод каждой команды здесь подразумевает в конце добавление ">> host_info", для краткости опустим это
echo -n > host_info
date # Фиксируем текущую дату и время
hostname # Пишем имя хоста
who am i # и юзера, от имени которого запустили скрипт
ip addr # Информация о текущем IP-адресе
uname -a # На каких ОС и ядре мы находимся
# Получим список живых пользователей. Зачастую мы хотим просто посмотреть реальных пользователей, у которых есть каталоги, чтобы в них порыться. Запишем имена в переменную для последующей эксплуатации
ls /home
# Исключаем папку lost+found
users=`ls /home -I lost*`
echo $users
# Раскомментируй следующую строчку, чтобы сделать паузу и что-нибудь скушать. Затем нажми Enter, чтобы продолжить
# read -p "Press [Enter] key to continue fetch..."

Ба­зовая информа­ция об активнос­ти — вклю­чении, вык­лючении, уров­не заряда батареи ноут­бука (вдруг при­годит­ся). Как‑то раз машину впер­вые вклю­чили спе­циаль­но для меня впер­вые за пять лет.

# Текущее время работы системы, количество залогиненных пользователей, средняя загрузка системы за 1, 5 и 15 мин
uptime
# Список последних входов в систему с указанием даты (/var/log/lastlog)
lastlog
# Список последних залогиненных юзеров (/var/log/wtmp), их сессий, ребутов и включений и выключений
last -Faiwx
# Информация о текущей учетной записи и ее членстве в группах
id
for name in $(ls /home) # ... и обо всех остальных
# Здесь же можно использовать и нашу переменную $users
do
id $name
done
# Проверимся на руткиты, иногда помогает
chkrootkit 2>/dev/null
# Здесь можно встретить информацию в виде dat-файлов о состоянии батареи ноутбука, включая процент зарядки, расход и состояние отключения батарейки и ее заряда
cat /var/lib/upower/* 2>/dev/null
 

Кейс 1. Кто косячит?

Кто‑то из поль­зовате­лей занима­ется непот­ребс­тва­ми на работе. То Steam уста­новит, то в ЖЖ напишет трак­тат. Поп­робу­ем его опре­делить сво­ими силами.

 

Шаг 1. Копаемся в файловой системе

Нуж­но спер­ва пос­мотреть активность в стан­дар­тных поль­зователь­ских дирек­тори­ях. Это самый быс­трый и прос­той спо­соб най­ти тех, кто не уби­рает за собой. Здесь мы дела­ем поиск сра­зу для всех домаш­них катало­гов, что тре­бует при­виле­гий супер­поль­зовате­ля. Если ты про­веря­ешь толь­ко одно­го текуще­го юзе­ра, вмес­то /home/* в коман­дах ниже можешь написать ~/.

# В этих каталогах можно поискать последние пользовательские документы и файлы, что позволит узнать, какие документы открывал пользователь и что качал из интернета
sudo ls -la /home/*/Downloads/ 2>/dev/null
sudo ls -la /home/*/Загрузки/ 2>/dev/null
sudo ls -la /home/*/Documents/ 2>/dev/null
sudo ls -la /home/*/Документы/ 2>/dev/null
sudo ls -la /home/*/Desktop/ 2>/dev/null
sudo ls -la /home/*/Рабочий\ стол/ 2>/dev/null
# Составляем список файлов в корзине
sudo ls -laR /home/*/.local/share/Trash/files 2>/dev/null
# Для рута тоже на всякий случай
sudo ls -laR /root/.local/share/Trash/files 2>/dev/null
# Кешированные изображения могут помочь понять, какие программы использовались
sudo ls -la /home/*/.thumbnails/

В резуль­тате ты можешь най­ти приз­наки ска­чива­ния фай­лов, докумен­тов, при­ложе­ний. В кор­зине могут остать­ся уда­лен­ные серии сери­алов или еще что‑то в этом духе.

По­лез­но быва­ет про­шер­стить катало­ги на наличие фай­лов с иско­мым кон­тентом или тер­мином. Нап­ример, поп­робу­ем поис­кать все фай­лы с упо­мина­нием сло­ва «тер­менвокс» (пред­положим, юзер писал чер­новик в тек­сто­вом фай­ле перед пуб­ликаци­ей в ЖЖ) и выведем по две строч­ки свер­ху и сни­зу от него для понима­ния кон­тек­ста упот­ребле­ния.

# Ищем в домашних пользовательских папках
grep -A2 -B2 -rn 'терменвокс' --exclude="*ifrit.sh" --exclude-dir=$saveto /home/* 2>/dev/null >> ioc_word_info

Мож­но поис­кать все фай­лы с инте­ресу­ющим нас рас­ширени­ем. Одна­ко эта коман­да может выпол­нять­ся очень дол­го.

sudo find /root /home -type f -o -name \*.jpg -o -name \*.doc -o -name \*.xls -o -name \*.csv -o -name \*.odt -o -name \*.ppt -o -name \*.pptx -o -name \*.ods -o -name \*.odp -o -name \*.mbox -o -name \*.eml 2>/dev/null >> interes_files_info

По­лез­но пос­тро­ить тай­млайн фай­лов в домаш­них катало­гах с датами изме­нения и сох­ранить его в CSV. Тай­млайн может помочь впос­ледс­твии понять, в какой момент что‑то пош­ло не так, какие фай­лы, ког­да и где соз­давались.

echo "[BUILDING SACRED TIMELINE!]"
echo -n >> timeline_file
echo "file_location_and_name, date_last_Accessed, date_last_Modified, date_last_status_Change, owner_Username, owner_Groupname,sym_permissions, file_size_in_bytes, num_permissions" >> timeline_file
echo -n >> timeline_file
sudo find /home /root -type f -printf "%p,%A+,%T+,%C+,%u,%g,%M,%s,%m\n" 2>/dev/null >> timeline_file #
 

Шаг 2. Приложения

Те­перь пос­мотрим на спис­ки при­ложе­ний. Для начала гля­нем, что у нас вооб­ще уста­нов­лено в сис­теме помимо стан­дар­тных вещей. Сле­дует про­верить, какие бра­узе­ры, мес­сен­дже­ры и поч­товые сер­веры исполь­зуют­ся, — вдруг через них совер­шались недоб­рые дела? Это в будущем может при­годить­ся ана­лити­кам при рас­сле­дова­нии инци­ден­та.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    5 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии