Steganografi uden filer: gemmer data direkte i sektorene

En lille introduktion

Steganografi, hvis nogen ikke husker, er skjulingen af information i forskellige containere. For eksempel i billeder (det blev diskuteret her og her). Man kan også skjule data i systemtabellerne på filsystemet (det blev skrevet om her), og endda i kontrolpakkerne af TCP-protokollen. Desværre har alle disse metoder én ulempe: for at indsætte information diskret i en container, er der brug for snedige algoritmer, der tager højde for de indre egenskaber ved containeren. Og der opstår problemer med containerens modstandsdygtighed over for manipulationer: for eksempel, hvis man redigerer billedet lidt, går den skjulte information tabt.

Kan man på en eller anden måde undgå snedige algoritmer og fine manipulationer med data, og samtidig sikre, at containeren fungerer og opretholder en acceptabel grad af fortrolighed for de skjulte data? For at gå direkte til sagen — ja, det kan man! Og jeg vil endda foreslå et værktøj.

De blodige detaljer om metoden

Hovedideen er simpel, som et slag med en kølle i ansigtet: der er områder på disken, hvor operativsystemet aldrig skriver (eller kun skriver i sjældne tilfælde). For at undgå at skulle lede efter disse områder med snedige algoritmer, vil vi udnytte redundansen — det vil sige, at vi mange gange vil dublerer vores skjulte information på alle sektioner af disken. Derefter kan man ligeledes oprette nødvendige partitioner, formatere filsystemer, skrive filer og installere operativsystemet — en del af de hemmelige data vil stadig blive gemt og kan hentes, og den mange gange dublering vil hjælpe os med at sammensætte den oprindelige helhed fra små bid.

Fordelen ved en sådan metode er åbenlys: vi er ikke afhængige af fileformatet, eller endda typen af det anvendte filsystem.

Ulemperne er også, tænker jeg, åbenlyse:

  • Hemmelig information kan kun ændres ved en fuld overskrivning af hele disken, efterfulgt af genskabelsen af det synlige indhold for brugeren. Under dette kan man ikke bruge software, der genskaber disken fra billedet: det vil også genskabe de tidligere hemmelige data.
  • Jo større volumenet af hemmelige data, desto større er sandsynligheden for tab af en del information.
  • Dataudtrækning fra disken kan tage meget tid. Fra flere minutter til flere dage (moderne diske er større).

Lad os nu gå videre til detaljerne.

Det er klart, at hvis man bare spreder de hemmelige data ud over hele disken, vil de kun være skjult for det blotte øje. Hvis man derimod bevæbner sig med et diskredigeringsværktøj, vil dataene fremstå i al deres pragt. Derfor ville det være en god idé at kryptere dataene, så de ikke lyser op. Vi vil kryptere dem på en enkel, men elegant måde: ved hjælp af aes256-cbc-algoritmen. Krypteringsnøglen vil vi spørge brugeren om, så han kan finde på et godt password.

Det næste spørgsmål er, hvordan vi kan skelne mellem 'korrekte' data og beskadigede data. Her vil en kontrolsum hjælpe os, og ikke bare en hvilken som helst, men en SHA1. Hvorfor ikke? For git er den tilstrækkelig god, så den vil også passe til os. Besluttet: vi giver hver gemt datablok en kontrolsum, og hvis den stemmer overens efter dekrypteringen, så er dekrypteringen lykkedes.

Vi får også brug for fragmentnummeret og den samlede længde af de hemmelige data. Fragmentnummeret er vigtigt for at holde styr på, hvilke stykker vi allerede har dekrypteret, og hvilke der stadig mangler. Den samlede længde vil være nyttig ved behandling af det sidste fragment, så vi ikke skriver unødvendige data (det vil sige padding). Og da vi alligevel skal lave en header, så tilføjer vi navnet på den hemmelige fil. Det vil være nyttigt efter dekrypteringen, så vi ikke skal gætte, hvordan vi åbner den.

Vi tester metoden i praksis

Til prøven tager vi den mest almindelige lagringstype - et USB-drev. Jeg har fundet et gammelt på 1 GB, som er fint til eksperimenter. Hvis du, ligesom jeg, kom til at tænke på ikke at bekymre dig om fysiske lagermedier, men vil teste på en fil - en diskbillede, så skal jeg straks sige: det vil ikke fungere. Ved formatering af en sådan 'disk' opretter Linux filen på ny, og alle ubrugte sektorer vil blive fyldt med nuller.

Som Linux-maskine måtte jeg desværre benytte et gammelt vejrstation på en Raspberry Pi 3. Der er ikke meget hukommelse, så vi vil ikke skjule store filer. Vi begrænser os til en maksimal størrelse på 10 megabyte. Alt for små filer giver heller ikke mening at skjule, da programmet skriver data til disken i klynger af 4 KB. Så vi begrænser os til en fil på 3 KB - den passer ind i en sådan klynge.

Vi vil gradvist teste USB-drevet og kontrollere, om den skjulte information kan læses efter hvert trin:

  1. Hurtig formatering til FAT16 med en clusterstørrelse på 16 kB. Dette er, hvad Windows 7 tilbyder at gøre med et USB-drev uden et filsystem.
  2. Fylder USB-drevet med forskellige junkfiler med 50%.
  3. Fylder USB-drevet med forskellige junkfiler med 100%.
  4. «Langsom» formatering til FAT16 (med overskrivning af alt).

