Steganografi etter filer: skjuler data direkte i sektorer

Et kort forord

Steganografi, hvis noen ikke husker det, skjuler informasjon i noen beholdere. For eksempel i bilder (diskutert her и her). Du kan også skjule data i tjenestetabeller i filsystemet (dette ble skrevet om her), Til og med i TCP-protokolltjenestepakker. Dessverre har alle disse metodene en ulempe: for å umerkelig "sette inn" informasjon i en beholder, trenger du utspekulerte algoritmer som tar hensyn til særegenhetene til beholderens interne struktur. Og det oppstår problemer med beholderens motstand mot manipulasjon: for eksempel, hvis du redigerer bildet litt, går skjult informasjon tapt.

Er det mulig å på en eller annen måte klare seg uten utspekulerte algoritmer og subtile manipulasjoner med data, og fortsatt sikre funksjonaliteten til beholderen og et akseptabelt sikkerhetsnivå for skjulte data? Når jeg ser fremover, vil jeg si - ja, du kan! Jeg vil til og med tilby et verktøy.

Blodige detaljer om metoden

Grunnideen er så enkel som et slag i pannen: Det er områder på disken som operativsystemet aldri skriver til (eller skriver i sjeldne tilfeller). For å unngå behovet for å søke etter disse områdene ved hjelp av utspekulerte algoritmer, vil vi bruke redundans – det vil si at vi vil duplisere vår skjulte informasjon mange, mange ganger på tvers av alle sektorer på disken. Deretter, rett på toppen av all denne prakten, kan du lage de nødvendige partisjonene, formatere filsystemer, skrive filer og installere operativsystemer - likevel, deler av de hemmelige dataene vil bli lagret og kan hentes, og gjentatt duplisering vil hjelpe oss sett den originale helheten sammen fra bitene.

Fordelen med denne metoden er åpenbar: vi er ikke avhengige av filformatet, eller til og med av typen filsystem som brukes.

Ulempene er også, tror jeg, åpenbare:

  • Hemmelige data kan bare endres ved å omskrive hele disken, etterfulgt av å gjenskape innholdet som er synlig for brukeren. Du kan imidlertid ikke bruke programvare som gjenskaper disken fra et bilde: den vil også gjenskape de tidligere hemmelige dataene.
  • Jo større volumet av hemmelige data er, jo større er sannsynligheten for å miste noe informasjon.
  • Å hente data fra disk kan ta lang tid. Fra flere minutter til flere dager (moderne disker er store).

La oss nå gå videre til detaljene.

Det er klart at hvis du bare smører hemmelige data over hele disken, vil de bare bli skjult for det blotte øye. Hvis du utstyrer blikket ditt med for eksempel en diskredigerer, vil dataene vises i all sin prakt. Derfor vil det være en god idé å kryptere dataene slik at de ikke vises. Vi vil kryptere enkelt, men smakfullt: ved å bruke aes256-cbc-algoritmen. Vi ber brukeren om krypteringsnøkkelen og lar ham komme opp med et godt passord.

Det neste spørsmålet er hvordan vi kan skille "gode" data fra dårlige data. Her vil en sjekksum hjelpe oss, men ikke en enkel, men SHA1. Og hva? Den er god nok for git, så den vil passe oss også. Bestemt: Vi gir hver lagret informasjon med en kontrollsum, og hvis den samsvarer etter dekryptering, betyr det at dekrypteringen var vellykket.

Du trenger også fragmentnummeret og den totale lengden på de hemmelige dataene. Fragmentnummeret er for å holde styr på hvilke brikker vi allerede har dechiffrert og hvilke som er igjen. Den totale lengden vil være nyttig for oss når vi behandler det siste fragmentet, for ikke å skrive unødvendige data (det vil si utfylling). Vel, siden vi fortsatt har en overskrift, legger vi til navnet på den hemmelige filen der. Det vil være nyttig etter dekryptering, for ikke å gjette hvordan du åpner det.

Teste metoden i praksis

For å sjekke, la oss ta det vanligste mediet - en flash-stasjon. Jeg fant en gammel med 1 GB kapasitet, som er ganske egnet for eksperimenter. Hvis du, som meg, kom på ideen om å ikke bry deg med fysiske medier, men teste det på en fil - et diskbilde, så vil jeg si med en gang: det vil ikke fungere. Når du formaterer en slik "disk", oppretter Linux filen igjen, og alle ubrukte sektorer vil bli fylt med nuller.

Som en maskin med Linux måtte jeg dessverre bruke en værstasjon på Raspberry Pi 3 som lå på balkongen. Det er ikke mye minne der, så vi skal ikke skjule store filer. Vi begrenser oss til en maksimal størrelse på 10 megabyte. Det er heller ingen vits i å skjule filer som er for små: verktøyet skriver data til disk i 4 KB-klynger. Derfor vil vi nedenfor begrense oss til en 3 kb fil - den passer inn i en slik klynge.

Vi vil håne flash-stasjonen i etapper, og sjekke etter hvert trinn om den skjulte informasjonen er lesbar:

  1. Rask formatering i FAT16-format med en klyngestørrelse på 16 KB. Dette er hva Windows 7 tilbyr å gjøre med en flash-stasjon som ikke har et filsystem.
  2. Fyller flash-stasjonen med all slags søppel med 50 %.
  3. Fyller flash-stasjonen med all slags søppel med 100 %.
  4. "Lang" formatering i FAT16-format (overskriver alt).

