Steganografi efter filer: skjuler data direkte i sektorer

Et kort forord

Steganografi, hvis nogen ikke husker det, skjuler information i nogle containere. For eksempel i billeder (diskuteret her и her). Du kan også skjule data i filsystemets servicetabeller (dette blev skrevet om her), og endda i TCP-protokol servicepakker. Desværre har alle disse metoder en ulempe: for umærkeligt at "indsætte" information i en beholder, har du brug for snedige algoritmer, der tager højde for de særlige forhold ved beholderens interne struktur. Og der opstår problemer med beholderens modstand mod manipulation: Hvis du for eksempel redigerer billedet lidt, går skjult information tabt.

Er det muligt på en eller anden måde at undvære snedige algoritmer og subtile manipulationer med data og stadig sikre containerens funktionalitet og et acceptabelt sikkerhedsniveau for skjulte data? Når jeg ser fremad, vil jeg sige - ja, det kan du! Jeg vil endda tilbyde dig et hjælpeprogram.

Blodige detaljer om metoden

Grundideen er så simpel som et slag i panden: Der er områder på disken, som operativsystemet aldrig skriver til (eller skriver i sjældne tilfælde). For at undgå behovet for at søge efter disse områder ved hjælp af snedige algoritmer, vil vi bruge redundans - det vil sige, vi vil duplikere vores skjulte information mange, mange gange på tværs af alle sektorer på disken. Så, lige oven i al denne pragt, kan du oprette de nødvendige partitioner, formatere filsystemer, skrive filer og installere OS'er - alligevel vil en del af de hemmelige data blive gemt og kan hentes, og gentagen duplikering vil hjælpe os sæt den originale helhed sammen fra brikkerne.

Fordelen ved denne metode er indlysende: vi er ikke afhængige af filformatet, eller endda af den anvendte type filsystem.

Ulemperne synes jeg også er indlysende:

  • Hemmelige data kan kun ændres ved fuldstændig at omskrive hele disken, efterfulgt af at genskabe indholdet, der er synligt for brugeren. Du kan dog ikke bruge software, der genskaber disken fra et billede: det vil også genskabe de tidligere hemmelige data.
  • Jo større mængden af ​​hemmelige data, jo større er sandsynligheden for at miste nogle oplysninger.
  • Hentning af data fra disk kan tage lang tid. Fra flere minutter til flere dage (moderne diske er store).

Lad os nu gå videre til detaljerne.

Det er klart, at hvis du blot smører hemmelige data ud over hele disken, vil de kun blive skjult for det blotte øje. Hvis du udstyrer dit blik med f.eks. en diskeditor, vil dataene fremstå i al sin pragt. Derfor vil det være en god idé at kryptere dataene, så de ikke dukker op. Vi vil kryptere enkelt, men smagfuldt: ved hjælp af aes256-cbc-algoritmen. Vi beder brugeren om krypteringsnøglen og lader ham komme med en god adgangskode.

Det næste spørgsmål er, hvordan vi kan skelne "gode" data fra dårlige data. Her vil en kontrolsum hjælpe os, men ikke en simpel, men SHA1. Og hvad? Den er god nok til git, så den vil også passe til os. Besluttet: Vi giver hver gemt information med en kontrolsum, og hvis den matcher efter dekryptering, betyder det, at dekrypteringen var vellykket.

Du skal også bruge fragmentnummeret og den samlede længde af de hemmelige data. Fragmentnummeret er for at holde styr på, hvilke stykker vi allerede har dechifreret, og hvilke der er tilbage. Den samlede længde vil være nyttig for os, når vi behandler det sidste fragment, for ikke at skrive unødvendige data (det vil sige udfyldning). Nå, da vi stadig har en header, tilføjer vi navnet på den hemmelige fil der. Det vil være nyttigt efter dekryptering, for ikke at gætte, hvordan man åbner det.

Test af metoden i praksis

For at kontrollere, lad os tage det mest almindelige medium - et flashdrev. Jeg fandt en gammel med 1 GB kapacitet, som er ret velegnet til eksperimenter. Hvis du, ligesom jeg, kom på ideen om ikke at genere fysiske medier, men at teste det på en fil - et diskbillede, så vil jeg sige med det samme: det virker ikke. Når man formaterer sådan en "disk", opretter Linux filen igen, og alle ubrugte sektorer vil blive fyldt med nuller.

Som en maskine med Linux var jeg desværre nødt til at bruge en vejrstation på den Raspberry Pi 3, der lå på altanen. Der er ikke meget hukommelse der, så vi skjuler ikke store filer. Vi begrænser os til en maksimal størrelse på 10 megabyte. Det nytter heller ikke at skjule filer, der er for små: værktøjet skriver data til disken i 4 KB-klynger. Derfor vil vi nedenfor begrænse os til en 3 kb fil - den passer ind i en sådan klynge.

