habrahabr

Восстановление удаленных данных с помощью Scalpel

  • четверг, 8 января 2015 г. в 02:11:04
http://habrahabr.ru/post/247421/

У каждого человека в жизни возникает такая ситуация как rm -rf на той папке, где этого не следовало делать. Бекапы это хорошо, но что делать если их нет? Для Linux систем существует утилита Scalpel, которая позволяет восстановить удалённые файлы по заданным паттернам, включая применение регулярных выражений.

Scalpel является форком проекта Foremost (с версии 0.69), начавший свою историю с 2005 года. Имеет свой github репозиторий и является более быстрым по скорости восстановления данных, а также эффективности чем Foremost. Говоря о разнице этих двух проектов можно сказать, что вышедшая после версии 0.69 Foremost имеет новые семантические техники восстановления данных. К примеру при восстановлении JPEG файлов используется заголовок этого файла для вычисления соответствующего тела изображения, когда Scalpel просто возьмет данные между заданными сигнатурами завершения и начала файла изображения. Таким образом можно сказать, что Foremost более точно может восстановить потерянные данные, когда Scalpel сделает это значительно быстрее.

Возможности которые предоставляет Scalpel:

  1. Восстановление независимо от файловой системы
  2. Выставление минимального и максимального размеров восстанавливаемого файла
  3. Использование многопоточности на многоядерных системах
  4. Асинхронные операции ввода/вывода дающие прирост при поиске по шаблону
  5. Использование TRE регулярных выражений для поиска по началу и концу файла
  6. Возможность восстановления из вложенных структур данных
  7. Для гиков доступна возможность использования GPU, что доступно только для Linux и требует предустановленного NVIDIA CUDA SDK и небольших модификаций исходного кода (поиск c применением регулярных выражений не работает с GPU)

Scalpel как правило доступен среди пакетов соответствующего дистрибутива Linux, но также можно собрать его из сырцов забрав с репозитория гитхаба.

Настройка приложения осуществляется в файле /etc/scalpel/scalpel.conf, где задаются соответствующие шаблоны поиска файлов. В нём можно увидеть уже готовые пресеты для поиска, к примеру по изображениям или doc файлам. Для восстановления потерянных данных следует раскомментировать соответствующие шаблоны и запустить приложение.

Если в файле отсутствует шаблон нужного файла, или к примеру вы ищете какого-то определенного формата xml то возникает необходимость создания своего шаблона, который описывается подобно правилам представленным ниже
Type Case sensitive Size range Header Footer Search option
avi y 50000000 RIFF????AVI
doc y 10000000 \xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00 \xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00 NEXT
pdf y 500000 %PDF %EOF\x0d REVERSE
pdf y 500000 %PDF %EOF\x0a REVERSE
tex y 300:50000 /%.{1,20}\.tex/ /%.{1,20}\.tex\sEnd/
php y 100000 <?php ?> REVERSE
Вкратце о колонках

  • Type – имеет значение только в контексте программы, никакого отношения к восстанавливаемым файлам не имеет и будет использовано только при отображении лога и названии директорий в востановленных данных. Можно не указывать, в таком случае просто поставить NONE
  • Case sensitive – учитывать ли регистр при поиске по заданному шаблону
  • Size range – если указано просто число, то максимальный размер искомого файла, если через двоеточие то min:max размер файла
  • Header, Footer – шаблоны поиска начала и конца файла. Допустимо использование TRE регулярных выражений. В качестве пробела используется символ \s, также можно использовать шестнадцатричное и восьмеричное представление искомых данных к примеру \x[0-f][0-f] или \[0-3][0-7][0-7]

