Krótka wprowadzenie
Steganografia, jeśli ktoś nie pamięta, to ukrywanie informacji w różnych kontenerach. Na przykład, w obrazach (omawiano to i ). Można również ukryć dane w tabelach systemowych systemu plików (o tym pisano ), a nawet . Niestety, wszystkie te metody mają jedną wadę: aby niezauważalnie "wkomponować" informację w kontener, potrzebne są złożone algorytmy, które uwzględniają specyfikę wewnętrznej budowy kontenera. Problemy pojawiają się również z odpornością kontenera na manipulacje: na przykład, jeśli trochę edytować obraz, ukryta informacja zostaje utracona.
Czy można jakoś obejść się bez skomplikowanych algorytmów i delikatnych manipulacji danymi, a jednocześnie zapewnić sprawność kontenera i akceptowalny poziom ochrony ukrytych danych? Zapowiadając, mogę powiedzieć — tak, to możliwe! A nawet zaproponuję narzędzie.
Krwawe szczegóły metody
Główna idea jest prosta jak cios kijem w głowę: na dysku są obszary, w które system operacyjny nigdy nie zapisuje (lub zapisuje rzadko). Aby nie było potrzeby szukać tych obszarów skomplikowanymi algorytmami, skorzystamy z nadmiarowości — to znaczy wiele razy skopiujemy nasze ukryte informacje po wszystkich sektorach dysku. Potem bezpośrednio na tym wszystkim można tworzyć wymagane partycje, formatować systemy plików, pisać pliki i instalować systemy operacyjne — część tajnych danych i tak zostanie zachowana i można będzie je wyciągnąć, a wielokrotne kopiowanie pomoże nam złożyć z kawałków oryginalną całość.
Zaletą tej metody jest oczywista: nie zależymy ani od formatu plików, ani nawet od typu używanego systemu plików.
Wady również, myślę, są oczywiste:
- Tajne dane można zmienić tylko poprzez pełne nadpisanie całego dysku, a następnie odtworzenie widocznej dla użytkownika zawartości. Przy tym nie można korzystać z oprogramowania do przywracania dysku z obrazu: odtworzy również poprzednie tajne dane.
- Im większa objętość tajnych danych, tym większe ryzyko utraty części informacji.
- Ekstrakcja danych z dysku może zająć dużo czasu. Od kilku minut do kilku dni (nowoczesne dyski są większe).
Teraz przejdźmy do szczegółów.
Jasne, że jeśli po prostu rozrzuci się dane wrażliwe po całym dysku, będą one ukryte tylko przed nieuzbrojonym okiem. Jeśli jednak uzbroimy wzrok, powiedzmy, edytorem dysku, dane ukarzą się w całej okazałości. Dlatego dobrze byłoby zaszyfrować dane, żeby się nie odsłaniały. Zaszyfrujemy je w prosty, ale elegancki sposób: za pomocą algorytmu aes256-cbc. Klucz szyfrowania zapytamy użytkownika, niech wymyśli dobre hasło.
Następne pytanie dotyczy tego, jak odróżnić „właściwe” dane od uszkodzonych. Tu pomoże nam suma kontrolna, ale nie byle jaka, a SHA1. A czemu nie? Dla gita jest wystarczająco dobra, więc i nam odpowiada. Postanowione: zaopatrzymy każdy zachowany fragment informacji w sumę kontrolną, a jeśli po odszyfrowaniu się zgadza, to znaczy, że odszyfrowanie się powiodło.
Jeszcze koniecznie potrzebny będzie numer fragmentu oraz całkowita długość danych wrażliwych. Numer fragmentu — aby śledzić, które kawałki już odszyfrowaliśmy, a które pozostały. Całkowita długość przyda się przy przetwarzaniu ostatniego fragmentu, aby nie zapisywać zbędnych danych (tj. paddingu). No i skoro zresztą planujemy nagłówek, dodamy tam nazwę tajnego pliku. Będzie przydatna po odszyfrowaniu, aby nie zgadywać, czym go otworzyć.
Sprawdzamy metodę w praktyce
Do sprawdzenia weźmiemy najpopularniejszy nośnik — pendrive. Mam stary na 1 GB, co w zupełności nada się do eksperymentów. Jeśli też, jak ja, myślisz, żeby nie męczyć się z fizycznymi nośnikami, tylko przetestować na pliku — obrazie dysku, to od razu mówię: nie wyjdzie. Przy formatowaniu takiego „dysku” Linux tworzy plik od nowa, a wszystkie niewykorzystane sektory zostaną wypełnione zerami.
Jako maszynę z Linuxem, niestety, musiałem skorzystać z leżącego na balkonie stacji meteorologicznej na Raspberry Pi 3. Pamięci jest tam niewiele, więc nie będziemy ukrywać dużych plików. Ograniczymy się do maksymalnego rozmiaru 10 megabajtów. Zbyt małych plików też nie ma sensu ukrywać: narzędzie zapisuje dane na dysku w klastrach po 4 KB. Dlatego ograniczymy się do pliku o wielkości 3 KB — zmieści się w jednym takim klastrze.
Będziemy stopniowo męczyć pendrive, sprawdzając po każdym etapie, czy ukryta informacja jest czytelna:
- Szybkie formatowanie w systemie FAT16 z rozmiarem klastra 16 kB. Taką opcję oferuje Windows 7 dla pendrive'a, na którym nie ma systemu plików.
- Wypełnienie pendrive'a różnymi śmieciami na 50%.
- Wypełnienie pendrive'a różnymi śmieciami na 100%.
- „Długie” formatowanie w systemie FAT16 (z nadpisywaniem wszystkiego).
Pierwsze dwa testy zakończyły się całkowitym sukcesem: narzędzie zdołało pomyślnie wydobyć 10 megabajtów sekretnej informacji z pendrive'a. Natomiast po zapełnieniu pendrive'a plikami po brzegi, nastąpiła awaria:
Całkowita liczba odczytanych klastrów: 250752, odszyfrowanych: 158
BŁĄD: nie można zapisać niekompletnego secretFile
Jak widać, udało się pomyślnie odszyfrować tylko 158 klastrów (632 kilobajty surowych danych, co daje 636424 bajty pożytku). Jasne jest, że 10 megabajtów nie da się w ten sposób uzyskać, a wśród tych klastrów z pewnością są duplikaty. Nawet 1 megabajta już w ten sposób nie odzyskasz. Można jednak zagwarantować, że 3 kilobajty tajnych danych odbierzemy z pendrive'a, nawet po jego sformatowaniu i zapełnieniu. Wygląda jednak na to, że z takiego pendrive'a można wydobyć plik o długości 120 kilobajtów.
Niestety, ostatni test wykazał, że pendrive został całkowicie nadpisany:
$ sudo .\/steganodisk -p hasło \/dev\/sda
Rozmiar urządzenia: 250752 klastry
250700 99%
Liczba odczytanych klastrów: 250752, odszyfrowanych: 0
BŁĄD: nie można zapisać niekompletnego secretFile
Żaden klaster nie został zachowany… Smutno, ale nie tragicznie! Spróbujemy przed formatowaniem utworzyć partycję na pendrive'ie, a już w niej - system plików. A tak na marginesie, fabrycznie został on dostarczony z takim formatowaniem, więc nie robimy nic podejrzanego.
Jak się można było spodziewać, dostępna przestrzeń na pendrive'ie nieco się zmniejszyła.
Również jak się można było spodziewać, 10 megabajtów nie udało się ukryć na całkowicie zapełnionym dysku. Ale za to w liczbie pomyślnie odszyfrowanych klastrów wzrosła ponad dwukrotnie!
Łączna liczba odczytanych klastrów: 250752, odszyfrowanych: 405
Niestety, nie da się zebrać megabajtów ze skrawków, ale 200 kilobajtów - jak najbardziej.
A oto wieść o ostatniej, czwartej kontroli, tym razem radosna: pełne formatowanie tego pendrive'a nie doprowadziło do zniszczenia całej informacji! 120 kilobajtów tajnych danych doskonale zmieściło się w nieużywanej przestrzeni.
Podsumowanie testów:

