Elcomsoft

Elcomsoft

@Mark_a xss.is

Форензика в Linux. Дампим память, диски и сетевые коннекты для дальнейшего поиска улик

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

Это новая часть цикла по форензике для новичков, в котором мы рассказываем о том, что такое цифровая форензика, разбираем наиболее популярные инструменты анализа, изучаем несколько кейсов на устройствах с Android и расследуем хищение денежных средств из системы ДБО на ноутбуке с Windows 10.

Предыдущие статьи цикла:

  1. «Теория, книги, курсы, полезные материалы»
  2. «Находим источники данных, ищем и анализируем артефакты»
  3. «Android под колпаком. Как раскрывают кейсы взлома мобильных устройств»
  4. «Тайна казначейского ноутбука. Используем форензику, чтобы раскрыть ограбление»

Есть много вариантов создания дампа содержимого жесткого диска или оперативной памяти. При этом можно использовать и нативные утилиты, входящие в состав дистрибутива, и сторонние программы — как со свободной лицензией, так и коммерческие. Я по возможности сосредоточусь на наиболее известных, максимально простых и рабочих инструментах.

Первым делом на «живые» системы я рекомендую ставить утилиту Auditd — с ее помощью можно получить детальные сведения об изменениях системы в режиме аудита.

Прежде всего нас будут интересовать такие события, как:

  • запуск и завершение работы системы (перезагрузка, остановка);
  • чтение/запись системных файлов и изменение прав доступа к ним;
  • инициация сетевого соединения и изменение сетевых настроек;
  • изменение информации о пользователе или группе;
  • изменение даты и времени;
  • установка, удаление, запуск и остановка программ и демонов;
  • выполнение системных вызовов.

Также рекомендую настроить системный syslog.conf и скорректировать правила сбора сообщений: увеличить глубину собираемых алертов (уровень 7) и пул источников (диапазон от 0 до 15). Это все позволит наблюдать за изменениями системы в реальном времени.

Некоторые особенности форензики в 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;
  • список загруженных модулей ядра.

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

Поскольку железо, на котором крутится вся ферма, находится в надежном дата-центре, сразу отметается поиск артефактов, связанных с сетевой ФС (NFS), локально смонтированными устройствами и подключенными по USB девайсами.

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

Снимаем образ HDD

Посекторную копию жесткого диска вполне можно снять, не прибегая к дополнительным утилитам. Мы будем использовать старую и проверенную в работе нативную тулзу dd. Она позволяет создавать точные побитовые копии — как целых дисков, так и отдельных разделов и даже просто файлов.

Снятие образов дисков и работа с ними штатными средствами системы может привести к непреднамеренной записи, что в серьезной криминалистике исключено. Подробности читай в статье «Тулкит для форензики» (раздел «Как не наследить следопыту»). Используй команды ниже, только если считаешь, что в твоем случае это допустимо.

Но первоначально запросим у системы полный список разделов с помощью команды fdisk:

Код:


$ fdisk -l



Просмотр списка файловых систем

Базовый синтаксис dd выглядит так:

Код:


$ dd if=<source> of=<destination> bs=<byte size>

К примеру, для создания копии HDD с размером кластера 512 байт:

Код:


$ dd if=/dev/sda1 of=/dev/sdb1 bs=512

В процессе копирования HDD могут быть поврежденные сектора. Чтобы программа не спотыкалась о них и не останавливала работу, необходимо добавить дополнительный ключ -noerror:

Код:


$ 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. Их-то я и буду использовать.

Пара слов о Rekall. Это отдельная ветвь развития известного фреймворка Volatility Framework, которая написана на Python и предназначена специально для включения в форензик-дистрибутивы, работающие с Live CD.

Переходим в каталог с тулзой и собираем ее из исходников:

Код:



$ cd rekall/tools/linux/
$ make

Грузим драйвер ядра pmem.ko в оперативную память:

Код:


$ sudo insmod pmem.ko

Проверяем инициализацию драйвера:

Код:


$ sudo lsmod

После этого драйвер создает файл-контейнер под наш будущий образ RAM: /dev/pmem.

Теперь с помощью все той же утилиты 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

Пример создания дампа сетевого трафика по протоколам FTP или SSH на интерфейсе eth0:

Код:



$ tcpdump -s 0 port ftp or ssh -i eth0 -w forensic_cap.pcap

Дампим вообще все, что идет на интерфейс eth0:

Код:



$ tcpdump -w forensic_cap -i eth0



Результат работы tcpdump

Еде одна годная для наших целей утилита — это TCPflow. По сути, более продвинутый вариант tcpdump, который поддерживает еще больше параметров фильтрации и возможность восстанавливать «сломанные» пакеты.

Если TCPflow по умолчанию нет в системе, то для начала ставь пакет tcpflow.

Далее базовый синтаксис команды выглядит так:

Код:


$ tcpflow [опции] [выражение] [хост]

А вот описание опций:

  • -c — только консольная печать (не создавать файлы);
  • -d — уровень отладки (по умолчанию 1);
  • -e — выводить каждый поток чередующимися цветами (синий — клиент-сервер, красный — сервер-клиент, зеленый — неизвестно);
  • -i — сетевой интерфейс для прослушивания;
  • -r — чтение пакетов из выходного файла tcpdump;
  • -s — удалить непечатаемые символы (будут заменяться точками).

Пример сбора данных, идущих из внешней сети на наш сервер:

Код:


$ tcpflow -ce host  <IP-адрес нашего хоста>

Собираем весь трафик HTTP в нашей сети:

Код:


$ tcpflow -ce port 80

Дамп данных сетевого потока в локальную папку:

Код:


$ mkdir tcpflowdata  
$ cd tcpflowdata  
$ tcpflow host <IP-адрес целевой машины>

Теперь в директорию /tcpflowdata будут складываться файлы с содержанием сетевых подключений. Все, что нам потом останется сделать, — это перекинуть их для анализа в парсер.



Результат работы TCPflow

Получаем доступ к собранным данным

Образы жестких дисков и оперативки готовы. Теперь нам нужно их смонтировать на исследовательской машине, чтобы начать искать и изучать артефакты. С образом HDD все просто, выходной файл, полученный в результате работы dd или dcfldd, можно легко подмонтировать как новое устройство.

Синтаксис команды mount выглядит так:

Код:


$ mount -o,ro,noatime,loop,offset= <смещение по началу партиции в байтах> <имя файла образа> <точка монтирования>

К примеру, чтобы смонтировать ранее снятый дамп HDD, нужно выполнить команду

Код:


$ mount -o,ro,loop forensic_disk_image.dd /mnt/temp/

Образ RAM будем открывать с помощью Volatility Framework, но об этом поговорим чуть ниже, в разделе «Поиск артефактов».

Файл .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}

И создадим timestamp или временную шкалу:

Код:



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

Код:


arp -n > arp_n.txt
ip neigh show > ip_neigh_show.txt

Захватить состояние текущих правил сетевого фильтра iptable

Код:


// --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

Дамп ipsets (обычно используется fail2ban и firewalld)

Код:


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

Сохранить исходное местоположение исполняемого файла по PID

Код:


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}

Выводы

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

:)


Report Page