De to første testene, som forventet, endte med full seier: verktøyet var i stand til å trekke ut 10 megabyte med hemmelige data fra flash-stasjonen. Men etter at flash-stasjonen var fylt opp med filer, oppstod det en feil:

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

Som du kan se, ble bare 158 klynger vellykket dekryptert (632 kilobyte med rådata, noe som gir 636424 10 byte nyttelast). Det er klart at det ikke er mulig å få 1 megabyte her, og likevel er det tydelige duplikater blant disse klyngene. Du kan ikke engang gjenopprette 3 megabyte på denne måten. Men vi kan garantere at vi vil gjenopprette 120 kilobyte med hemmelige data fra en flash-stasjon selv etter at den er formatert og skrevet til kapasitet. Eksperimenter viser imidlertid at det er fullt mulig å trekke ut en fil på XNUMX kilobyte fra en slik flash-stasjon.

Den siste testen viste dessverre at hele flash-stasjonen ble 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 overlevd... Trist, men ikke tragisk! Før du formaterer, la oss prøve å lage en partisjon på flash-stasjonen, og allerede i den et filsystem. Den kom forresten fra fabrikken med akkurat denne formateringen, så vi gjør ikke noe mistenkelig.
Det er ganske forventet at den tilgjengelige plassen på flash-stasjonen har redusert noe.

Det er også ganske forventet at 10 megabyte ikke kunne skjules på en helt full disk. Men nå er antallet vellykket dekrypterte klynger mer enn doblet!

Total clusters read: 250752, decrypted: 405

Dessverre er det umulig å sette sammen en megabyte fra stykker, men to hundre kilobyte er enkelt.

Vel, nyhetene om den siste, fjerde sjekken, denne gangen er gledelige: fullstendig formatering av en slik flash-stasjon førte ikke til ødeleggelse av all informasjon! 4 kilobyte med hemmelige data passer perfekt inn i ubrukt plass.

Testsammendragstabell:

Steganografi etter filer: skjuler data direkte i sektorer

Litt teoretisering: om ledig plass og ubrukte sektorer

Hvis du noen gang har delt harddisken i partisjoner, har du kanskje lagt merke til at det ikke alltid er mulig å tildele all ledig plass på disken. Den første delen starter alltid med en innrykk (vanligvis 1 megabyte, eller 2048 sektorer). Bak den siste delen skjer det også at det gjenstår en liten "hale" av ubrukte sektorer. Og noen ganger er det hull mellom seksjonene, men sjelden.

Det er med andre ord sektorer på disken som ikke kan nås under normalt arbeid med disken, men data kan skrives til disse sektorene! Og det betyr å lese den også. Justert for det faktum at det også er en partisjonstabell og bootloader-kode, som er plassert i det tomme området på begynnelsen av disken.

La oss ta en pause fra seksjonene en stund og se på disken fra fugleperspektiv, for å si det sånn. Her har vi en tom partisjon på disken. La oss lage et filsystem i den. Kan vi si at noen sektorer på disken ikke blir slettet?

E-e-e - trommerull! Svaret vil nesten alltid være ja! Faktisk, i de fleste tilfeller kommer det å lage et filsystem ned til å skrive bare noen få blokker med tjenesteinformasjon til disken, og ellers endres ikke innholdet i partisjonen.

Og også - rent empirisk - kan vi anta at filsystemet ikke alltid kan oppta all plass som er tildelt det frem til siste sektor. For eksempel kan et FAT16-filsystem med en klyngestørrelse på 64 kilobyte åpenbart ikke helt okkupere en partisjon med en størrelse som ikke er et multiplum på 64 kilobyte. På slutten av en slik seksjon må det være en "hale" av flere sektorer, utilgjengelige for lagring av brukerdata. Denne antagelsen kunne imidlertid ikke bekreftes eksperimentelt.

Så for å maksimere plassen som er tilgjengelig for steganogrammet, må du bruke et filsystem med en større klyngestørrelse. Du kan også opprette en partisjon, selv om dette ikke er nødvendig (for eksempel på en flash-stasjon). Det er ikke nødvendig å opprette tomme seksjoner eller forlate ikke-allokerte områder - dette vil tiltrekke seg oppmerksomheten til interesserte borgere.

Verktøy for eksperimenter

Du kan trykke på kildekoden til verktøyet her

For å bygge trenger du Qt versjon 5.0 eller høyere og OpenSSL. Hvis noe ikke fungerer, må du kanskje redigere steganodisk.pro-filen.

Du kan endre klyngestørrelsen fra 4 KB til for eksempel 512 byte (i secretfile.h). Samtidig vil kostnadene for tjenesteinformasjon øke: overskriften og kontrollsummen opptar en fast 68 byte.

Du må kjøre verktøyet, selvfølgelig, med root-brukerrettigheter, og med forsiktighet. Det vil ikke stilles noen spørsmål før du overskriver den angitte filen eller enheten!

Nyt.

Kilde: www.habr.com

Legg til en kommentar