Форензика в Linux. Дампим память, диски и сетевые коннекты для дальнейшего поиска улик
Первая задача в цифровой криминалистике — это сбор информации, конкретно — получение образов жестких дисков и оперативной памяти, а также, если это может помочь, дампов сетевых соединений. В этой статье мы посмотрим, что нужно сделать для получения всего этого на машинах с Linux, а заодно научимся и другим полезным навыкам.
Это новая часть цикла по форензике для новичков, в котором мы рассказываем о том, что такое цифровая форензика, разбираем наиболее популярные инструменты анализа, изучаем несколько кейсов на устройствах с Android и расследуем хищение денежных средств из системы ДБО на ноутбуке с Windows 10.
Предыдущие статьи цикла:
Первым делом на «живые» системы я рекомендую ставить утилиту Auditd — с ее помощью можно получить детальные сведения об изменениях системы в режиме аудита.
Прежде всего нас будут интересовать такие события, как:
Некоторые особенности форензики в Linux
В прошлой статье, которая была посвящена кейсу с хищением денежных средств в ДБО на Windows 10, мы по возможности использовали в качестве инструментария программы с графическим интерфейсом. Если не брать проприетарные решения, такие, к примеру, как EnCase Forensic или Belkasoft Evidence Center, то на Linux большинство рабочих утилит идет в режиме командной строки.
Использование тестовых команд существенно экономит время на манипуляции с софтом, но, с другой стороны, может оказаться слишком сложным для новичков. Однако форензикой новички обычно и не занимаются!
Помимо отдельных утилит, есть целые дистрибутивы, предназначенные для цифровой криминалистики. Это прежде всего DEFT, CAINE, Sumuri PALADIN, Helix, ну и, конечно же, всем известный Kali Linux. Полный обзор дистрибутивов и тулкитов для форензики можно прочитать в статье «Тулкит для форензики. Выбираем дистрибутив и набор софта для криминалистического анализа».
Из литературы по форензике в Linux я бы в первую очередь порекомендовал едва ли не единственную полноценную книгу об этом. Ее написал Филип Полстра, а называется она Linux Forensics Paperback. Во вторую очередь — издание UNIX and Linux Forensic Analysis DVD Toolkit Криса Пога и других. Ну и в-третьих, Digital Forensics with Kali Linux.
Общий чек-лист проверки
Для поиска и сбора криминалистических доказательств мы первым делом создадим образы (дампы) следующих объектов наших систем:
Поскольку железо, на котором крутится вся ферма, находится в надежном дата-центре, сразу отметается поиск артефактов, связанных с сетевой ФС (NFS), локально смонтированными устройствами и подключенными по USB девайсами.
Всегда хорошо обдумывай, какое именно действие и для какой цели ты делаешь. Неправильное использование приведенных в тексте статьи программ может привести к потере информации (артефактов) или искажению полученных данных (криминалистических доказательств). Ни автор, ни редакция не несут ответственности за любой ущерб, причиненный при неправильном использовании материала данной статьи.
Снимаем образ HDD
Посекторную копию жесткого диска вполне можно снять, не прибегая к дополнительным утилитам. Мы будем использовать старую и проверенную в работе нативную тулзу dd. Она позволяет создавать точные побитовые копии — как целых дисков, так и отдельных разделов и даже просто файлов.
Снятие образов дисков и работа с ними штатными средствами системы может привести к непреднамеренной записи, что в серьезной криминалистике исключено. Подробности читай в статье «Тулкит для форензики» (раздел «Как не наследить следопыту»). Используй команды ниже, только если считаешь, что в твоем случае это допустимо.
Но первоначально запросим у системы полный список разделов с помощью команды fdisk:
Просмотр списка файловых систем
Базовый синтаксис dd выглядит так:
К примеру, для создания копии HDD с размером кластера 512 байт:
В процессе копирования HDD могут быть поврежденные сектора. Чтобы программа не спотыкалась о них и не останавливала работу, необходимо добавить дополнительный ключ -noerror:
Результат работы утилиты dd
Однако лучшие мировые практики — это использовать усовершенствованный вариант предыдущей утилиты под названием dcfldd. Эта тулза разработана в компьютерной судебной лаборатории DCFL и имеет ряд специальных опций для снятия дампов с целью криминалистического анализа. Например, dcfldd умеет хешировать копируемые данные и проверять их целостность. По ходу дела отображается прогресс создания дампа, действия заносятся в лог, а контрольные суммы MD5 сохраняются в отдельный файл.
Пример выполнения команды:
Результат работы утилиты dcfldd
Вместо консоли при желании можно пользоваться графической версией уже известной нам по прошлой статье утилиты FTK.
Делаем дамп оперативной памяти
Как и в случае с жестким диском, существует несколько способов решить эту задачу. Среди вариантов:
Переходим в каталог с тулзой и собираем ее из исходников:
Грузим драйвер ядра pmem.ko в оперативную память:
Проверяем инициализацию драйвера:
После этого драйвер создает файл-контейнер под наш будущий образ RAM: /dev/pmem.
Теперь с помощью все той же утилиты dd создаем сам образ оперативной памяти системы:
Ну и после завершения работы выгружаем драйвер:
Дело сделано!
Сетевой трафик на анализ
Здесь в ходу несколько утилит: прежде всего — консольная tcpdump, классика жанра Wireshark и опенсорсный фреймворк XPLICO, хотя последний больше используется для последующего анализа данных, чем для их первоначального сбора. Для тех, кто раньше не сталкивался с этими программами, у нас есть неплохие обучающие статьи по ним: «Проводим аудит сетевого трафика с помощью tcpdump» и «Как использовать возможности фильтров отображения Wireshark по максимуму».
Начнем с tcpdump. Базовый вызов команды выглядит следующим образом:
А вот некоторые наиболее важные опции:
Пример создания дампа сетевого трафика по протоколам FTP или SSH на интерфейсе eth0:
Дампим вообще все, что идет на интерфейс eth0:
Результат работы tcpdump
Еде одна годная для наших целей утилита — это TCPflow. По сути, более продвинутый вариант tcpdump, который поддерживает еще больше параметров фильтрации и возможность восстанавливать «сломанные» пакеты.
Если TCPflow по умолчанию нет в системе, то для начала ставь пакет tcpflow.
Далее базовый синтаксис команды выглядит так:
А вот описание опций:
Собираем весь трафик HTTP в нашей сети:
Дамп данных сетевого потока в локальную папку:
Теперь в директорию /tcpflowdata будут складываться файлы с содержанием сетевых подключений. Все, что нам потом останется сделать, — это перекинуть их для анализа в парсер.
Результат работы TCPflow
Получаем доступ к собранным данным
Образы жестких дисков и оперативки готовы. Теперь нам нужно их смонтировать на исследовательской машине, чтобы начать искать и изучать артефакты. С образом HDD все просто, выходной файл, полученный в результате работы dd или dcfldd, можно легко подмонтировать как новое устройство.
Синтаксис команды mount выглядит так:
К примеру, чтобы смонтировать ранее снятый дамп HDD, нужно выполнить команду
Образ RAM будем открывать с помощью Volatility Framework, но об этом поговорим чуть ниже, в разделе «Поиск артефактов».
Файл .pcap с дампом сетевых подключений открывается в Wireshark или XPLICO. Но я предпочитаю пользоваться сервисами с полуавтоматическим парсингом, например PacketTotal, Pcap Analyzer или платным CloudShark.
Другие полезные команды
Вот несколько команд, которые помогут дособрать все, что мы могли пропустить. Некоторые вещи — просто на всякий случай, потому что это не займет много времени.
Мгновенно получить состояние системы и основные характеристики конфигурации
Перемонтировать все файловые системы только для чтения
Для каждой файловой системы, которую мы будем ковырять, перемонтируем в режиме ro:
И создадим timestamp или временную шкалу:
Получить состояние существующих подключений и открытых сокетов
Текущий дамп кеша ARP
Захватить состояние текущих правил сетевого фильтра iptable
Дамп ipsets (обычно используется fail2ban и firewalld)
Сохранить таблицу процессов
Другой вариант с более читабельным выводом:
Сохранить исходное местоположение исполняемого файла по PID
Посмотреть все открытые в системе файлы
Если файл был удален, то команда ls добавит флаг (deleted) к имени файла назначения. К содержимому все еще можно будет получить доступ, используя символические ссылки в /proc/${PID}/fd. Это часто помогает в работе с вредоносами, написанными на интерпретируемых языках, таких как Perl и Python. Поэтому для дальнейшего анализа мы сохраним все открытые файлы:
Выводы
Теперь у нас есть все необходимое для дальнейшего анализа. В следующей, заключительной статье цикла я покажу, что делать с полученными данными, чтобы найти в них артефакты. А чтобы было веселее, я припас для тебя интересный кейс с поиском заразы, которая завелась на серверах хостинг-провайдера. В общем, оставайся с нами!
Автор: Иван Пискунов aka g14vano
хакер.ру
Первая задача в цифровой криминалистике — это сбор информации, конкретно — получение образов жестких дисков и оперативной памяти, а также, если это может помочь, дампов сетевых соединений. В этой статье мы посмотрим, что нужно сделать для получения всего этого на машинах с Linux, а заодно научимся и другим полезным навыкам.
Это новая часть цикла по форензике для новичков, в котором мы рассказываем о том, что такое цифровая форензика, разбираем наиболее популярные инструменты анализа, изучаем несколько кейсов на устройствах с Android и расследуем хищение денежных средств из системы ДБО на ноутбуке с Windows 10.
Предыдущие статьи цикла:
- «Теория, книги, курсы, полезные материалы»
- «Находим источники данных, ищем и анализируем артефакты»
- «Android под колпаком. Как раскрывают кейсы взлома мобильных устройств»
- «Тайна казначейского ноутбука. Используем форензику, чтобы раскрыть ограбление»
Первым делом на «живые» системы я рекомендую ставить утилиту Auditd — с ее помощью можно получить детальные сведения об изменениях системы в режиме аудита.
Прежде всего нас будут интересовать такие события, как:
- запуск и завершение работы системы (перезагрузка, остановка);
- чтение/запись системных файлов и изменение прав доступа к ним;
- инициация сетевого соединения и изменение сетевых настроек;
- изменение информации о пользователе или группе;
- изменение даты и времени;
- установка, удаление, запуск и остановка программ и демонов;
- выполнение системных вызовов.
Некоторые особенности форензики в Linux
В прошлой статье, которая была посвящена кейсу с хищением денежных средств в ДБО на Windows 10, мы по возможности использовали в качестве инструментария программы с графическим интерфейсом. Если не брать проприетарные решения, такие, к примеру, как EnCase Forensic или Belkasoft Evidence Center, то на Linux большинство рабочих утилит идет в режиме командной строки.
Использование тестовых команд существенно экономит время на манипуляции с софтом, но, с другой стороны, может оказаться слишком сложным для новичков. Однако форензикой новички обычно и не занимаются!
Помимо отдельных утилит, есть целые дистрибутивы, предназначенные для цифровой криминалистики. Это прежде всего DEFT, CAINE, Sumuri PALADIN, Helix, ну и, конечно же, всем известный Kali Linux. Полный обзор дистрибутивов и тулкитов для форензики можно прочитать в статье «Тулкит для форензики. Выбираем дистрибутив и набор софта для криминалистического анализа».
Из литературы по форензике в Linux я бы в первую очередь порекомендовал едва ли не единственную полноценную книгу об этом. Ее написал Филип Полстра, а называется она Linux Forensics Paperback. Во вторую очередь — издание UNIX and Linux Forensic Analysis DVD Toolkit Криса Пога и других. Ну и в-третьих, Digital Forensics with Kali Linux.
Общий чек-лист проверки
Для поиска и сбора криминалистических доказательств мы первым делом создадим образы (дампы) следующих объектов наших систем:
- оперативная память (системные и пользовательские процессы, демоны, возможно запущенный вредоносный код и так далее);
- жесткий диск (посекторная копия HDD, включающая удаленные разделы, неразмеченные области диска, потертые файлы, скрытые файлы и директории и прочее);
- сетевой стек (поднятые коннекты, открытые порты, «неизвестные» сервисы на портах, паразитный трафик).
- на список пользователей, группы, привилегии;
- запущенные от имени root процессы;
- задачи, запускаемые по расписанию (cron jobs);
- файлы с установленным битом SUID и SGID;
- состав файла /etc/sudoers;
- скрытые файлы и директории;
- файлы, открытые на чтение в системе;
- сетевые интерфейсы, соединения, порты, таблицу маршрутизации;
- логи iptables, fail2ban (Reports, Alarms, Alerts);
- конфигурацию /etc/ssh/sshd_config;
- логи демона Syslog (проверим на типичные алерты);
- состояние SELinux;
- список загруженных модулей ядра.
Поскольку железо, на котором крутится вся ферма, находится в надежном дата-центре, сразу отметается поиск артефактов, связанных с сетевой ФС (NFS), локально смонтированными устройствами и подключенными по USB девайсами.
Всегда хорошо обдумывай, какое именно действие и для какой цели ты делаешь. Неправильное использование приведенных в тексте статьи программ может привести к потере информации (артефактов) или искажению полученных данных (криминалистических доказательств). Ни автор, ни редакция не несут ответственности за любой ущерб, причиненный при неправильном использовании материала данной статьи.
Снимаем образ HDD
Посекторную копию жесткого диска вполне можно снять, не прибегая к дополнительным утилитам. Мы будем использовать старую и проверенную в работе нативную тулзу dd. Она позволяет создавать точные побитовые копии — как целых дисков, так и отдельных разделов и даже просто файлов.
Снятие образов дисков и работа с ними штатными средствами системы может привести к непреднамеренной записи, что в серьезной криминалистике исключено. Подробности читай в статье «Тулкит для форензики» (раздел «Как не наследить следопыту»). Используй команды ниже, только если считаешь, что в твоем случае это допустимо.
Но первоначально запросим у системы полный список разделов с помощью команды fdisk:
Код:
$ fdisk -l
Просмотр списка файловых систем
Базовый синтаксис dd выглядит так:
Код:
$ dd if=<source> of=<destination> bs=<byte size>
Код:
$ dd if=/dev/sda1 of=/dev/sdb1 bs=512
Код:
$ dd if=/dev/sda1 of=/dev/sdb1 bs=512 noerror
Результат работы утилиты dd
Однако лучшие мировые практики — это использовать усовершенствованный вариант предыдущей утилиты под названием dcfldd. Эта тулза разработана в компьютерной судебной лаборатории DCFL и имеет ряд специальных опций для снятия дампов с целью криминалистического анализа. Например, dcfldd умеет хешировать копируемые данные и проверять их целостность. По ходу дела отображается прогресс создания дампа, действия заносятся в лог, а контрольные суммы MD5 сохраняются в отдельный файл.
Пример выполнения команды:
Код:
$ dcfldd if=/dev/sda1 hash=md5 of=/media/forensic_disk_image.dd bs=512 noerror
Результат работы утилиты dcfldd
Вместо консоли при желании можно пользоваться графической версией уже известной нам по прошлой статье утилиты FTK.
Делаем дамп оперативной памяти
Как и в случае с жестким диском, существует несколько способов решить эту задачу. Среди вариантов:
- использование нативного модуля ядра Linux Memory Extractor (LiME);
- скрипт Linux Memory Grabber, который не требует установки и который можно запускать, к примеру, с флешки;
- связка утилит lmap и pmem, которые входят в пакет Rekall. Их-то я и буду использовать.
Переходим в каталог с тулзой и собираем ее из исходников:
Код:
$ cd rekall/tools/linux/
$ make
Код:
$ sudo insmod pmem.ko
Код:
$ sudo lsmod
Теперь с помощью все той же утилиты dd создаем сам образ оперативной памяти системы:
Код:
$ dd if=/dev/pmem of=forensic_RAM_image.raw
Код:
$ rmmod pmem
Сетевой трафик на анализ
Здесь в ходу несколько утилит: прежде всего — консольная tcpdump, классика жанра Wireshark и опенсорсный фреймворк XPLICO, хотя последний больше используется для последующего анализа данных, чем для их первоначального сбора. Для тех, кто раньше не сталкивался с этими программами, у нас есть неплохие обучающие статьи по ним: «Проводим аудит сетевого трафика с помощью tcpdump» и «Как использовать возможности фильтров отображения Wireshark по максимуму».
Начнем с tcpdump. Базовый вызов команды выглядит следующим образом:
Код:
$ tcpdump <опции> <фильтр>
- -i интерфейс — задает интерфейс, с которого необходимо анализировать трафик;
- -n — отключает преобразование IP в доменные имена;
- -e — включает вывод данных канального уровня (например, MAC-адреса);
- -v — вывод дополнительной информации (TTL, опции IP);
- -w имя_файла — задает имя файла, в который нужно сохранять собранную информацию (дамп);
- -r имя_файла — чтение (загрузка) дампа из заданного файла;
- -q — переводит tcpdump в «бесшумный режим», в котором пакет анализируется на транспортном уровне (протоколы TCP, UDP, ICMP), а не на сетевом (протокол IP).
Код:
$ tcpdump -s 0 -i eth0 -n -nn -ttt dst host <ip-адрес нашего хоста> -w forensic_cap.pcap
Код:
$ tcpdump -s 0 port ftp or ssh -i eth0 -w forensic_cap.pcap
Код:
$ tcpdump -w forensic_cap -i eth0
Результат работы tcpdump
Еде одна годная для наших целей утилита — это TCPflow. По сути, более продвинутый вариант tcpdump, который поддерживает еще больше параметров фильтрации и возможность восстанавливать «сломанные» пакеты.
Если TCPflow по умолчанию нет в системе, то для начала ставь пакет tcpflow.
Далее базовый синтаксис команды выглядит так:
Код:
$ tcpflow [опции] [выражение] [хост]
- -c — только консольная печать (не создавать файлы);
- -d — уровень отладки (по умолчанию 1);
- -e — выводить каждый поток чередующимися цветами (синий — клиент-сервер, красный — сервер-клиент, зеленый — неизвестно);
- -i — сетевой интерфейс для прослушивания;
- -r — чтение пакетов из выходного файла tcpdump;
- -s — удалить непечатаемые символы (будут заменяться точками).
Код:
$ tcpflow -ce host <IP-адрес нашего хоста>
Код:
$ tcpflow -ce port 80
Код:
$ mkdir tcpflowdata
$ cd tcpflowdata
$ tcpflow host <IP-адрес целевой машины>
Результат работы TCPflow
Получаем доступ к собранным данным
Образы жестких дисков и оперативки готовы. Теперь нам нужно их смонтировать на исследовательской машине, чтобы начать искать и изучать артефакты. С образом HDD все просто, выходной файл, полученный в результате работы dd или dcfldd, можно легко подмонтировать как новое устройство.
Синтаксис команды mount выглядит так:
Код:
$ mount -o,ro,noatime,loop,offset= <смещение по началу партиции в байтах> <имя файла образа> <точка монтирования>
Код:
$ mount -o,ro,loop forensic_disk_image.dd /mnt/temp/
Файл .pcap с дампом сетевых подключений открывается в Wireshark или XPLICO. Но я предпочитаю пользоваться сервисами с полуавтоматическим парсингом, например PacketTotal, Pcap Analyzer или платным CloudShark.
Другие полезные команды
Вот несколько команд, которые помогут дособрать все, что мы могли пропустить. Некоторые вещи — просто на всякий случай, потому что это не займет много времени.
Мгновенно получить состояние системы и основные характеристики конфигурации
Код:
#!/bin/bash
dmesg > dmesg.txt
cat /proc/mounts > proc_mounts.txt
// Собираем контрольные суммы со всех смонтированных на текущий момент устройств
for p in $(md5sum /proc/mounts /proc/*/mounts | sort | uniq -d -w 32 | awk '{print $2}'); do
cat $p > ${p////_};
done
cat /proc/mdstat > proc_mdstat.txt
lspci > lspci.txt
uname -a > uname_a.txt
uptime > uptime.txt
Для каждой файловой системы, которую мы будем ковырять, перемонтируем в режиме ro:
Код:
// set mountpoint
MOUNTPOINT=/home
mount -o remount,ro ${MOUNTPOINT}
Код:
find "${MOUNTPOINT}" -xdev -print0 | xargs -0 stat -c "%Y %X %Z %A %U %G %n" >> timestamps.dat
Код:
// --verbose --wide --extend --timers --program --numeric (--listening)
netstat -v -W -e -o -p -n > netstat_vWeopn.txt
netstat -v -W -e -o -p -n -l > netstat_vWeopnl.txt
// same without --numeric
netstat -v -W -e -o -p > netstat_vWeop.txt
netstat -v -W -e -o -p -l > netstat_vWeopl.txt
Код:
arp -n > arp_n.txt
ip neigh show > ip_neigh_show.txt
Код:
// --verbose --numeric --exact --list --table
for table in filter nat mangle raw; do iptables -v -n -x -L -t ${table} > iptables_vnxL_t${table}.txt; done
for table in filter mangle raw; do ip6tables -n -t ${table} -L -v -x > ip6tables_nt_${table}.txt; done
for table in filter nat broute; do ebtables -t ${table} -L --Lmac2 --Lc > ebtables_L_Lmac_Lc_t_${table}.txt; done
Код:
ipset list > ipset_list.txt
Код:
ps auxwwwe > ps_auxwwwe.txt
Код:
pstree -a -l -p -u > pstree_alpu.txt
pstree -a -l -p -u -Z > pstree_alpuZ.txt
Код:
ls -l /proc/${PID}/ > proc_${PID}_ls_l.txt
cat /proc/${PID}/exe > proc_${PID}_exe
Если файл был удален, то команда ls добавит флаг (deleted) к имени файла назначения. К содержимому все еще можно будет получить доступ, используя символические ссылки в /proc/${PID}/fd. Это часто помогает в работе с вредоносами, написанными на интерпретируемых языках, таких как Perl и Python. Поэтому для дальнейшего анализа мы сохраним все открытые файлы:
Код:
ls -l /proc/${PID}/fd > proc_${PID}_fd.txt
// copy interesting open files, substitute MYFD with file descriptor number
MYFD=1234
cat /proc/${PID}/${MYFD}> proc_${PID}_fd_${MYFD}
Выводы
Теперь у нас есть все необходимое для дальнейшего анализа. В следующей, заключительной статье цикла я покажу, что делать с полученными данными, чтобы найти в них артефакты. А чтобы было веселее, я припас для тебя интересный кейс с поиском заразы, которая завелась на серверах хостинг-провайдера. В общем, оставайся с нами!
Автор: Иван Пискунов aka g14vano
хакер.ру