Відновлення видалених даних з допомогою Scalpel

У кожної людини в житті виникає така ситуація як 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 і невеликих модифікацій вихідного коду (пошук із застосуванням регулярних виразів не працює з 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 Richard G. 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.</pre>
<p>Після завершення виконання в результуючій папці ми виявимо знайдені файли і audit.txt в якому буде коротка інформація про знайдених файлах подібно представленому нижче</p>

<pre>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 Richard R. III, Vassil Roussev
  3. SANS Institute InfoSec reading room: data carving concepts
  4. TRE Regex Syntax

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.