Важно отметить, что в качестве последнего поля Search option допустимы значения:

  • REVERSE — данный параметр следует использовать если в файле может использоваться несколько завершающих паттернов. К примеру PDF файлы или PHP, в которых может быть несколько скриптов обрамленных в <?php… ?>
  • NEXT — применяется когда нужно получить данные между началом и первым завершением файла, если конец файла не обнаружен тогда будет взята область размером указанным в поле size
  • FORWARD_NEXT — является стандартным вариантом поведения и его указание не является обязательным. В этом варианте происходит строгая проверка шаблона, и если найдено начало файла и не найдено его завершение в заданном размере памяти то данный участок исключается из результатов поиска, если только не указана опция -b при запуске программы, тогда будет взят участок указанного размера с соответствующим началом, а в лог работы приложения [audit.txt] будет написано об обрезанном файле (колонка chop)

Заметка
В случае если вам нужно использовать знак вопроса "?" как искомую величину в составе заголовка или конца файла, тогда вам нужно переопределить wildcard символ, которым и является знак вопроса. Для этого нужно в начале конфигурационного файла написать
wildcard S
Где S новое обозначение wildcard символа в искомом выражении, или же воспользоваться шестнадцатричным представлением данного символа, что эквивалентно \0x3f или \063

А теперь практика

Предположим мы удалили файлы которые описываются шаблонами в таблице выше. Запишем эти шаблоны в конфигурационный файл (в качестве разделения колонок используется символ табуляции) /etc/scalpel/scalpel.conf и запустим восстановление (мной был заранее заготовлен образ с данными для восстановления)

root# scalpel MyDrive.img -o recover

Written by Golden G. Richard III, based on Foremost 0.69.

Opening target "/home/username/Documents/repair_files/test/MyDrive.img"

Image file pass 1/2.
MyDrive.img: 100.0% |*****************************************************|  500.0 MB    00:00 ETA 
Allocating work queues...
Work queues allocation complete. Building carve lists...
Carve lists built.  Workload:
avi with header "\x52\x49\x46\x46\x3f\x3f\x3f\x3f\x41\x56\x49" and footer "" --> 1 files
doc with header "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00" and footer "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00" --> 2 files
pdf with header "\x25\x50\x44\x46" and footer "\x25\x45\x4f\x46\x0d" --> 33 files
pdf with header "\x25\x50\x44\x46" and footer "\x25\x45\x4f\x46\x0a" --> 19 files
php with header "\x3c\x3f\x70\x68\x70" and footer "\x3f\x3e" --> 8 files
Carving files from image.
Image file pass 2/2.
MyDrive.img: 100.0% *****************************************************|  500.0 MB    00:00 ETA
Processing of image file complete. Cleaning up...
Done.
Scalpel is done, files carved = 63, elapsed = 6 seconds.

После завершения исполнения в результирующей папке мы обнаружим найденные файлы и audit.txt в котором будет краткая информация о найденных файлах подобно представленному ниже

Scalpel version 1.60 audit file
Started at Wed Jan  7 12:50:52 2015
Command line:
scalpel MyDrive.img -o recover 

Output directory: /home/username/Documents/repair_files/test/recover
Configuration file: /etc/scalpel/scalpel.conf

Opening target "/home/username/Documents/repair_files/test/MyDrive.img"

The following files were carved:
File		  Start			Chop		Length		Extracted From
00000003.pdf       549888		NO             4162		MyDrive.img
00000055.php      1227776		NO            99954		MyDrive.img
00000001.doc      8916992		YES        10000000		MyDrive.img

Также обратим внимание на некоторые доступные опции
-p при использовании данной опции файлы не будут восстановлены, но будет создан файл аудита, в котором можно будет просмотреть какие файлы будут восстановлены
-q с данной опцией scalpel будет сканировать только начало каждого кластера заданного размера и искать соответствующее начало искомого файла
-v verbose режим
-o указать каталог куда будет положен результат восстановления данных

Всем удачного восстановления данных!



Полезные ссылки
  1. Github репозиторий Scalpel
  2. Scalpel: A Frugal, High Performance File Carver. Golden R. Richard III, Vassil Roussev
  3. SANS Institute InfoSec reading room: data carving concepts
  4. TRE Regex Syntax