Стеганографія повз файли: ховаємо дані прямо в секторах

Невелика передмова

Стеганографія, якщо хтось не пам'ятає, — це приховування інформації в будь-яких контейнерах. Наприклад, у картинках (обговорювалося тут и тут). Можна також приховати дані у службових таблицях файлової системи (про це писалося тут), і навіть у службових пакетах протоколу TCP. На жаль, у всіх цих методів є одна вада: щоб непомітно «вкрапити» інформацію в контейнер, потрібні хитрі алгоритми, що враховують особливості внутрішнього пристрою контейнера. Та й зі стійкістю контейнера до маніпуляцій виникають проблеми: наприклад, якщо трохи підредагувати картинку, прихована інформація втрачається.

Чи можна якось обійтися без хитрих алгоритмів і тонких маніпуляцій з даними, і при цьому забезпечити працездатність контейнера і прийнятний рівень збереження прихованих даних? Забігаючи наперед скажу — так, можна! І навіть утилітку запропоную.

Криваві подробиці методу

Основна ідея проста, як удар кийком по лобі: на диску є області, у яких операційна система ніколи не пише (або пише в поодиноких випадках). Щоб не потрібно було шукати ці області хитрими алгоритмами, скористаємося надмірністю — тобто багато разів продублюємо нашу приховану інформацію по всіх секторах диска. Потім прямо поверх цього благополуччя можна створювати потрібні розділи, форматувати файлові системи, писати файли і ставити ОСі - все одно частина секретних даних збережеться і її можна буде витягти, а багаторазове дублювання допоможе нам скласти зі шматочків вихідне ціле.

Гідність такого методу очевидна: ми не залежимо ні від формату файлів, ні навіть від типу файлової системи, що використовується.

Недоліки теж, гадаю, очевидні:

  • Секретні дані можна буде змінити лише повним перезаписом всього диска, з подальшим відтворенням видимого користувача вмісту. При цьому не можна користуватися софтом, що відтворює диск із образу: він відтворить і попередні секретні дані.
  • Чим більший обсяг секретних даних, тим більша ймовірність втрати частини інформації.
  • Виймання даних із диска може тривати багато часу. Від кількох хвилин до кількох днів (сучасні диски більші).

Тепер перейдемо до частковостей.

Зрозуміло, що якщо просто розмазати секретні дані по всьому диску, то вони будуть приховані тільки від неозброєного погляду. Якщо озброїти погляд, скажімо, редактором диска, то дані будуть у всій красі. Тому дані непогано зашифрувати, щоб не відсвічували. Шифрувати будемо простенько, але зі смаком: за алгоритмом aes256-cbc. Ключ шифрування запитаємо у користувача, хай хороший пароль вигадує.

Наступне питання в тому, як нам відрізнити «правильні» дані від зіпсованих. Тут нам допоможе контрольна сума, та не проста, а SHA1. А що? Для git'а вона досить гарна, отже, і нам підійде. Вирішено: постачаємо кожен збережений фрагмент інформації контрольною сумою, і якщо після розшифровки вона збіглася, значить, розшифровка вдалася.

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

Перевіряємо метод на практиці

Для перевірки візьмемо найпоширеніший носій – флешку. У мене знайшлася старенька на 1 Гб, що цілком підійде для експериментів. Якщо вам, як і мені, спало на думку не паритися з фізичними носіями, а потестувати на файлі — образі диска, то відразу скажу: не вийде. При форматуванні такого «диска» лінукс створює файл заново, і всі сектори, що не використовуються, будуть заповнені нулями.

Як машина з лінуксом, на жаль, довелося скористатися метеостанцією, що валялася на балконі на Raspberry Pi 3. Пам'яті там негусто, тому великих файлів ховати не будемо. Обмежимося максимальним розміром 10 мегабайт. Занадто маленькі файли теж ховати немає сенсу: утилітка пише дані на диск кластерами по 4 Кб. Тому знизу обмежимося файлом в 3 кб - він влазить в один кластер.

Знущатися з флешки будемо поетапно, перевіряючи після кожного етапу, чи читається прихована інформація:

  1. Швидке форматування у форматі FAT16 із розміром кластера 16 кб. Це те, що пропонує зробити Windows 7 із флешкою, на якій відсутня файлова система.
  2. Заповнення флешки будь-яким сміттям на 50%.
  3. Заповнення флешки будь-яким сміттям на 100%.
  4. "Довге" форматування у форматі FAT16 (з перезаписом всього).

