Содержание статьи
- Сбор данных о хосте
- Кейс 1. Кто косячит?
- Шаг 1. Копаемся в файловой системе
- Шаг 2. Приложения
- Шаг 3. Виртуальный нарушитель
- Шаг 4. Любители консоли
- Кейс 2. Зафиксировано обращение к Tor
- На том ли мы хосте?
- Текущие соединения и логи
- Разные приемы
- Кейс 3. Майнер
- Практический разбор
- Кейс 4. Съемные носители
- Пример usbrip
- Самогреп
- Кейс 5. Закрепленная малварь и IOC
- Анализ мест для закрепления
- Эмуляция C2 через cron
- Изысканные локации
- Любителям графики
- Файлы настроек
- Профильное закрепление
- Триаж артефактов
- Кейс 6. Удаленное проникновение
- Файловые аномалии
- Логи и сетка
- Выводы
- Дополнительная литература
- Скрипты и утилиты
Именно здесь начинается наша история. По условиям задачи рассматриваются дистрибутивы Linux на основе Debian: Kali, Astra и прочие. Нужно собрать информацию о хосте, пользовательской активности, иные артефакты, которые могут пригодиться для анализа любой потусторонней активности. Очень желательно собирать все данные автоматически, без использования кучи пакетов с зависимостями. Вероятно, ты думаешь, что придется вручную вбивать все команды в терминал, делать себе чек‑лист... Но зачем? Напишем скриптец на Bash и будем носить его на флешке!
Ты можешь собрать свой скрипт из приведенных команд, как из конструктора. Или же воспринимай этот материал как шпаргалку по Linux для юного безопасника. Разумеется, все команды ты можешь опробовать в терминале, все они только собирают и отображают информацию, ничего не меняя в системе.
Предварительно отформатируй флешку в NTFS, если ты будешь потом общаться с Windows, или в ext4, если нет. Создадим файлик ifrit.
(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=$1fi# Создаем директорию и переходим в нееmkdir -pv $savetocd $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 # Наш лог-файл
Подобные скрипты обычно либо пишут всё в один общий лог или в множество маленьких файлов, либо пытаются как‑то систематизировать свой вывод, размещая рядом архивец с сочными данными. Мы выберем последний вариант, но об этом дальше.
В листингах мы указываем только команду, для экономии пишем в комментарии, что она делает, а ее результат выводим в один из тематических файлов, например >>
(тоже опускаем эту часть в листингах). В реальном скрипте рекомендуем каждую команду сопровождать выводом ее названия и сопроводительной информации, чтобы было понятно, что происходит:
# Выводим текущий этап в консоль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+foundusers=`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# Информация о текущей учетной записи и ее членстве в группахidfor name in $(ls /home) # ... и обо всех остальных# Здесь же можно использовать и нашу переменную $usersdo id $namedone# Проверимся на руткиты, иногда помогаетchkrootkit 2>/dev/null
# Здесь можно встретить информацию в виде dat-файлов о состоянии батареи ноутбука, включая процент зарядки, расход и состояние отключения батарейки и ее зарядаcat /var/lib/upower/* 2>/dev/null
Кейс 1. Кто косячит?
Кто‑то из пользователей занимается непотребствами на работе. То Steam установит, то в ЖЖ напишет трактат. Попробуем его определить своими силами.
Шаг 1. Копаемся в файловой системе
Нужно сперва посмотреть активность в стандартных пользовательских директориях. Это самый быстрый и простой способ найти тех, кто не убирает за собой. Здесь мы делаем поиск сразу для всех домашних каталогов, что требует привилегий суперпользователя. Если ты проверяешь только одного текущего юзера, вместо /
в командах ниже можешь написать ~/
.
# В этих каталогах можно поискать последние пользовательские документы и файлы, что позволит узнать, какие документы открывал пользователь и что качал из интернета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. Приложения
Теперь посмотрим на списки приложений. Для начала глянем, что у нас вообще установлено в системе помимо стандартных вещей. Следует проверить, какие браузеры, мессенджеры и почтовые серверы используются, — вдруг через них совершались недобрые дела? Это в будущем может пригодиться аналитикам при расследовании инцидента.
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее