Cześć, Habr.
Chcę przedstawić wam mały projekt dotyczący , zrealizowany w wolnym czasie od nauki.
Stworzyłem projekt dotyczący ukrytego przechowywania informacji w systemie plików (dalej SP).
, co można wykorzystać do kradzieży poufnych informacji w celach edukacyjnych.

Na przykład, wybrano do eksperymentalnego wzoru dość stary system plików Linuksa .
Realizacja
Rozważania na temat realizacji
Jeśli dobrze „rozpędzić” system plików ext2, można stwierdzić, że w FS istnieje tzw. , w którym zawarte są podstawowe informacje o systemie. Po moich odkryciach znalazłem i . Prawie od razu pojawił się pomysł zapisywania informacji w pustych obecnie blokach SP. Teraz należało przemyśleć zabezpieczenie przed programistą, wyposażonym w .
Jeśli przechowujesz ukrytą informację bez szyfrowania, to, nawet w obliczu jej zamazania w SP, nadal będzie zbyt rzucać się w oczy, szczególnie jeśli programista będzie wiedział, czego szukać. Dlatego podjęto decyzję o szyfrowaniu wszystkich bloków pliku źródłowego. Wybrałem szyfr bloku , ale jak rozumiesz, to nie jest kluczowe.
Aby oddzielić potrzebne bloki od wszystkich innych podczas odczytu, postanowiono dodać specjalny znacznik na początku każdego bloku. Ten znacznik był szyfrowany w zależności od numeru bloku w pliku źródłowym. Ta sztuczka pozwoliła nie tylko znajdować potrzebne bloki, ale także poznawać ich prawidłową kolejność.
Ogólna zasada działania systemu.

Algorytm zapisu
Krok po kroku:
- Najpierw zapisać jakąkolwiek informację w źródłowym systemie plików;
- Usunąć tę informację (niekoniecznie całą);
- Plik do ukrycia podzielić na bloki o równej długości, dodając znacznik;
- Szyfrować te bloki;
- Umieścić zaszyfrowane bloki w pustych blokach SP.
Dla miłośników diagramów blokowych
Poniżej przedstawiony jest diagram blokowy algorytmu zapisu. Na wejściu algorytm otrzymuje cztery pliki:
-Obraz zmieniającego się systemu plików;
-Plik podlegający steganografii;
-Plik z kluczem szyfrowania dla AES;
-Plik z markerem.

Od razu warto zauważyć, że ten algorytm ma jedną wadę: po zapisie pliku w SP, nie można Zapisanie czegokolwiek nowego w systemie plików, ponieważ każda nowa informacja może trafić do bloków, które przeznaczyliśmy dla naszego pliku steganograficznego, a jednak otwiera to możliwość «szybkiego zatarcia śladów».
Jednak напewno jest jasne, jak można to poprawić: należy przepisac algorytm zapisu bloków w systemie plików. To zrozumiała, ale niezwykle pracochłonna zadanie.
Dla Proof Of Concept nie realizowałem tego.
W rezultacie otrzymujemy następujące zmiany w systemie plików, tak wygląda system plików przed steganografią (wcześniej zapisany został plik audio).

A tak wygląda system plików z już zaszyfrowanymi informacjami.

Algorytm odczytu
Krok po kroku:
- Znając klucz i sposób budowy znaczników, stworzyć pierwsze N znaczników, z gwarancją, że N pomnożone przez długość bloku systemu plików jest większe od długości zaszyfrowanego pliku;
- Wykonać wyszukiwanie bloków w systemie plików zaczynających się od znaczników;
- Odszyfrować otrzymane bloki i oddzielić znaczniki;
- Zebrać otrzymane bloki w odpowiedniej kolejności i uzyskać pierwotny plik.
Dla miłośników diagramów blokowych
Poniżej przedstawiono schemat blokowy algorytmu zapisu. Na wejściu algorytm otrzymuje trzy pliki:
- Obraz systemu plików;
-Plik z kluczem szyfrowania dla AES;
-Plik z markerem.

Po zakończeniu pracy programu powstaje plik Read, który będzie wyciągniętym z zaszyfrowanego systemu plików plikiem, jeśli klucz lub znacznik były podane niepoprawnie, plik Read będzie pusty.
(dla miłośników ładnych rzeczy można wplatać nie tylko plik, ale także „nagłówek”, zawierający metainformacje: nazwę pliku, uprawnienia, czas ostatniej modyfikacji itp.)
Automatyzacja uruchamiania
Dla ułatwienia napisano skrypty bash, które automatyzują uruchamianie na Linuxie (testowane na Ubuntu 16.04.3 LTS).
Rozbijmy uruchamianie na kroki.
Zapis:
- sudo Copy_Flash.sh “DEVICE” — uzyskujemy obraz systemu plików z DEVICE (pamięć flash);
- ./Write.sh “FILE” “KEY” “MARKER” – tworzymy wirtualne środowisko, pobieramy potrzebne biblioteki i uruchamiamy skrypt zapisu;
- sudo ./Write_Flash.sh “DEVICE” – zapisujemy zmieniony system plików ponownie na DEVICE.
Odczyt:
- sudo Copy_Flash.sh “DEVICE” — uzyskujemy obraz systemu plików z DEVICE (pamięć flash);
- ./Read.sh “KEY” ‘MARKER” — tworzymy wirtualne środowisko, pobieramy potrzebne biblioteki i uruchamiamy skrypt do odczytu;
- W bieżącym katalogu otwieramy plik Read – to jest zaszyfrowana informacja.
Podsumowanie
Ta metoda steganografii prawdopodobnie wymaga dopracowania, dodatkowego testowania i rozszerzenia na bardziej popularne systemy plików, takie jak , i .
Celem tej pracy było pokazanie zasady, dzięki której możliwe jest ukryte przechowywanie informacji w systemie plików.
Dzięki podobnym algorytmom można bez obaw przechowywać informacje, a jeśli przy znajomości klucza taką system można złamać nie pełnym przeszukiwaniem (ale dość długim algorytmem), to bez znajomości klucza ten system wydaje mi się całkowicie odporny, chociaż może to być powód do osobnego artykułu.
Cały kod został zrealizowany w języku Python w wersji 3.5.2. jest dostępny na moim kanale youtube. Pełny kod projektu jest zamieszczony na .
(Tak, wiem, że dla wersji produkcyjnej trzeba pisać na czymś „szybkim”, na przykład na C 😉)
W tej implementacji rozmiar pliku wejściowego dla steganografii nie powinien przekraczać 1000 kB.
Chcę wyrazić wdzięczność użytkownikowi za cenne rady przy planowaniu badań oraz zalecenia dotyczące formatu artykułu.
Źródło: habr.com
