Bestandssysteemsteganografie

Hé Habr.

Ik wil u graag kennis laten maken met een klein project over steganografie, gemaakt in mijn vrije tijd tijdens mijn studie.

Ik heb een project gemaakt over verborgen opslag van informatie in het bestandssysteem (verder FS).
Dit kan gebruikt worden om vertrouwelijke informatie te stelen voor educatieve doeleinden.

Bestandssysteemsteganografie

Een heel oud Linux FS werd gekozen als prototype ext2.

uitvoering

Implementatieoverwegingen

Als je de ext2-standaard echt "uit het lood slaat", kun je het feit vervangen dat er in de FS een zogenaamde Superblokken, die basisinformatie over het systeem verschaft. Daarna vond ik Blokbitmap и Inode tabel. Vrijwel meteen ontstond het idee om informatie vast te leggen in FS-blokken die op dat moment nog leeg waren. Nu was het de moeite waard om na te denken over de bescherming tegen een programmeur die gewapend was met hex-editor.

Als je verborgen informatie zonder encryptie opslaat, dan zal deze nog steeds te zien zijn, ook al wordt deze door de FS vervaagd. Dit geldt vooral als de programmeur weet waar hij op moet letten. Daarom werd besloten om alle blokken van het originele bestand te versleutelen. Ik heb een blokcijfer gekozen AES, maar zoals u begrijpt, is dit niet essentieel.

Om de benodigde blokken tijdens het lezen van de andere blokken te scheiden, werd besloten om aan het begin van elk blok een speciale markering toe te voegen. Deze markering werd gecodeerd op basis van het bloknummer in het oorspronkelijke bestand. Dankzij deze truc konden we niet alleen meteen de benodigde blokken vinden, maar ook de juiste volgorde ervan herkennen.

Algemeen werkingsprincipe van het systeem.

Bestandssysteemsteganografie

Opname-algoritme

De punten:

  • Schrijf eerst wat informatie naar het bronbestandssysteem;
  • Verwijder deze informatie (niet noodzakelijkerwijs alle informatie);
  • Splits het te verbergen bestand in blokken van gelijke lengte door een markering toe te voegen;
  • Versleutel deze blokken;
  • Plaats gecodeerde blokken in lege FS-blokken.

Voor liefhebbers van stroomdiagrammen

Hieronder ziet u een blokdiagram van het opnamealgoritme. Het algoritme ontvangt vier bestanden als invoer:
-Afbeelding van een wijzigbaar bestandssysteem;
-Te steganograferen bestand;
-Bestand met encryptiesleutel voor AES;
- Vijl met stift.
Bestandssysteemsteganografie

Het is de moeite waard om meteen op te merken dat dit algoritme één nadeel heeft: nadat het bestand naar de FS is geschreven, niet mogen schrijf niets nieuws in de FS, aangezien alle nieuwe informatie in de blokken terecht kan komen die we aan ons zip-bestand hebben toegewezen. Dit opent echter ook de mogelijkheid om "snel onze sporen uit te wissen".

Het is echter vrij duidelijk hoe dit opgelost kan worden: het algoritme voor het schrijven van blokken naar de FS moet herschreven worden. Dit is een begrijpelijke, maar ontzettend arbeidsintensieve taak.
Voor Proof Of Consept heb ik dit niet geïmplementeerd.

Als gevolg hiervan worden de volgende wijzigingen in de FS doorgevoerd: zo zag het FS eruit vóór steganografie (er werd eerst een audiobestand opgenomen).
Bestandssysteemsteganografie
En zo ziet de FS eruit met de informatie al gezipt.
Bestandssysteemsteganografie

Leesalgoritme

De punten:

  • Gegeven de sleutel en de methode voor het construeren van markers, stel de eerste N markers samen, met de garantie dat N vermenigvuldigd met de lengte van het bestandssysteemblok groter is dan de lengte van het gezipte bestand;
  • Zoek in de FS naar blokken die beginnen met markeringen;
  • De ontvangen blokken ontcijferen en de markeringen scheiden;
  • Zet de resulterende blokken in de juiste volgorde om het originele bestand te verkrijgen.

Voor liefhebbers van stroomdiagrammen

Hieronder ziet u een blokdiagram van het opnamealgoritme. Het algoritme ontvangt drie bestanden als invoer:
- Afbeelding van het bestandssysteem;
-Bestand met encryptiesleutel voor AES;
- Vijl met stift.
Bestandssysteemsteganografie

Nadat het programma is uitgevoerd, verschijnt er een Read-bestand. Dit is het bestand dat uit het steganografische FS is geëxtraheerd. Als de sleutel of marker onjuist is opgegeven, is het gelezen bestand leeg.
(voor degenen die van mooie dingen houden, kunt u niet alleen het bestand opnemen, maar ook een "header" met metagegevens: bestandsnaam, rechten, tijdstip van de laatste wijziging, enz.)

Automatisering van de lancering

Voor het gemak zijn bash-scripts geschreven om de lancering op Linux te automatiseren (getest op Ubuntu 16.04.3 LTS).
Laten we de lancering stap voor stap bekijken.
record:

  1. sudo Copy_Flash.sh “APPARAAT” — haal de FS-image op van APPARAAT (flash);
  2. ./Write.sh “FILE” “KEY” “MARKER” – creëer een virtuele omgeving, download de benodigde bibliotheken en voer het script uit om te schrijven;
  3. sudo ./Write_Flash.sh “DEVICE” – schrijf het gewijzigde FS terug naar DEVICE.

Lezing:

  1. sudo Copy_Flash.sh “APPARAAT” — haal de FS-image op van APPARAAT (flash);
  2. ./Read.sh “KEY” 'MARKER” — creëer een virtuele omgeving, download de benodigde bibliotheken en voer het script uit om te lezen;
  3. Open het Read-bestand in de huidige map. Dit is de gezipte informatie.

Conclusie

Deze steganografiemethode heeft waarschijnlijk enige verbetering, extra testen en uitbreiding naar populairdere bestandssystemen nodig, zoals Fat32, NTFS и ext4.
Het doel van dit werk was echter om het principe te laten zien waarmee verborgen opslag van informatie in een bestandssysteem kan worden geïmplementeerd.
Met behulp van dergelijke algoritmes kun je veilig informatie opslaan, en als zo'n systeem, met kennis van de sleutel, niet door een uitputtende zoekopdracht (maar door een heel lang algoritme) gehackt kan worden, dan lijkt dit systeem mij zonder kennis van de sleutel absoluut stabiel. Dit kan echter wel reden zijn voor een apart artikel.

Alle code is geschreven in Python versie 3.5.2. Voorbeeld van werk gepresenteerd op mijn YouTube-kanaal. De volledige projectcode is beschikbaar op GitHub.
(Ja, ja, ik weet dat je voor de productieversie iets “snels” moet schrijven, bijvoorbeeld in C 😉)
Bij deze implementatie mag de invoerbestandsgrootte voor steganografie niet groter zijn dan 1000 KB.

Ik wil graag mijn dank uitspreken aan de gebruiker PavelMSTU voor waardevol advies bij het plannen van het onderzoek en aanbevelingen voor het ontwerp van het artikel.

Bron: www.habr.com

Voeg een reactie