Steganografia według plików: ukrywanie danych bezpośrednio w sektorach

Mała przedmowa

Steganografia, jeśli ktoś nie pamięta, ukrywa informacje w niektórych pojemnikach. Na przykład na zdjęciach (omówione tutaj и tutaj). Możesz także ukryć dane w tabelach usług systemu plików (pisano o tym tutaj), i nawet w pakietach usług protokołu TCP. Niestety wszystkie te metody mają jedną wadę: aby niepostrzeżenie „wstawić” informacje do kontenera, potrzebne są sprytne algorytmy, które uwzględniają specyfikę wewnętrznej struktury kontenera. Pojawiają się problemy z odpornością pojemnika na manipulację: na przykład niewielka edycja obrazu powoduje utratę ukrytych informacji.

Czy da się jakoś obejść bez przebiegłych algorytmów i subtelnych manipulacji danymi, a mimo to zapewnić funkcjonalność kontenera i akceptowalny poziom bezpieczeństwa ukrytych danych? Patrząc w przyszłość, powiem – tak, możesz! Zaproponuję nawet narzędzie.

Cholerne szczegóły metody

Podstawowa idea jest prosta jak uderzenie w czoło: na dysku znajdują się obszary, w których system operacyjny nigdy nie zapisuje (lub zapisuje w rzadkich przypadkach). Aby uniknąć konieczności wyszukiwania tych obszarów za pomocą przebiegłych algorytmów, zastosujemy redundancję - czyli wiele, wiele razy powielimy nasze ukryte informacje we wszystkich sektorach dysku. Następnie, na szczycie całego tego splendoru, możesz utworzyć niezbędne partycje, sformatować systemy plików, zapisać pliki i zainstalować systemy operacyjne - mimo wszystko część tajnych danych zostanie zapisana i będzie można je odzyskać, a wielokrotne powielanie nam pomoże złożyć oryginalną całość z kawałków.

Zaleta tej metody jest oczywista: nie jesteśmy zależni od formatu pliku, ani nawet od typu używanego systemu plików.

Wady są również, moim zdaniem, oczywiste:

  • Tajne dane można zmienić jedynie poprzez całkowite przepisanie całego dysku, a następnie odtworzenie zawartości widocznej dla użytkownika. Nie można jednak użyć oprogramowania, które odtwarza dysk z obrazu: odtworzy także poprzednie tajne dane.
  • Im większa ilość tajnych danych, tym większe prawdopodobieństwo utraty niektórych informacji.
  • Odzyskiwanie danych z dysku może zająć dużo czasu. Od kilku minut do kilku dni (nowoczesne dyski są duże).

Przejdźmy teraz do konkretów.

Oczywiste jest, że jeśli po prostu rozsmarujesz tajne dane na całym dysku, zostaną one ukryte tylko przed gołym okiem. Jeśli wyposażysz wzrok w, powiedzmy, edytor dyskowy, dane pojawią się w całej okazałości. Dlatego dobrym pomysłem byłoby zaszyfrowanie danych, aby nie były widoczne. Szyfrujemy prosto, ale gustownie: za pomocą algorytmu aes256-cbc. Poprosimy użytkownika o klucz szyfrujący i pozwolimy mu wymyślić dobre hasło.

Następne pytanie dotyczy tego, jak odróżnić „dobre” dane od złych danych. Tutaj pomoże nam suma kontrolna, ale nie prosta, ale SHA1. I co? Jest wystarczająco dobry dla gita, więc będzie nam też odpowiadał. Zdecydowaliśmy: każdej zapisanej informacji towarzyszymy sumę kontrolną i jeśli po odszyfrowaniu będzie zgodna, oznacza to, że odszyfrowanie się powiodło.

Będziesz także potrzebował numeru fragmentu i całkowitej długości tajnych danych. Numer fragmentu ma za zadanie śledzić, które fragmenty już rozszyfrowaliśmy, a które pozostały. Całkowita długość przyda nam się przy przetwarzaniu ostatniego fragmentu, aby nie zapisać niepotrzebnych danych (czyli dopełnienia). Cóż, ponieważ nadal mamy nagłówek, dodamy tam nazwę tajnego pliku. Przyda się po odszyfrowaniu, aby nie zgadywać, jak go otworzyć.

Testowanie metody w praktyce

Aby to sprawdzić, weźmy najpopularniejszy nośnik - dysk flash. Znalazłem stary o pojemności 1 GB, który w zupełności nadaje się do eksperymentów. Jeśli tak jak ja wpadłeś na pomysł, aby nie zawracać sobie głowy fizycznymi nośnikami, ale przetestować to na pliku - obrazie dysku, to od razu powiem: to nie zadziała. Podczas formatowania takiego „dysku” Linux tworzy plik ponownie, a wszystkie nieużywane sektory zostaną wypełnione zerami.

Jako maszyna z Linuksem musiałem niestety skorzystać ze stacji pogodowej na leżącym na balkonie Raspberry Pi 3. Nie ma tam zbyt dużo pamięci, więc dużych plików nie będziemy chować. Ograniczamy się do maksymalnego rozmiaru 10 megabajtów. Nie ma też sensu ukrywać zbyt małych plików: narzędzie zapisuje dane na dysku w klastrach 4 KB. Dlatego poniżej ograniczymy się do pliku o wielkości 3 kb - mieści się on w jednym takim klastrze.

Będziemy kpić z pendrive'a etapami, po każdym etapie sprawdzając, czy ukryte informacje są czytelne:

  1. Szybkie formatowanie w formacie FAT16 przy rozmiarze klastra 16 KB. To właśnie oferuje system Windows 7 z dyskiem flash, który nie ma systemu plików.
  2. Wypełnianie dysku flash wszelkiego rodzaju śmieciami o 50%.
  3. Wypełnianie dysku flash wszelkiego rodzaju śmieciami o 100%.
  4. Formatowanie „długie” w formacie FAT16 (nadpisywanie wszystkiego).