Vi håner flashdrevet i etaper og kontrollerer efter hvert trin, om den skjulte information er læsbar:

  1. Hurtig formatering i FAT16-format med en klyngestørrelse på 16 KB. Dette er, hvad Windows 7 tilbyder at gøre med et flashdrev, der ikke har et filsystem.
  2. Fylder flashdrevet med al slags affald med 50%.
  3. Fylder flashdrevet med al slags affald med 100%.
  4. "Lang" formatering i FAT16-format (overskriver alt).

De første to test endte som forventet med fuldstændig sejr: værktøjet var i stand til at udtrække 10 megabyte hemmelige data fra flashdrevet. Men efter at flashdrevet var fyldt til fulde med filer, opstod der en fejl:

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

Som du kan se, blev kun 158 klynger dekrypteret med succes (632 kilobytes rådata, hvilket giver 636424 bytes nyttelast). Det er klart, at der ikke er nogen måde at få 10 megabyte her, og alligevel er der blandt disse klynger tydelige dubletter. Du kan ikke engang gendanne 1 megabyte på denne måde. Men vi kan garantere, at vi vil gendanne 3 kilobyte hemmelige data fra et flashdrev, selv efter det er formateret og skrevet til kapacitet. Forsøg viser dog, at det er ganske muligt at udtrække en fil på 120 kilobyte fra sådan et flashdrev.

Den sidste test viste desværre, at hele flashdrevet blev overskrevet:

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

Ikke en eneste klynge har overlevet... Trist, men ikke tragisk! Før formatering, lad os prøve at oprette en partition på flashdrevet, og allerede i det et filsystem. Den kom i øvrigt fra fabrikken med præcis denne formatering, så vi gør ikke noget mistænkeligt.
Det forventes helt, at den tilgængelige plads på flashdrevet er faldet lidt.

Det er også ret forventet, at 10 megabyte ikke kunne skjules på en helt fuld disk. Men nu er antallet af vellykket dekrypterede klynger mere end fordoblet!

Total clusters read: 250752, decrypted: 405

Desværre er det umuligt at samle en megabyte fra stykker, men to hundrede kilobyte er nemt.

Nå, nyheden om den sidste, 4. kontrol, denne gang er glædelig: fuldstændig formatering af et sådant flashdrev førte ikke til ødelæggelsen af ​​al information! 120 kilobyte hemmelige data passer perfekt ind i ubrugt plads.

Testoversigtstabel:

Steganografi efter filer: skjuler data direkte i sektorer

Lidt teoretisering: om ledig plads og ubrugte sektorer

Hvis du nogensinde har opdelt din harddisk i partitioner, har du måske bemærket, at det ikke altid er muligt at allokere al den ledige plads på disken. Den første sektion starter altid med en eller anden indrykning (normalt 1 megabyte eller 2048 sektorer). Bag det sidste afsnit sker det også, at der forbliver en lille "hale" af ubrugte sektorer. Og nogle gange er der huller mellem afsnittene, selvom det er sjældent.

Der er med andre ord sektorer på disken, der ikke kan tilgås under normalt arbejde med disken, men data kan skrives til disse sektorer! Og det betyder også at læse den. Justeret for, at der også er en partitionstabel og bootloader-kode, som er placeret i det tomme område i begyndelsen af ​​disken.

Lad os tage en pause fra afsnittene et stykke tid og se på disken fra et fugleperspektiv, så at sige. Her har vi en tom partition på disken. Lad os oprette et filsystem i det. Kan vi sige, at nogle sektorer på disken ikke er slettet?

E-e-e - trommerulle! Svaret vil næsten altid være ja! Faktisk kommer oprettelse af et filsystem i de fleste tilfælde ned til kun at skrive nogle få blokke med serviceinformation til disken, og ellers ændres partitionens indhold ikke.

Og også - rent empirisk - kan vi antage, at filsystemet ikke altid kan optage al den plads, det er tildelt til den sidste sektor. For eksempel kan et FAT16-filsystem med en klyngestørrelse på 64 kilobyte naturligvis ikke helt optage en partition med en størrelse, der ikke er et multiplum af 64 kilobyte. I slutningen af ​​et sådant afsnit skal der være en "hale" af flere sektorer, utilgængelige til lagring af brugerdata. Denne antagelse kunne dog ikke bekræftes eksperimentelt.

Så for at maksimere den tilgængelige plads til steganogrammet, skal du bruge et filsystem med en større klyngestørrelse. Du kan også oprette en partition, selvom det ikke er nødvendigt (f.eks. på et flashdrev). Der er ingen grund til at oprette tomme sektioner eller forlade uallokerede områder - det vil tiltrække interesserede borgeres opmærksomhed.

Værktøj til eksperimenter

Du kan trykke på kildekoden for hjælpeprogrammet her

For at bygge skal du bruge Qt version 5.0 eller nyere og OpenSSL. Hvis noget ikke virker, skal du muligvis redigere steganodisk.pro-filen.

Du kan ændre klyngestørrelsen fra 4 KB til f.eks. 512 bytes (i secretfile.h). Samtidig vil prisen på serviceinformation stige: overskriften og kontrolsummen optager faste 68 bytes.

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

God fornøjelse.

Kilde: www.habr.com

Tilføj en kommentar