Содержание статьи
- Сбор данных о хосте
- Кейс 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. Приложения
Теперь посмотрим на списки приложений. Для начала глянем, что у нас вообще установлено в системе помимо стандартных вещей. Следует проверить, какие браузеры, мессенджеры и почтовые серверы используются, — вдруг через них совершались недобрые дела? Это в будущем может пригодиться аналитикам при расследовании инцидента.
Разумеется, можно и просто пробежаться по значкам на рабочем столе. Здесь мы приводим команды и папки, куда данные программы могут писать полезную инфу, например хранить базы, пароли, историю и прочие сведения.
# Firefox, артефакты: ~/.mozilla/firefox/*, ~/.mozilla/firefox/* и ~/.cache/mozilla/firefox/*firefox --version 2>/dev/null
# Firefox, альтернативная проверкаdpkg -l | grep firefox
# Thunderbird. Можно при успехе просмотреть содержимое каталога командой ls -la ~/.thunderbird/*, поискать календарь, сохраненную перепискуthunderbird --version 2>/dev/null
# Chromium. Артефакты: ~/.config/chromium/*chromium --version 2>/dev/null
# Google Chrome. Артефакты можно брать из ~/.cache/google-chrome/* и ~/.cache/chrome-remote-desktop/chrome-profile/chrome --version 2>/dev/null
# Opera. Артефакты: ~/.config/opera/*opera --version 2>/dev/null
# Brave. Артефакты: ~/.config/BraveSoftware/Brave-Browser/*brave --version 2>/dev/null
# Бета Яндекс-браузера для Linux. Артефакты: ~/.config/yandex-browser-beta/*yandex-browser-beta --version 2>/dev/null
# Мессенджеры# Signalsignal-desktop --version 2>/dev/null
# Viberviber --version 2>/dev/null
# WhatsAppwhatsapp-desktop --version 2>/dev/null
# Telegramtdesktop --version 2>/dev/null
# Zoom# Также можно проверить каталог: ls -la ~/.zoom/*zoom --version 2>/dev/null
# Steam# Можешь проверить и каталог: ls -la ~/.steamsteam --version 2>/dev/null
# Discorddiscord --version 2>/dev/null
# Dropboxdropbox --version 2>/dev/null
# И артефакты — в ~/.dropbox# Яндекс Дискyandex-disk --version 2>/dev/null
# Ищем установленные торрент-клиентыapt list --installed | grep torrent 2>/dev/null
# Иные специфичные приложенияdocker --version 2>/dev/null # Docker# Артефакты Docker: /var/lib/docker/containers/*/containerd --version 2>/dev/null
# Артефакты containerd : /etc/containerd/* и /var/lib/containerd/
Если у тебя есть список приложений, запрещенных в организации, можно хранить его в отдельном текстовом файле, грепать их оттуда или использовать однострочники. Например:
dpkg -l | grep -f blacklisted_apps.txt
apt list --installed | grep 'torrent\|viber'
Еще можно на всякий случай выписать все пакеты, установленные в системе. Тут мы приводим команды для разных пакетных менеджеров, не только для стандартных в Debian.
# Список всех установленных пакетов APT; также попробуй dpkg -lapt list --installed 2>/dev/null
# Следующая команда позволяет получить список пакетов, установленных вручнуюapt-mark showmanual 2>/dev/null
apt list --manual-installed | grep -F \[installed\] 2>/dev/null
# Как вариант, можешь написать aptitude search '!~M ~i' или aptitude search -F %p '~i!~M'# Для openSUSE, ALT, Mandriva, Fedora, Red Hat, CentOSrpm -qa --qf "(%{INSTALLTIME:date}): %{NAME}-%{VERSION}\n" 2>/dev/null
# Для Fedora, Red Hat, CentOSyum list installed 2>/dev/null
# Для Fedoradnf list installed 2>/dev/null
# Для Archpacman -Q 2>/dev/null
# Для openSUSEzypper info 2>/dev/null
При сборе данных еще можно вытянуть всякие штуки типа браузерных баз, где хранятся настройки, пароли, закладки и история посещений. А также настройки почтовых клиентов и переписки в них. Учти, что копирование таких файлов обычно требует определенных прав в системе. Представленные ниже папки приложений будут существовать, только если эти приложения запускались и использовались.
# Создаем папку для сохранения профиляmkdir -p ./artifacts/mozilla
# Банально воруем профиль «Файрфокса» для последующих опытов — анализа закладок, истории, сохраненных кредовsudo cp -r /home/*/.mozilla/firefox/ ./artifacts/mozilla
mkdir -p ./artifacts/gchrome
# Google Chromesudo cp -r /home/*/.config/google-chrome* ./artifacts/gchrome
mkdir -p ./artifacts/chromium
# Chromiumsudo cp -r /home/*/.config/chromium ./artifacts/chromium
На этом этапе мы успешно посмотрели, чем пользователь занимался, какие у него есть приложения, и выгрузили браузерные артефакты. Потом оттуда можно будет получить историю посещений и сохраненные креды.
Шаг 3. Виртуальный нарушитель
Самый хитрый способ нарушений — гадить из виртуалок или виндовых приложений, развернутых в Wine. Команды ниже могут помочь найти установленные там программы и посмотреть их настройки. Тоже запускаем от рута.
# Список приложений, установленных в Winetrickswinetricks list-installed 2>/dev/null
# Параметры Winetrickswinetricks settings list 2>/dev/null
# Смотрим файлы в вайновском Program Filesls -la /home/*/.wine/drive_c/program_files 2>/dev/null
ls -la /home/*/.wine/drive_c/Program 2>/dev/null
ls -la /home/*/.wine/drive_c/Program\ Files/ 2>/dev/null
ls -la /home/*/.wine/drive_c/Program/ 2>/dev/null
Полезно и посмотреть, не затерялись ли VirtualBox или QEMU.
# Проверяем, установлена ли VirtualBoxapt list --installed | grep virtualbox 2>/dev/null
# А вот так можем посмотреть логи QEMU, в том числе и об активности виртуальных машинcat ~/.cache/libvirt/qemu/log/* 2>/dev/null
Для анализа виртуальных машин их придется включать и смотреть вручную или выгружать их диски для дальнейшего анализа утилитами типа Autopsy.
Шаг 4. Любители консоли
Смотреть последнюю активность пользователя — это наша первоочередная обязанность. Не забываем, что, кроме обычных графических юзеров, у нас есть root, от имени которого отдельные личности любят ставить пакеты через терминал и творить прочие безобразия. Вперед! Начнем с истории команд в консоли.
# Дефолтная командаhistory# Выводим историю консольных командcat ~/.history 2>/dev/null
# Аналог команды history, выводит список последних команд, выполненных текущим пользователем в терминалеfc -l 1 2>/dev/null
# История команд Python, здесь тоже что-то может встретитьсяcat ~/.python_history
Интересно, какие приложения ставил и удалял юзер перед нашей проверкой?
echo "[History installed grep install /var/log/dpkg.log]"# История установки пакетов. Также можно грепать в файлах /var/log/dpkg.log*, напримерgrep "install " /var/log/dpkg.log
# История установки пакетов в архивных логах. Для поиска во всех заархивированных логах исправь dpkg.log на *zcat /var/log/dpkg.log.gz | grep "install "# Обновления пакетовgrep "upgrade " /var/log/dpkg.log
# Лог удаленных пакетовgrep "remove " /var/log/dpkg.log
# Тут может быть инфа о последних установленных приложенияхcat /var/log/apt/history.log
Также в поисках установленных приложений можно посмотреть следующие файлы:
-
/
;var/ log/ dpkg. log* -
/
;var/ log/ apt/ history. log* -
/
;var/ log/ apt/ term. log* -
/
.var/ lib/ dpkg/ status
Иногда ты приходишь проверять комп и перед тобой девственно чистый Linux. Возможно, от тебя скрыли основную рабочую ось?
# Вывод содержимого загрузочного меню, то есть список ОСsudo awk -F' '/menuentry / {print $2}' /boot/grub/grub.cfg 2>/dev/null# Проверим, не завалялись ли рядом еще загрузочные ОСsudo os-prober
Подведем промежуточные итоги. Мы получили представление о последних пользовательских действиях с файлами и в терминале, о работе с графическими приложениями. Заглянули в корзину. Построили таймлайн файловых изменений в основных домашних каталогах. Прочекали наличие виртуалок и портированных приложений, в которых тоже можно много чего натворить. Этого достаточно для восстановления действий обычного юзера. Теперь перейдем к более специфичным кейсам.
Кейс 2. Зафиксировано обращение к Tor
Тревога, тревога! Кто‑то (или что‑то) с рабочего компьютера подключился к Tor. Есть IP хоста, с которого предположительно было обращение, IP целевого узла Tor и дата. Результаты будем писать в файл network
.
На том ли мы хосте?
Проверим, что мы на машине с IP источника подключения:
# Сетевое имя текущего хостаcat /etc/hostname
# Информация о сетевых адаптерах. Аналоги: ip l и ifconfig -aip a 2>/dev/null
# Список известных хостов, он же локальный DNScat /etc/hosts
# Проверяем наличие интернета, а заодно и записываем внешний IP-адресwget -O- https://api.ipify.org 2>/dev/null | tee -a network
Если в сети используется DHCP, можно посмотреть следующие файлы:
# База аренд DHCP-сервера (файлы dhcpd.leases). Гламурный аналог — утилита dhcp-lease-listcat /var/lib/dhcp/* 2>/dev/null
# Основные конфиги DHCP-сервера (можно сразу убрать из вывода все строки, начинающиеся с комментариев, и посмотреть именно актуальный конфиг, если тебе это надо, конечно)cat /etc/dhcp/* | grep –vE ^ 2>/dev/null
# В логах смотрим инфу о назначенном адресе по DHCPsudo journalctl | grep " lease"# При установленном NetworkManagersudo journalctl | grep "DHCP"
Если мы на подозреваемой машине, то двигаемся дальше.
Текущие соединения и логи
Необходимо посмотреть, нет ли среди активных подключений соединений с IP-адресом Tor.
# Сохраняем текущую ARP-таблицу. Аналог: arp -esudo ip n 2>/dev/null
# Банальный принт таблицы маршрутизации. Аналог: routesudo ip r 2>/dev/null
# Активные сетевые процессы и сокеты с адресами. Эти же ключи сработают для утилиты ss нижеnetstat -anp 2>/dev/null
# Актуальная альтернатива netstat, выводит имена процессов (если запуск с sudo) с текущими TCP/UDP-соединениямиsudo ss -tupln
Среди активных соединений мы ничего подозрительного не увидели. Придется обращаться к логам и конфигам. Команды, приведенные ниже, мы позаимствовали у специалистов Центробанка (из стандарта ИББС-1.3-2016, приложение В).
Мы будем искать информацию (в том числе в системных логах) о сетях, к которым подключалась операционка. Для всех команд нужны права суперпользователя. Вывод же можно направлять в отдельный файл network_list
.
# Незамысловатый карвинг из логов сетевых соединенийsudo journalctl -u NetworkManager | grep -i "connection '"sudo journalctl -u NetworkManager | grep -i "address" # адресовsudo journalctl -u NetworkManager | grep -i wi-fi # подключений-отключений Wi-Fisudo journalctl -u NetworkManager | grep -i global -A2 -B2 # подключений к интернету# Сети Wi-Fi, к которым подключалисьsudo grep psk= /etc/NetworkManager/system-connections/* 2>/dev/null
# Альтернативаsudo cat /etc/NetworkManager/system-connections/* 2>/dev/null
# Забираем конфигурацию iptablessudo iptables-save 2>/dev/null
sudo iptables -n -L -v --line-numbers# Список правил файрвола nftablessudo nft list ruleset
Дополнительные команды, требующие sudo:
# Конфигурация беспроводных сетейsudo iwconfig 2>/dev/null
# Процессы, прослушивающие портыsudo lsof -i# Информация о DHCP-действиях на хостеsudo journalctl | grep -i dhcpd
А вот эта команда покажет количество полуоткрытых соединений:
netstat -tan | grep -i syn | wc -l
Если соединений много, можно предположить, что на хост проводилась атака SYN flood.
Мы выяснили текущую конфигурацию сети, собрали некоторую историю подключений и получили настройки файрвола. Кстати, часть вредоносов просто обычно или целиком сносят файрвол (никто не заметит, ведь у Linux бывает аптайм по полгода и больше), или открывают и изменяют порты для своей работы.
Разные приемы
Проверим логи с регуляркой на более‑менее валидный IP-адрес:
sudo journalctl | grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|sudo [01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' | sort |uniq
Или можешь попробовать такой вариант:
grep -r -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' /var/log | sort | uniq
К сожалению, исследуемый хост все это время был подключен к одной сети. Используя собранные данные из кейса 1, мы установили, что в день подключения было активно два приложения: Firefox и qBittorrent. В /
не было ничего интересного. Зато в загрузках обнаружили скачанный в тот же день торрент‑файл и сам спираченный контент. Что же делать? В тех случаях, когда ты не знаешь, куда приложение пишет лог, бывает полезно грепнуть конкретный IP-адрес...
# Ищем айпишник среди данных приложенийgrep -A2 -B2 -rn '66.66.55.42' --exclude="*ifrit.sh" --exclude-dir=$saveto /usr /etc 2>/dev/null >> IP_info
И еще — слабый, но рабочий способ искать логи где‑то еще. Из‑за того что журналы могут иметь вариации типа -log
. *.
, log1
и так далее, будет много ложных срабатываний. Легче будет потом находить логи конкретных приложений.
sudo find /root /home /bin /etc /lib64 /opt /run /usr -type f -name \*log* 2>/dev/null >> int_files_info
В результате анализа мы обнаружили файл, содержащий логи скачивания этого торрента:
/home/user/.local/share/qBittorrent/logs/qbittorrent.log
Время работы торрент‑клиента в логе точно совпадало с обращением к Tor. Запускаем скачивание этого торрента на стенде, и файрвол немедленно ловит айпишник ноды Tor. Таким образом восстановилась полная картинка событий. Кто‑то скажет, что просто повезло. Спорить не будем. В самых запущенных случаях можно поискать в домашнем каталоге все файлы, измененные за определенный временной интервал:
find ~/ -type f -newermt "2023-02-24 00:00:11" \! -newermt "2023-02-24 00:53:00" –ls
Кейс 3. Майнер
Пользователь жалуется на медленную работу компьютера. Идем проверять. В первую очередь подробно определим, что в системе происходит прямо сейчас. Вывод отправим в файл.
# Выводим список залогиненных юзеровw
# Список запущенных приложенийlsof -w /dev/null
# Список всех запущенных процессов, лучше класть в отдельный файликps -l# Список всех запущенных процессов ver. 2ps aux
# Гламурный вывод дерева процессовpstree -Aup# Вывод информации о текущих альтернативных задачах в screenscreen -ls 2>/dev/null
# Вывод выполняющихся фоновых задач. Можешь проверить, открыв приложение из терминала, затем нажми в терминале ctrl + z. Командой fg ты возобновишься к последней такой отложенной задаче, а fg 1 — к первой. Не злоупотребляйjobs# Текстовый вывод аналога виндового диспетчера задачtop -bcn1 -w512
Сомнительный процесс иногда можно найти, просто глянув вывод ps (пример из блога Tenable).
10601 pts/18 Sl+ 14:25 | | _ /usr/lib/jvm/java-8-openjdk- …
10716 pts/18 S+ 0:20 | | _ /tmp/konL6821804046402511623.exe
29565 pts/18 S+ 0:00 | | | _ /bin/sh -c /bin/sh
29566 pts/18 S+ 0:00 | | | _ /bin/sh
10718 pts/18 S+ 0:00 | | _ /tmp/konL6369286348563749691.exe
В данном случае все как раз несложно. Достаточно вбить команду htop
, определить PID процесса, который больше всех пожирает ресурсы (например, грузит процессор на 100%), и убить его командой kill
. Также присмотрись к процессам, стартовавшим из папки /
или другой аномальной директории.
Практический разбор
Используя команду top
, мы получили следующий вывод.
Некий firefoxier
потребляет 100% CPU. Найдем обжору. Зная PID (62147), получим путь к исполняемому файлу, потом можем сдампить его, удалить или просто гордиться собой:
sudo ls -la /proc/62147/exe
# Убиваем процессsudo kill -9 62147
# Удаляем исполняемый файлsudo rm /usr/bin/firefoxier
Успех! В простейшем случае единоразового случайного запуска это позволит хотя бы нормально работать с хостом дальше. Здесь мы не рассматриваем самопорождающийся вредонос и пути его проникновения и закрепления в системе.
Если тебе попался серьезный противник, то после установки руткита процессы не будут отображаться в списке. Однако в данном случае процесс майнера запустился без закрепления, а пользователю доступно объяснили, почему не стоит запускать что попало.
Для передачи в SOC соберем базовый триаж, добавив полезную команду в наш скрипт. Триаж, если по‑простому, — это когда ты пришел на место киберпреступления и тебе нужно быстро обнаружить и собрать ключевую информацию о хосте. Например, если ты заранее знаешь, что преступник использовал браузер Firefox, то в первую очередь получи артефакты браузера, потом логи и остальное — в зависимости от зоны интересов.
tar -zc -f ./artifacts/VAR_LOG1.tar.gz /var/log/ 2>/dev/null # Запаковываем все логи в архив
Детально анализировать и разбирать логи мы тут не будем, это отдельная тема. Например, в логах Apache стоит грепать все строки User-Agent
клиентов, которые подключались к твоему хосту.
Вообще, в любой непонятной ситуации грепай. Есть ошибки — грепай error
или fail
. Знаешь проблемную службу — грепай по ее названию или части. Показалось, что есть подключения со сторонних IP-адресов? Смотри кейс 2 и грепай. Помни, grep — твой ключ к успеху!
Кейс 4. Съемные носители
Пользователи обожают совать всякое барахло в порты рабочего компьютера. Например, флешки с фильмами, а в запущенных случаях — Wi-Fi-адаптеры. Поэтому есть смысл искать следы этих жутких нарушений. Вот как посмотреть список железа (отправим в тематический лог dev_info
):
# Вывод инфо о PCI-шинеlspci
# Вывод инфо о подключенных USB-устройствахlsusb
# Вывод инфо о блочных устройствахlsblk
# cat /sys/bus/pci/devices/*/*# Информация о текущих и ранее установленных Bluetooth-устройствахls -laR /var/lib/bluetooth/ 2>/dev/null
# Список Bluetooth-устройствbt-device -l 2>/dev/null
# Список Bluetooth-устройств mk. IIIhcitool dev 2>/dev/null
# Ищем другие сообщения, связанные c железом, — очевидно, с sudosudo journalctl| grep -i 'PCI|ACPI|Plug' 2>/dev/null
# Пытаемся выявить подключение/отключение сетевого кабеля (адаптера) в логахsudo journalctl | grep "NIC Link is" 2>/dev/null
# Открытие/закрытие крышки ноутбукаsudo journalctl | grep "Lid" 2>/dev/null
Пример usbrip
Интереснее всего, конечно, посмотреть, что там с флешками. Для Linux есть отличная утилита usbrip (написанная нашим автором. — Примеч. ред.), подробную инструкцию к ней можешь глянуть на Kali.tools. Устанавливаем и запускаем:
usbrip events history
Выбираем вывод в терминал (жмем Enter). Выводится вся доступная информация по каждому носителю на основе логов, включая дату последнего отсоединения устройства и серийник (у нас usbrip почему‑то вывел далеко не все серийники, хотя в логах они прописывались). Для просмотра в виде таблицы пиши
usbrip events history -et
Самогреп
Чтобы ничего не устанавливать и смотреть логи самостоятельно, можешь воспользоваться вот такой командой (без grep жизни нет, помнишь?):
sudo journalctl -o short-iso-precise | grep -iw usb
Вывод тебя впечатлит своим выдающимся объемом. Давай оптимизируем затраты человеко‑часов и направим вывод в файлы:
# Информация о USB-шине и подключенных устройствахlsusb
cat /var/log/messages | grep -i usb 2>/dev/null
# Подключенные в текущей сессии USB-устройства — у Linux аптайм обычно большой, может, прокатитsudo dmesg | grep -i usb 2>/dev/null
# Usbrip делает то же самое, но потом обрабатывает данные и делает красивоsudo journalctl | grep -i usb
Для более детальной информации будем искать серийники конкретных носителей и выводить строчки рядом с ними:
cat /var/log/syslog* | grep -i usb | grep -A1 -B2 -i SerialNumber: >> usb_list_file
cat /var/log/messages* | grep -i usb | grep -A1 -B2 -i SerialNumber: 2>/dev/null >> usb_list_file
# Как ты понимаешь, устройства в текущей сессии имеет смысл собирать, только если система давно не перезагружаласьsudo dmesg | grep -i usb | grep -A1 -B2 -i SerialNumber: >> usb_list_file
sudo journalctl | grep -i usb | grep -A1 -B2 -i SerialNumber: >> usb_list_file
Благодаря выводу последней команды мы обнаружили подключение стороннего устройства — флешки. Поскольку такой серийник не числился в списках отдела безопасности, пользователь получил по ликбезу вне очереди.
Кейс 5. Закрепленная малварь и IOC
Это уже более серьезный кейс, для настоящих героев Threat Hunting. Допустим, ты хочешь проверить, нет ли на хосте маркеров компрометаций, то есть IOC (indicators of compromise). В демонстрационных целях давай поищем файлы, наличие которых указывает на возможное заражение «Шишигой» или RotaJakiro.
# Первые 18 файлов указывают на возможную активность Shishiga# Последние четыре — возможные локации RotaJakiroFILES="/etc/rc2.d/S04syslogd/etc/rc3.d/S04syslogd/etc/rc4.d/S04syslogd/etc/rc5.d/S04syslogd/etc/init.d/syslogd/bin/syslogd/etc/cron.hourly/syslogd/tmp/drop/tmp/srv$HOME/.local/ssh.txt$HOME/.local/telnet.txt$HOME/.local/nodes.cfg$HOME/.local/check$HOME/.local/script.bt$HOME/.local/update.bt$HOME/.local/server.bt$HOME/.local/syslog$HOME/.local/syslog.pid/bin/systemd/systemd-daemon/usr/lib/systemd/systemd-daemon$HOME/.dbus/sessions/session-dbus$HOME/.gvfsd/.profile/gvfsd-helper"counter=0;for f in $FILESdo if [ -e $f ] then # Если нашли файл из запретного списка, алертим и увеличиваем счетчик $counter=$counter +1; echo "Shishiga or RotaJakiro Marker-file found: " $f fidone# Если счетчик не 0, то тревожноif [ $counter -gt 0 ]then # Выводим алерт, что нашли нехорошие IOC echo "Shishiga or RotaJakiro IOC Markers found!!"fi
Но на самом деле такой самопал и список айоков будет тяжело отслеживать и править, поэтому легче юзать готовые тулзы типа YARA-сканеров или «Фенрира», который тоже написан на Bash и требует на вход только список файлов с айоками.
Все это актуально и для поиска агентов C2-серверов. Таких агентов для Linux есть уже не один десяток. К сожалению, часть их детектируется только при анализе трафика (по строкам User-Agent
или отпечаткам JA3/JARM), и без специальных тулз или отдельных СЗИ нам тут не обойтись. Для локального анализа в таком случае потребуется установка отдельных утилит и создание дампа трафика (tcpdump).
Анализ мест для закрепления
Вместо этого давай поищем аномалии в типичных местах закрепления и автозапуска программ. Начинающие хакеры так и гуглят: how autostart program linux. Почти все команды из списка ниже рекомендуем запускать через sudo.
# Аналог планировщика на основе системных таймеровsystemctl list-timers
# Более подробный вывод с примечаниямиsystemctl status *timer
# Текущий статус служб и сервисов. Аналог в некоторых дистрибутивах: chkconfig --list или просто вывод всех доступных сервисов — systemctl -allsudo systemctl status –-all
# Закрепление в виде сервиса. Делаешь скрипт сервисом — вот и закрепилсяsystemctl list-unit-files --type=service
# Легаси-вариант, статус работы всех службsudo service --status-all 2>/dev/null
# Вывод конфигураций всех сервисовcat /etc/systemd/system/*.service
# Список запускаемых сервисов, например ssh, networking, anacronls -la /etc/init 2>/dev/null
# Сценарии запуска и остановки демонов в ОС — можно поискать в конфигах специфические артефактыls -la /etc/init.d 2>/dev/null
При подозрении, что вредонос все еще работает:
# Следующая команда выводит огромный список всех открытых файлов в системе с указанием процессов, перенаправим в отдельный файл. Полезно, если вредонос активничает на компеlsof >> lsof_file
# Вывод активных модулей, которые пытались загрузиться в памятьsystemctl list-units
# Все модули с указанием текущего состояния файлов модулей; можно отдельно посмотреть модули ядра: cat /etc/modules.conf и cat /etc/modprobe.d/*systemctl list-unit-files
Эмуляция C2 через cron
Планировщик задач cron — довольно палевное место. Для эмуляции аномальной активности создадим задачу на запуск пинга нашего C&C-сервера (возьмем простой — DNS canary token). Задача будет запускаться после ребута раз в 100 с.
После перезагрузки получаем алерт, то есть механизм рабочий. Давай сообразим, какие команды понадобятся для проверки схожих с cron мест залегания малвари.
Добавляем команды в скрипт:
# Вывод запланированных задач текущего юзераcrontab -l# Вывод запланированных задач для всех юзеровsudo for user in $(ls /home/); do echo $user; crontab -u $user -l; done# Планировщик задач. Автозагрузка — неплохое место для закрепления вредоноса в системеls -la /etc/cron*# В том числе файлы cron.daily|hourly|monthly|weekly и список пользователейcat /etc/cron*/*# Вывод запланированных задачcat /etc/crontab
# Лог планировщикаcat /var/log/cron.log*# Чтение сообщений об ошибках от планировщика заданий cronsudo cat /var/mail/root 2>/dev/null
Изысканные локации
Не кроном единым, можно посмотреть задачи в бэкграунде и сообщения о выполнении задач.
# Вывод jobscat /var/spool/at/*# Файлы deny|allow со списками юзеров, которым разрешено в cron или jobscat /etc/at.*# Вывод задач Anacroncat /var/spool/anacron/cron.*# Вывод задач в бэкграундеls -la /var/spool/cron/atjobs 2>/dev/null
cat /var/spool/cron/** # и их конфиговfor usa in $usersdo # Проверяем сообщения cat /var/mail/$usa 2>/dev/null
done
Пользовательские скрипты в автозапуске:
# /etc/rc.local — legacy-скрипт, который выполняется перед логономcat /etc/rc*/*cat /etc/rc.d/*
Суровые привилегированные вредоносы не стесняются прописаться через GRUB. Можно просмотреть загрузчик на предмет странных конструкций, в первую очередь нас интересуют программы, которые запускаются после окончания загрузки ядра (конструкции вида init=..
). Для изучения подробностей загрузим список всех разделов и их идентификаторов (UUID) из fstab.
Смотрим настройки GRUB. В некоторых дистрибутивах путь /
:
sudo cat /boot/grub/grub.cfg 2>/dev/null
Файл fstab
содержит информацию о файловых системах и устройствах хранения, могут попасться и списки шифрованных томов, а иногда креды или пути к ним.
cat /etc/fstab 2>/dev/null
Любителям графики
Рассмотрим автозагрузку графических приложений. При ее настройке ты можешь добавить триггеры на вход и выход пользователей, перезагрузку системы. Например, чтобы при входе сразу открывался браузер и мессенджер. В нашем «злом» демо будем запускать браузер и одновременно открывать порт для коммуникации с С2-сервером малвари.
Сохраним и проверим. После логона запустился браузер и открылся порт.
В текстовые конфиги таких автозагрузочных файлов можно прописать выполнение произвольной команды (параметр Exec
).
Учтем проверку таких файлов в скрипте — мало ли, кто или что в них могло прописаться:
# Автозагрузка графических приложений (файлы с расширением .desktop)ls -la /etc/xdg/autostart/* 2>/dev/null
# Для быстрого просмотра всех выполняемых команд через автозапускиcat /etc/xdg/autostart/* | grep "Exec="# Автозагрузка в GNOME и KDEcat ~/.config/autostart/*.desktop 2>/dev/null
При анализе выполняемых команд обращай внимание на каталоги /
. Известная хохма: вредоносы иногда переименовывают себя в wget или curl для маскировки.
Файлы настроек
В скрытых файлах (в Linux начинаются с точки) в домашних каталогах пользователей хранятся файлы разных конфигов, они могут содержать полезную информацию о последней активности, сохраненных сессиях и истории команд, набранных в терминале.
Помимо этого, конфиги шелла — одно из излюбленных мест для закрепления вредоносов в системе. Например, могут создаваться поддельные оболочки или при запуске терминала будут автоматически исполняться команды.
Агент питоновского C2-сервера Ares можно поискать и просто в домашних каталогах в виде скрытой папки:
ls -la /home/$name/.ares.
# Если мы рут, запишем все параметры из скрытых файлов его домашнего каталога, включая файл history с историей команд, различные конфиги шелла и другие ништякиsudo cat /root/.* 2>/dev/null
# То же самое — для каждого юзера, у которого есть домашний каталогfor name in $(ls /home)do # У юзеров обычно больше интересных скрытых файлов, включая параметры профиля, шелла cat /home/$name/.* 2>/dev/null
doneif [ -e "/etc/profile" ] ; then # Получаем настройки профиля Bash по умолчанию cat /etc/profile 2>/dev/null
fi# Сохраняем пути к исполняемым файлам шеллов — список доступных в системе шелловcat /etc/shells 2>/dev/null
Популярно закрепление малвари в связке с началом и завершением сессий Bash. Стоит пользователю открыть терминал — и вредонос запускается. Еще забавнее, когда админ решает, что после годового аптайма можно и перезагрузиться, и, когда сессия завершится, срабатывает вредоносный агент. В общем, здесь тебе и автовыполнение команд, и заведение алиасов (вводишь sudo
, а выполняется rm
почему‑то). Кратко остановимся на некоторых добываемых таким образом интересных файлах из домашних каталогов:
-
.
— забираем файлы дефолтных конфигураций шелла, например*profile .
. Вписанные в эти файлы команды выполняются при каждом запуске интерпретатора;bash_profile -
.
— берем историю команд всех пользователей в терминале (если она есть);*history -
.
— параметры Bash при запуске интерактивного шелла и выполнение команд;bashrc -
.
— параметры запуска терминала, выполнение команд;bash_login -
.
— параметры выхода из терминала, выполнение команд;bash_logout -
.
— история команд в Bash;bash_history -
.
— параметры запуска ZSH, если он установлен;zshrc -
.
— история команд ZSH;zsh_history -
.
— в некоторых дистрибутивах тут может быть история команд.history
Тщательно изучи файлы .
(или rc-файлы других шеллов), собранные выше. Поскольку в них прописаны команды, выполняемые при инициализации сессии терминала, они будут автоматически запускаться. Вот тебе пример для реализации такой инъекции:
chmod u+x ~/.hidden/fakesudo
echo "alias sudo=~/.hidden/fakesudo" >> ~/.bashrc
Еще руткит может использовать переопределения функций через LD_PRELOAD
(см. статью «Создаем userland-руткиты в Linux с помощью LD_PRELOAD») и прописывание в файле .
строчки такого типа:
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libgtk3-nocsd.so.0
Профильное закрепление
Чекнем выполняемые при каждом входе пользователя в систему сценарии.
# Получаем стандартные параметры пользовательских профилей, выполняемых при входе в системуcat /etc/profile 2>/dev/null
echo "[Profile parameters: cat /etc/profile.d/*]"# Дополнительные параметры запуска профиля, включая специфические приложенияcat /etc/profile.d/*
Можно сделать скрипт /
примерно такого содержания:
#!/bin/bashTEST=$(cat /etc/passwd)PENTEST=$(ping -c 1 cundcserver.server)export $TESTexport $PENTEST
В качестве C&C-сервера используем Canary token. Когда юзер входит в терминал, прилетает алерт, а в текущих переменных появляются результаты (можно проверить командой set
).
Поэтому добавим в скрипт выгрузку переменных:
set # Переменные шеллаenv # Глобальные переменные ОСprintenv # Все текущие переменные среды# Или strings /proc/<подозрительный PID>/environ — вывод переменных конкретного процессаcat /proc/$$/environ
Триаж артефактов
В завершение работы с этим кейсом стриажим файлы, которые могут помочь вирусным аналитикам при разборе полетов. Такую выгрузку целесообразно проводить только в запущенных случаях, плюс может потребоваться внешний хард. Пробежимся по всем пользовательским папкам и соберем ништяки. Начнем с рута:
# Создаем папку для сохранения пользовательских данныхmkdir -p ./artifacts/share_root
# Копируем ихsudo cp -r /root/.local/share ./artifacts/share_root 2>/dev/null
# Туда может попасть корзина со всем содержимым, поэтому лучше удалить находящиеся в ней файлы (если, конечно, ты не ищешь ее то, что в ней находится)rm -r ./artifacts/share_root/Trash/files 2>/dev/null
# Создаем папку для конфигов рутаmkdir -p ./artifacts/config_root
# Параметры суперпользователяsudo cp -r /root/.config ./artifacts/config_root 2>/dev/null
# Посмотреть сохраненные параметры пользовательских сессийsudo cp -R /root/.cache/sessions ./artifacts/config_root 2>/dev/null
Для юзеров собираем в цикле ровно то же самое, создавая папки с артефактами с хоста для каждого юзера:
# Создаем папку для конфигураций юзеровmkdir -p ./artifacts/config_user
for usa in $usersdo mkdir -p ./artifacts/share_user/$usa cp -r /home/$usa/.local/share ./artifacts/share_user/$usa 2>/dev/null # Включая файл recently-used.xbel, в котором записана информация о запуске последних графических приложений, корзина с ее содержимым и файлы keyringsrm -r ./artifacts/share_user/$usa/Trash 2>/dev/null
rm -r ./artifacts/share_user/$usa/share/Trash/files 2>/dev/null
mkdir -p ./artifacts/cache_user/$usa# Если стоит GNOMEcp -r /home/$usa/.cache/tracker/ ./artifacts/cache_user/$usa 2>/dev/null
cp -r /home/$usa/.local/share/tracker/data/ ./artifacts/cache_user/$usa 2>/dev/null
cat /home/$usa/.local/share/gnome-shell 2>/dev/null
# Если стоит FreeDesktop, можно посмотреть корзину тутcat /home/$usa/.local/share/Trash/info/*.trashinfo
ls -laR /home/$usa/.local/share/Trash/files/*# Также собираем конфигурации приложений каждого юзера:mkdir -p ./artifacts/config_user/$usacp -r /home/$usa/.config ./artifacts/config_user/$usa 2>/dev/null
# Сохраненные пользовательские сессииcp -R ~/.cache/sessions ./artifacts/config_user/$usa 2>/dev/null
done
В самом конце не забываем заархивировать все найденные артефакты:
echo Packing artifacts...
tar --remove-files -zc -f ./artifacts.tar.gz artifacts 2>/dev/null
Готово! На выходе ты получаешь папку со всеми результатами, собранными артефактами и конфигами с анализируемого хоста. Тут специально не приводятся результаты работы каждой команды, ведь если тебе интересно, то сам посмотришь.
Кейс 6. Удаленное проникновение
Есть подозрение, что у нас в системе появился незваный удаленный гость. Давай проверим, так ли это.
# Получим список пользователейif uname -a | grep astra ;# Это вариант запроса для Astra Linux. В других дистрибутивах getent в наших тестах выполнялся бесконечноthen getent passwd {1000..60000} >/dev/null 2>&1
# Сравним с выводом через awk eval getent passwd {$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)..$(awk '/^UID_MAX/ {print $2}' /etc/login.defs)} | cut -d: -f1fi# Однако зачастую мы хотим просто посмотреть реальных пользователей, у которых есть каталоги, где можно порыться. Запишем в переменную для последующей эксплуатацииls /home
# Исключаем папку lost+foundusers=`ls /home -I lost*`echo $users
Приберем к рукам информацию о входах в систему, глянем основные параметры юзеров, узнаем, кто из них может админить.
# Список последних загрузок ОСsudo journalctl --list-boots 2>/dev/null
if [ -e /var/log/btmp ]then # Неудачные попытки входа в систему lastb 2>/dev/null
fiif [ -e /var/log/wtmp ]then # Лог логинов и бутов last -f /var/log/wtmp
fi# Получаем список привилегированных sudo-юзеровsudo cat /etc/sudoers 2>/dev/null
cat /etc/passwd 2>/dev/null # Почему бы и нет?# Юзеры с пустым паролемsudo cat /etc/shadow | awk -F":" '($2 == "") {print $1}' 2>/dev/null
Одна из тактик закрепления доступа — это сохранение ключей SSH. Выгрузка артефактов и настроек SSH помогает выявить подключения к хосту по сохраненным открытым ключам или отпечаткам других хостов. Иногда можно найти приватные ключи хоста, что потом позволит изучить исходившие от него подключения. Это пригодится при расследовании сложных инцидентов с массовыми подключениями.
Смотреть стоит файлы authorized_keys
и known_hosts
, а также сами файлы ключей, генерируемые утилитой ssh-keygen или скопированные внешним хостом через ssh-copy-id. Спросим у рута и у всех пользователей, что у них есть на этот счет:
cat /root/.ssh/* 2>/dev/null
for name in $(ls /home)do cat /home/$name/.ssh/* 2>/dev/null
done
Если полученные ключи не принадлежат известным системам, это может быть плохой новостью. Также проверим попытки удаленного входа через SSH:
sudo journalctl _SYSTEMD_UNIT=sshd.service | grep "error" 2>/dev/null
Входы в систему по SSH можешь посмотреть через lastlog, но полезно и погрепать логи и конфиги:
sudo journalctl | grep ssh # или sshd# Ищем ошибки аутентификацииsudo journalctl | grep ssh | grep -i -A2 -B2 fail
Файловые аномалии
Не забудь посмотреть конфиг для общих папок: вдруг есть открытая шара, через которую и производили пенетрацию?
cat /etc/samba/smb.conf # Конфигcat /var/log/samba/*.log # Логи# Можно дополнительно проверить список текущих общих папокcat /var/lib/samba/usershares/*# Проверим и в списке монтируемых папокmount -l
Далее нужно поискать все файлы, у которых нет владельца или группы, — это характерно при удаленном проникновении на хост и работе через реверс‑шеллы. Опять же для демонстрации ищем только в домашних каталогах.
# При поиске вредоносов рекомендуется искать файлы без владельцаsudo find /root /home -nouser 2>/dev/null
# Или без группыsudo find /root /home -nogroup 2>/dev/null
Спецы CERT Societe Generale также рекомендуют следующие команды:
# Конкурирующая команда для поиска файлов с SUID и GUID find / -uid 0 \( -perm -4000 -o -perm 2000 \) -print# Поиск файлов с нехарактерными названиями, например начинающихся на точку, две точки или пробелfind / -name " *" -print # find / -name ". *" -printfind / -name ".. *" -print# Поиск больших файлов (больше 10 Мбайт) find / -size +10M
# Поиск процессов, инициированных удаленными файламиlsof +L1
Логи и сетка
Для порядка стриажим логи, просто выведем их в файл:
# Вывод всех системных логов. Может быть полезно погрепать специфичные службы и сервисы, ошибки и саксессыsudo journalctl >> journalctlfile
В настройках сети можно посмотреть состояние файрвола. Например, наличие в истории команд, которыми его отключали (ufw
или iptables
), может намекнуть, что в системе происходило что‑то нехорошее. Еще в истории можно поискать такие команды, связанные с отключением сервисов защиты:
service stop apparmor
systemctl disable apparmor
# Просмотр конфигов PAMcat /etc/pam*/*
Если есть подозрение, что где‑то спряталась малварь, то на рабочем хосте можно через iptables блокировать обращения с известными непорядочными юзерагентами, например Ares:
# Блочим обращения от сервера… при условии, что мы сами не сервер и что это не SSLiptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "python-requests/" -j DROP
Выводы
Мы намеренно не собираем дамп памяти, поскольку он, конечно, интересен при работе с зараженной вредоносом‑шифровальщиком машиной, но моментально на месте его проанализировать сложно.
Если у тебя более серьезные подозрения на вредонос (где твой антивирус?), то не забудь просканить YARA-правилами (подробнее о них — в статье «Yara. Пишем правила, чтобы искать малварь и не только») или посмотреть в sigma rules. Для поиска артефактов также есть полезный сборник с поддержкой нескольких ОС: Digital Forensics Artifacts Repository (часть артефактов мы представили здесь).
Совершенствовать эту подборку команд можно бесконечно, а на следующем шаге по‑хорошему следует реализовать обработку собранных данных для их проверки на соответствие compliance. Но это уже будет совсем другой уровень!
Если ты считаешь, что мы что‑то забыли или упустили, не будь терпилой и разнеси нас в комментариях! Будем вместе собирать полезные приемы.
Дополнительная литература
Ресурсы и статьи о закреплении при атаках на Linux:
- Understanding Linux Malware (PDF)
- Linux Persistence Techniques
- MITRE ATT&CK Linux Matrix
- Hunting for Persistence in Linux
- Шпаргалка по persistence. Как надежно прописаться на хосте или выявить факт компрометации
- Закрепление в Linux. Linux Persistence
- Книга «Practical Linux Forensics A Guide for Digital Investigators» Брюса Никкеля
Скрипты и утилиты
- Собирать артефакты из скриптов на Python поможет ресурс FastIR Collector Linux и его наследник fastir_artifacts.
- На чистом шелле: старенький LINReS, LIRES и свеженький unix_collector.
- На нечистом (с зависимостями и другими скриптами): набор Forensics and Ediscovery Scripts, IR_Detect, NBTempo, IR_Tool, ir-rescue, ir-triage-toolkit, очень симпатичный UAC.
- Для Windows можешь посмотреть inquisitor — он близок к нашему скрипту по принципу, только тащит за собой кучу сторонних portable-программ. Также полезно глянуть KAPE.
- Существуют готовые утилиты для триажа, работающие по принципу «скачал, запустил, радуйся». Например, CyLR и varc. Первый полезен для сбора логов и информации из системных директорий. Вторая приблуда собирает дампы процессов и данные из временных и пользовательских каталогов. Если использовать эти утилиты вместе, то почти нет шанса что‑то пропустить.
- Для повышения содержательности логов рекомендуем защитникам настроить auditd, да и потестить Sysmon для Linux не помешает.