Перші два випробування цілком очікувано закінчилися повною перемогою: утиліта змогла успішно витягти 10 мегабайт секретних даних із флешки. А ось після того, як флешку забили файлами під зав'язку, стався збій:

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

Як бачимо, вдалося успішно розшифрувати лише 158 кластерів (632 кілобайти сирих даних, що дає 636424 байти корисного навантаження). Зрозуміло, що 10 мегабайт тут ніяк не набереться, а серед цих кластерів явно є дублікати. Навіть 1 мегабайт таким чином не відновиш. Але можна гарантувати, що 3 кілобайти секретних даних ми відновимо з флешки навіть після того, як її відформатують і запишуть під зав'язку. Втім, досліди показують, що з такої флешки можна витягти файл довжиною 120 кілобайт.

Останнє випробування, на жаль, показало, що флешка перезаписувалася:

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

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

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

Total clusters read: 250752, decrypted: 405

Мегабайт, на жаль, зібрати зі шматочків не вийде, а от кілобайт двісті – запросто.

Ну і звістка про останню, 4-ту перевірку, цього разу радісна: повне форматування такої флешки не призвело до знищення всієї інформації! 120 кілобайт секретних даних чудово влізло в простір, що не використовується.

Зведена таблиця з тестування:

Стеганографія повз файли: ховаємо дані прямо в секторах

Трохи теоретизування: про вільне місце та сектори, що не використовуються.

Якщо ви колись розбивали жорсткий диск на розділи, то могли звернути увагу, що не завжди виходить відвести весь вільний простір на диску. Перший розділ завжди починається з деяким відступом (зазвичай це 1 мегабайт, або 2048 секторів). За останнім розділом теж, буває, залишається невеликий «хвіст» із секторів, що не використовуються. Та й між розділами іноді залишаються проміжки, хоч і рідко.

Іншими словами, на диску є сектори, до яких немає доступу при звичайній роботі з диском, але дані в ці сектори записати можна! Отже, і прочитати теж. З поправкою на те, що ще є таблиця розділів і код завантажувача, які якраз і розташовані в порожній області на початку диска.

Відвернемося на якийсь час від розділів і подивимося на диск з висоти, так би мовити, пташиного польоту. Ось є у нас на диску порожній розділ. Створимо у ньому файлову систему. Чи можна сказати, що якісь сектори на диску залишилися незатертими?

І-і-і — барабанний дріб! Відповідь практично завжди буде – так! Адже у більшості випадків створення файлової системи зводиться до того, що на диск записується лише кілька блоків службової інформації, а в іншому вміст розділу не змінюється.

А ще – суто емпірично – можна припустити, що файлова система не завжди може зайняти весь відведений їй простір до останнього сектора. Наприклад, файлова система FAT16 з розміром кластера в 64 кілобайти, очевидно, не зможе повністю зайняти розділ з розміром, не кратним 64 кілобайтам. Наприкінці такого розділу повинен буде залишитися «хвіст» у декілька секторів, недоступний для зберігання даних. Проте експериментально це припущення підтвердити не вдалося.

Отже, щоб максимізувати місце, доступне під стеганограму, потрібно використовувати файлову систему з більшим розміром кластера. Можна ще створити розділ, навіть якщо це необов'язково (на флешці, наприклад). Створювати порожні розділи або залишати нерозподілені області не потрібно — це приверне увагу громадян, які цікавляться.

Утиліта для експериментів

Вихідники утиліти можна помацати тут

Для складання потрібно Qt версії 5.0 і вище і OpenSSL. Якщо щось не збирається, можливо, доведеться підправити файл steganodisk.pro.

Можна змінити розмір кластера з 4 Кб на, скажімо, 512 байт (в secretfile.h). При цьому зростуть витрати на службову інформацію: заголовок та контрольна сума займають фіксовані 68 байт.

Запускати утиліту потрібно, звісно, ​​з правами користувача root, причому з обережністю. Жодних питань перед перезаписом вказаного файлу чи пристрою не буде!

Насолоджуйтесь.

Джерело: habr.com

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