Pierwsze dwa testy, zgodnie z oczekiwaniami, zakończyły się całkowitym zwycięstwem: narzędziu udało się pomyślnie wyodrębnić 10 megabajtów tajnych danych z dysku flash. Ale po zapełnieniu dysku flash plikami wystąpiła awaria:

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

Jak widać, pomyślnie odszyfrowano tylko 158 klastrów (632 kilobajty surowych danych, co daje 636424 10 bajty ładunku). Oczywiste jest, że nie ma tutaj możliwości zdobycia 1 megabajtów, a przecież wśród tych klastrów wyraźnie widać duplikaty. W ten sposób nie można odzyskać nawet 3 megabajta. Możemy jednak zagwarantować, że odzyskamy 120 kilobajty tajnych danych z dysku flash nawet po jego sformatowaniu i zapisaniu do pełnej pojemności. Jednak eksperymenty pokazują, że całkiem możliwe jest wyodrębnienie z takiego dysku flash pliku o długości XNUMX kilobajtów.

Ostatni test niestety pokazał, że cały pendrive został nadpisany:

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

Nie zachowała się ani jedna gromada... Smutne, ale nie tragiczne! Przed formatowaniem spróbujmy utworzyć partycję na dysku flash, a już w niej system plików. Swoją drogą wyszedł fabrycznie z dokładnie takim formatowaniem, więc nie robimy nic podejrzanego.
Oczekuje się, że dostępna przestrzeń na dysku flash nieznacznie się zmniejszy.

Oczekuje się również, że 10 megabajtów nie da się ukryć na całkowicie pełnym dysku. Ale teraz liczba pomyślnie odszyfrowanych klastrów wzrosła ponad dwukrotnie!

Total clusters read: 250752, decrypted: 405

Niestety nie da się złożyć megabajta z kawałków, ale dwieście kilobajtów jest łatwo.

Cóż, wiadomość o ostatniej, czwartej kontroli, tym razem jest radosna: całkowite sformatowanie takiego dysku flash nie doprowadziło do zniszczenia wszystkich informacji! 4 kilobajtów tajnych danych idealnie mieści się w niewykorzystanej przestrzeni.

Tabela podsumowująca test:

Steganografia według plików: ukrywanie danych bezpośrednio w sektorach

Trochę teoretyzowania: o wolnej przestrzeni i niewykorzystanych sektorach

Jeśli kiedykolwiek dzieliłeś dysk twardy na partycje, być może zauważyłeś, że nie zawsze jest możliwe przydzielenie całego wolnego miejsca na dysku. Pierwsza sekcja zawsze zaczyna się od wcięcia (zwykle 1 megabajt lub 2048 sektorów). Za ostatnią sekcją zdarza się również, że pozostaje mały „ogon” niewykorzystanych sektorów. Czasami między sekcjami występują przerwy, choć rzadko.

Innymi słowy, na dysku znajdują się sektory, do których nie można uzyskać dostępu podczas normalnej pracy z dyskiem, ale w tych sektorach można zapisywać dane! A to oznacza także przeczytanie tego. Dostosowano do faktu, że istnieje również tablica partycji i kod programu ładującego, które znajdują się w pustym obszarze na początku dysku.

Oderwijmy się na chwilę od fragmentów i spójrzmy na dysk, że tak powiem, z lotu ptaka. Tutaj mamy pustą partycję na dysku. Stwórzmy w nim system plików. Czy można powiedzieć, że niektóre sektory na dysku pozostają niewymazane?

E-e-e - werbel! Odpowiedź będzie prawie zawsze twierdząca! Rzeczywiście w większości przypadków utworzenie systemu plików sprowadza się do zapisania na dysku tylko kilku bloków informacji serwisowych, w przeciwnym razie zawartość partycji nie ulegnie zmianie.

A także - czysto empirycznie - możemy założyć, że system plików nie zawsze może zajmować całą przydzieloną mu przestrzeń aż do ostatniego sektora. Na przykład system plików FAT16 o rozmiarze klastra wynoszącym 64 kilobajty oczywiście nie może całkowicie zająć partycji o rozmiarze innym niż wielokrotność 64 kilobajtów. Na końcu takiej sekcji będzie musiał znajdować się „ogon” kilku sektorów, niedostępnych do przechowywania danych użytkownika. Założenia tego nie udało się jednak potwierdzić eksperymentalnie.

Aby zmaksymalizować przestrzeń dostępną dla steganogramu, należy użyć systemu plików o większym rozmiarze klastra. Możesz także utworzyć partycję, nawet jeśli nie jest to konieczne (na przykład na dysku flash). Nie ma potrzeby tworzenia pustych sekcji ani pozostawiania nieprzydzielonych obszarów - przyciągnie to uwagę zainteresowanych obywateli.

Narzędzie do eksperymentów

Możesz dotknąć kodu źródłowego narzędzia tutaj

Do zbudowania będziesz potrzebować Qt w wersji 5.0 lub nowszej i OpenSSL. Jeśli coś nie działa, być może będziesz musiał edytować plik steganodisk.pro.

Możesz zmienić rozmiar klastra z 4 KB na, powiedzmy, 512 bajtów (w secretfile.h). Jednocześnie wzrośnie koszt informacji serwisowych: nagłówek i suma kontrolna zajmują stałe 68 bajtów.

Musisz oczywiście uruchomić narzędzie z uprawnieniami użytkownika root i zachować ostrożność. Przed nadpisaniem określonego pliku lub urządzenia nie będą zadawane żadne pytania!

Cieszyć się.

Źródło: www.habr.com

Dodaj komentarz