Стеганографія у файловій системі

Привіт Хабр.

Хочу представити вам невеликий проект з стеганографіїзроблений у вільний від навчання час.

Я зробив проект із прихованого зберігання інформації у файловій системі (далі ФС).
Це можна застосувати для крадіжки конфіденційної інформації у освітніх цілях.

Стеганографія у файловій системі

У вигляді дослідного зразка була обрана старенька лінуксова ФС ext2.

Реалізація

Міркування про реалізацію

Якщо добре «роздраконити» стандарт ext2, можна замінити, що у ФС існує так званий Суперблоки, в якому надано основну інформацію про систему. Після мене були знайдені Block Bitmap и Inode Table. Майже відразу народилася ідея запису інформації в порожні блоки ФС. Тепер варто було б продумати захист від програміста, озброєного hex-редактором.

Якщо зберігати інформацію, що приховується, без шифрування, то, навіть незважаючи на її розмитість по ФС, вона все одно занадто впадатиме в очі, особливо якщо програміст знатиме, що слід шукати. Тому було ухвалено рішення шифрувати всі блоки вихідного файлу. Я вибрав блоковий шифр AESАле як ви розумієте, це не важливо.

Для відділення необхідних блоків від інших при читанні у кожен блок було вирішено додати по спеціальному маркеру початку блоку. Цей маркер шифрувався залежно від номера блоку вихідного файлу. Такий прийом відразу дозволив не тільки знаходити потрібні блоки, але і впізнавати їх правильний порядок.

Загальний принцип роботи системи.

Стеганографія у файловій системі

Алгоритм запису

По пунктам:

  • Спочатку записати у вихідну файлову систему будь-яку інформацію;
  • Видалити цю інформацію (не обов'язково всю);
  • Файл для приховання розбити на блоки однакової довжини додавши маркер;
  • Зашифрувати ці блоки;
  • Помістити зашифровані блоки у порожні блоки ФС.

Для любителів блок-схем

Нижче наведено блок-схему алгоритму запису. На вхід алгоритм отримує чотири файли:
-Образ змінної файлової системи;
-Файл, що підлягає стеганографії;
-Файл із ключом шифрування для AES;
-Файл із маркером.
Стеганографія у файловій системі

Відразу варто зазначити, що цей алгоритм має один недолік: після запису файлу у ФС, не можна записувати у ФС щось нове, оскільки будь-яка нова інформація може потрапити в ті блоки, які ми відвели нашому застеганографованому файлу, правда це відкриває можливість «швидкого замітання слідів».

Але досить очевидно, як це можна виправити: необхідно перезаписати алгоритм запису блоків у ФС. Це зрозуміле, але неймовірно трудомістке завдання.
Для Proof Of Consept я це не реалізовував.

В результаті вийдуть наступні зміни до ФС, так виглядає ФС до стеганографії (попередньо було записано аудіофайл).
Стеганографія у файловій системі
А так виглядає ФС із уже застеганографованою інформацією.
Стеганографія у файловій системі

Алгоритм читання

По пунктам:

  • Зі знанням ключа та способу побудови маркерів скласти перші N маркерів, з гарантією що N, помножене на довжину блоку файлової системи більше за застеганографований файл;
  • Здійснити пошук блоків у ФС, що починаються з маркерів;
  • Розшифрувати отримані блоки та відокремити маркери;
  • Зібрати отримані блоки у правильному порядку та отримати вихідний файл.

Для любителів блок-схем

Нижче наведено блок-схему алгоритму запису. На вхід алгоритм отримує три файли:
-Образ файлової системи;
-Файл із ключом шифрування для AES;
-Файл із маркером.
Стеганографія у файловій системі

Після роботи програми з'являється файл Read, який і буде витягнутим із файлу стеганографованої ФС, якщо ключ або маркер були вказані неправильно, то файл Read буде порожній.
(Для любителів красивостей можна вкраплювати не тільки файл, але «шапку», що містить метаінформацію: ім'я файлу, права, час останньої зміни і т.д.)

Автоматизація запуску

Для зручності було написано bash скрипти, що автоматизують запуск на Linux (тестувалося на Ubuntu 16.04.3 LTS).
Розберемо запуск по кроках.
запис:

  1. sudo Copy_Flash.sh "DEVICE" - отримуємо образ ФС з DEVICE (флеш);
  2. ./Write.sh “FILE” “KEY” “MARKER” – створюємо віртуальне оточення, завантажуємо необхідні бібліотеки та запускаємо скіпт на запис;
  3. sudo ./Write_Flash.sh “DEVICE” – записуємо змінену ФС знову на DEVICE.

читання:

  1. sudo Copy_Flash.sh "DEVICE" - отримуємо образ ФС з DEVICE (флеш);
  2. ./Read.sh “KEY” 'MARKER” — створюємо віртуальне оточення, завантажуємо необхідні бібліотеки та запускаємо скіпт на читання;
  3. У поточному каталозі відкриваємо файл Read - це і є інформація, що застеганографована.

Висновок

Даний метод стеганографії, ймовірно, потребує доопрацювання, додаткового тестування та розширення на більш популярні файлові системи, такі як Fat32, NTFS и ext4.
Але метою даної роботи було показати принцип, за допомогою якого можна здійснити приховане зберігання інформації у файловій системі.
За допомогою подібних алгоритмів можна безбоязно зберігати інформацію, і якщо при знанні ключа таку систему зламати можливо не повним перебором (але дуже довгим алгоритмом), то без знання ключа дана система мені є абсолютно стійкою, проте це може бути приводом для окремої статті.

Весь код реалізовано мовою Python версії 3.5.2. приклад роботи представлений на моєму каналі youtube. Повний код проекту викладено на GitHub.
(Так-так, я знаю, що для production версії потрібно писати на чомусь «швидкому», наприклад на Сі 😉 )
У цій реалізації розмір вхідного файлу для стеганографії ні перевищувати 1000 кБ.

Хочу висловити подяку користувачеві PavelMSTU за цінні поради при плануванні дослідження та рекомендації щодо оформлення статті.

Джерело: habr.com

Додати коментар або відгук