Trochę teoretyzowania: o wolnym miejscu i nieużywanych sektorach
Jeśli kiedykolwiek dzieliłeś twardy dysk na partycje, mogłeś zauważyć, że nie zawsze udaje się wykorzystać całe dostępne miejsce na dysku. Pierwsza partycja zawsze zaczyna się z pewnym odstępem (zazwyczaj to 1 megabajt, czyli 2048 sektorów). Za ostatnią partycją także zdarza się, że pozostaje mały "ogonek" z nieużywanych sektorów. A pomiędzy partycjami czasami również zostają luki, chociaż rzadko.
Innymi słowy, na dysku znajdują się sektory, do których nie ma dostępu przy normalnej pracy z dyskiem, ale można zapisać dane w tych sektorach! A więc można je także odczytać. Z uwzględnieniem tego, że istnieje jeszcze tabela partycji i kod bootloadera, które znajdują się w pustym obszarze na początku dysku.
Odpocznijmy na chwilę od partycji i spójrzmy na dysk z perspektywy, że tak powiem, z lotu ptaka. Oto mamy na dysku pustą partycję. Stwórzmy w niej system plików. Czy możemy powiedzieć, że jakieś sektory na dysku pozostały niezapisane?
I-i-i — bębnienie! Odpowiedź prawie zawsze brzmi — tak! W większości przypadków tworzenie systemu plików polega na zapisaniu na dysku tylko kilku bloków informacji pomocniczej, a w pozostałej części zawartość partycji nie zmienia się.
A jeszcze — czysto empirycznie — można przypuszczać, że system plików nie zawsze może zająć całe mu przypisane miejsce aż do ostatniego sektora. Na przykład, system plików FAT16 z rozmiarem klastra 64 kilobajty z oczywistych powodów nie będzie mógł w pełni zająć partycji o rozmiarze nie będącym wielokrotnością 64 kilobajtów. Na końcu takiej partycji będzie musiał pozostać "ogonek" w kilku sektorach, niedostępny do przechowywania danych użytkownika. Niezależnie od tego, eksperymentalnie tego przypuszczenia nie udało się potwierdzić.
Zatem, aby zmaksymalizować miejsce dostępne dla steganogramu, należy używać systemu plików z większym rozmiarem klastra. Można również utworzyć partycję, nawet jeśli nie jest to konieczne (na przykład na pendrive). Tworzenie pustych partycji lub pozostawianie nieprzydzielonych obszarów nie jest potrzebne — to przyciągnie uwagę zainteresowanych obywateli.
Narzędzie do eksperymentów
Możesz sprawdzić źródła narzędzia
Do kompilacji potrzebny będzie Qt w wersji 5.0 i wyższej oraz OpenSSL. Jeśli coś nie kompiluje się — być może będziesz musiał poprawić plik steganodisk.pro.
Można zmienić rozmiar klastra z 4 KB na, powiedzmy, 512 bajtów (w secretfile.h). W związku z tym wzrosną koszty związane z informacjami pomocniczymi: nagłówek i suma kontrolna zajmują stałe 68 bajtów.
Uruchomienie narzędzia należy oczywiście przeprowadzić z uprawnieniami użytkownika root, z ostrożnością. Nie będzie żadnych pytań przed nadpisaniem wskazanego pliku lub urządzenia!
Ciesz się.
Źródło: habr.com