De første to forsøg sluttede som forventet med en fuld sejr: værktøjet kunne med succes hente 10 megabyte hemmelige data fra USB-drevet. Men efter at drevet blev fyldt med filer, opstod der en fejl:

Samlede læste klynger: 250752, dekrypteret: 158
FEJL: kan ikke skrive ufuldstændig secretFile

Som vi kan se, lykkedes det kun at dekryptere 158 clusters (632 kilobyte rå data, hvilket giver 636424 byte nyttelast). Det er klart, at 10 megabyte ikke kan samles her, og der er tydeligvis dubletter blandt disse clusters. Endda 1 megabyte kan derfor ikke laves på denne måde. Men vi kan dog garantere, at vi vil kunne genvinde 3 kilobyte hemmelige data fra USB-drevet, selv efter at det er blevet formateret og fyldt. Eksperimenterne viser dog, at det er muligt at hente en fil på 120 kilobyte fra et sådant USB-drev.

Desværre viste den sidste test, at USB-drevet var blevet helt overskrevet:

$ sudo .\/steganodisk -p password \/dev\/sda
Enhedsstørrelse: 250752 klynger
250700 99%
Samlede læste klynger: 250752, dekrypteret: 0
FEJL: kan ikke skrive ufuldstændig secretFile

Ingen clusters er bevaret... Trist, men ikke tragisk! Lad os prøve at oprette en partition på USB-drevet før formateringen, og i denne partition — et filsystem. Forresten blev det sendt fra fabrikken med en sådan formatering, så vi gør ikke noget mistænkeligt.
Det var helt forventeligt, at det tilgængelige rum på USB-drevet blev lidt mindre.

Det var også helt forventeligt, at 10 megabyte trods alt ikke kunne gemmes på et helt fyldt disk. Men nu er antallet af succesfuldt dekrypterede clusters steget med mere end det dobbelte!

Total clusters læst: 250752, dekrypterede: 405

Megabyte kan desværre ikke samles fra stykker, men to hundrede kilobyte kan sagtens samlet.

Og nyheden om den sidste, 4. kontrol er denne gang glædelig: en fuld formatering af et sådant USB-drev førte ikke til ødelæggelse af al information! 120 kilobyte hemmelige data passerede fint ind i det ubrugte rum.

Sammenfattende tabel for testningen:

Steganografi uden filer: gemmer data direkte i sektorene

Lidt teori: om det frie rum og ubrugte sektorer

Hvis du nogensinde har partitioneret en harddisk, har du måske bemærket, at det ikke altid er muligt at tildele alt det frie plads på disken. Den første partition starter altid med en vis margin (normalt 1 megabyte eller 2048 sektorer). Efter den sidste partition er der også nogle gange et lille 'haler' af ubrugte sektorer. Og mellem partitionerne forbliver der nogle gange mellemrum, selvom det er sjældent.

Med andre ord er der sektorer på disken, som ikke er tilgængelige ved almindeligt arbejde med disken, men man kan stadig skrive data til disse sektorer! Og dermed også læse dem. Med det forbehold, at der også er en partitionstabel og en bootkode, som netop er placeret i det tomme område i begyndelsen af disken.

Lad os tage en pause fra partitionerne og se på disken fra fugleperspektiv. Her har vi en tom partition på disken. Lad os oprette et filsystem i den. Kan man sige, at nogle sektorer på disken forbliver uskrevne?

Og drumroll! Svaret vil stort set altid være ja! For i de fleste tilfælde medfører oprettelsen af et filsystem, at der kun skrives nogle få blokke af systeminformation til disken, mens indholdet af partitionen ellers ikke ændres.

Og også — rent empirisk — kan man antage, at filsystemet ikke altid kan optage hele det tildelte rum til den sidste sektor. For eksempel vil et FAT16-filsystem med en clusterstørrelse på 64 kilobyte åbenlyst ikke kunne optage en partition med en størrelse, der ikke er et multiplum af 64 kilobyte, fuldstændigt. I slutningen af en sådan partition vil der skulle forblive en 'haler' på flere sektorer, der ikke er tilgængelige til lagring af brugerdata. Det er dog ikke lykkedes at bekræfte denne antagelse eksperimentelt.

Så for at maksimere pladsen, der er tilgængelig til steganogrammet, skal man bruge et filsystem med en større clusterstørrelse. Man kan også oprette en partition, selvom det ikke er nødvendigt (f.eks. på en USB-nøgle). Det er ikke nødvendigt at oprette tomme partitioner eller efterlade ufordelte områder — det vil tiltrække opmærksomhed fra nysgerrige personer.

Værktøjet til eksperimenter

Kildekoden til værktøjet kan findes her

For at kompilere kræves Qt version 5.0 eller nyere og OpenSSL. Hvis noget ikke kan kompilere — kan det være nødvendigt at justere filen steganodisk.pro.

Du kan ændre clusterstørrelsen fra 4 KB til for eksempel 512 byte (i secretfile.h). Dette vil øge omkostningerne til administrationsoplysninger: headeren og checksummen bruger en fast størrelse på 68 byte.

Du skal selvfølgelig køre værktøjet med root-brugerrettigheder og med forsigtighed. Der vil ikke blive stillet spørgsmål inden omoverskrivning af den angivne fil eller enhed!

Nyd det.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster