Steganografija po datotekah: skrivanje podatkov neposredno v sektorjih

Kratek predgovor

Steganografija, če se kdo ne spomni, skriva podatke v nekih zabojnikih. Na primer na slikah (razpravljano tukaj и tukaj). Podatke lahko skrijete tudi v servisnih tabelah datotečnega sistema (o tem je bilo napisano tukaj), in celo v paketih storitev protokola TCP. Na žalost imajo vse te metode eno pomanjkljivost: da bi neopazno "vstavili" informacije v vsebnik, potrebujete zvite algoritme, ki upoštevajo posebnosti notranje strukture vsebnika. In težave se pojavijo z odpornostjo vsebnika na manipulacijo: na primer, če rahlo uredite sliko, se skrite informacije izgubijo.

Ali je mogoče nekako brez zvitih algoritmov in subtilnih manipulacij s podatki, pa še vedno zagotoviti funkcionalnost vsebnika in sprejemljivo raven varnosti skritih podatkov? Če pogledam naprej, bom rekel - da, lahko! Ponudil bom celo pripomoček.

Krvave podrobnosti metode

Osnovna ideja je preprosta kot udarec v čelo: na disku obstajajo področja, na katera operacijski sistem nikoli ne piše (ali piše v redkih primerih). Da bi se izognili potrebi po iskanju teh območij z uporabo zvitih algoritmov, bomo uporabili redundanco - to pomeni, da bomo svoje skrite informacije podvojili veliko, velikokrat v vseh sektorjih diska. Nato lahko poleg vsega tega sijaja ustvarite potrebne particije, formatirate datotečne sisteme, pišete datoteke in namestite operacijske sisteme - vseeno bo del tajnih podatkov shranjen in jih bo mogoče pridobiti, ponavljajoče se podvajanje pa nam bo pomagalo iz kosov sestavite prvotno celoto.

Prednost te metode je očitna: nismo odvisni od formata datoteke ali celo od vrste uporabljenega datotečnega sistema.

Tudi slabosti so po mojem mnenju očitne:

  • Tajne podatke je mogoče spremeniti le s popolnim prepisom celotnega diska, čemur sledi ponovna izdelava uporabniku vidne vsebine. Vendar pa ne morete uporabiti programske opreme, ki ponovno ustvari disk iz slike: ponovno bo ustvarila tudi prejšnje tajne podatke.
  • Večji kot je obseg tajnih podatkov, večja je verjetnost izgube nekaterih informacij.
  • Pridobivanje podatkov z diska lahko traja dolgo. Od nekaj minut do nekaj dni (sodobni diski so veliki).

Zdaj pa preidimo na podrobnosti.

Jasno je, da če preprosto razmažete tajne podatke po disku, bodo skriti samo očem. Če svoj pogled opremite z recimo urejevalnikom diskov, bodo podatki prikazani v vsem svojem sijaju. Zato bi bilo dobro podatke šifrirati, da se ne bi prikazali. Šifrirali bomo preprosto, a okusno: z algoritmom aes256-cbc. Uporabnika bomo prosili za šifrirni ključ in mu dovolili, da si izmisli dobro geslo.

Naslednje vprašanje je, kako lahko ločimo »dobre« podatke od slabih. Tukaj nam bo pomagala kontrolna vsota, vendar ne preprosta, ampak SHA1. In kaj? Za git je dovolj dober, zato bo ustrezal tudi nam. Odločeno: vsakemu shranjenemu podatku zagotovimo kontrolno vsoto in če se po dešifriranju ujema, pomeni, da je bilo dešifriranje uspešno.

Potrebovali boste tudi številko fragmenta in skupno dolžino tajnih podatkov. Številka fragmenta je namenjena sledenju, katere kose smo že dešifrirali in kateri so ostali. Skupna dolžina nam bo koristila pri obdelavi zadnjega fragmenta, da ne bomo zapisovali nepotrebnih podatkov (to je oblazinjenje). No, ker še vedno imamo glavo, bomo tja dodali ime tajne datoteke. Uporabno bo po dešifriranju, da ne bi uganili, kako ga odpreti.

Preizkus metode v praksi

Če želite preveriti, vzemimo najpogostejši medij - bliskovni pogon. Našel sem starega z 1 GB kapacitete, ki je čisto primeren za eksperimente. Če ste tako kot jaz prišli na idejo, da se ne bi obremenjevali s fizičnimi mediji, ampak ga preizkusili na datoteki - sliki diska, potem bom takoj rekel: ne bo delovalo. Pri formatiranju takega "diska" Linux znova ustvari datoteko in vsi neuporabljeni sektorji bodo zapolnjeni z ničlami.

Kot stroj z Linuxom sem na žalost moral uporabiti vremensko postajo na Raspberry Pi 3, ki je ležal na balkonu.Tam ni veliko pomnilnika, zato velikih datotek ne bomo skrivali. Omejimo se na največjo velikost 10 megabajtov. Prav tako nima smisla skrivati ​​premajhnih datotek: pripomoček zapisuje podatke na disk v 4 KB gručah. Zato se bomo spodaj omejili na datoteko velikosti 3 kb - prilega se eni taki skupini.

Postopoma se bomo norčevali iz bliskovnega pogona in po vsaki stopnji preverili, ali so skrite informacije berljive:

  1. Hitro formatiranje v formatu FAT16 z velikostjo gruče 16 KB. To ponuja Windows 7 z bliskovnim pogonom, ki nima datotečnega sistema.
  2. Polnjenje bliskovnega pogona z vsemi vrstami smeti za 50%.
  3. Polnjenje bliskovnega pogona z vsemi vrstami smeti za 100%.
  4. »Dolgo« oblikovanje v formatu FAT16 (prepis vsega).

Prva dva preizkusa sta se, kot je bilo pričakovano, končala s popolno zmago: pripomoček je uspel uspešno izvleči 10 megabajtov tajnih podatkov iz bliskovnega pogona. Ko pa je bil bliskovni pogon napolnjen z datotekami, je prišlo do napake:

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

Kot lahko vidite, je bilo uspešno dešifriranih le 158 gruč (632 kilobajtov neobdelanih podatkov, kar daje 636424 bajtov koristnega tovora). Jasno je, da tukaj ni mogoče dobiti 10 megabajtov, vendar so med temi grozdi očitno dvojniki. Na ta način ne morete obnoviti niti 1 megabajta. Lahko pa zagotovimo, da bomo obnovili 3 kilobajte skrivnih podatkov z bliskovnega pogona tudi potem, ko ga formatiramo in zapišemo do konca. Vendar pa poskusi kažejo, da je s takšnega bliskovnega pogona povsem mogoče izvleči datoteko, dolgo 120 kilobajtov.

Zadnji test je na žalost pokazal, da je bil celoten bliskovni pogon prepisan:

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

Niti en grozd ni preživel... Žalostno, a ne tragično! Pred formatiranjem poskusimo ustvariti particijo na bliskovnem pogonu in že v njej datotečni sistem. Mimogrede, iz tovarne je prišel točno v tem formatu, tako da ne delamo nič sumljivega.
Pričakovano je, da se je razpoložljivi prostor na bliskovnem pogonu nekoliko zmanjšal.

Povsem pričakovano je tudi, da se 10 megabajtov ne bi dalo skriti na popolnoma poln disk. Zdaj pa se je število uspešno dešifriranih gruč več kot podvojilo!

Total clusters read: 250752, decrypted: 405

Na žalost je nemogoče sestaviti megabajt iz kosov, dvesto kilobajtov pa je enostavno.

No, novica o zadnjem, 4. preverjanju, tokrat je vesela: popolno formatiranje takega bliskovnega pogona ni povzročilo uničenja vseh informacij! 120 kilobajtov tajnih podatkov se popolnoma prilega neizkoriščenemu prostoru.

Tabela povzetka testa:

Steganografija po datotekah: skrivanje podatkov neposredno v sektorjih

Malo teoretiziranja: o prostem prostoru in neuporabljenih sektorjih

Če ste kdaj razdelili trdi disk na particije, ste morda opazili, da ni vedno mogoče dodeliti vsega prostega prostora na disku. Prvi razdelek se vedno začne z nekaj zamika (običajno 1 megabajt ali 2048 sektorjev). Za zadnjim odsekom se zgodi tudi, da ostane majhen "rep" neuporabljenih sektorjev. In včasih so vrzeli med deli, čeprav redko.

Povedano drugače, na disku so sektorji, do katerih pri običajnem delu z diskom ni dostopen, vendar se lahko v te sektorje zapisujejo podatki! In to pomeni, da ga tudi preberete. Prilagojeno dejstvu, da obstaja tudi particijska tabela in koda zagonskega nalagalnika, ki se nahajata v praznem območju na začetku diska.

Za nekaj časa si oddahnimo od razdelkov in poglejmo disk tako rekoč iz ptičje perspektive. Tukaj imamo prazno particijo na disku. V njem ustvarimo datotečni sistem. Ali lahko rečemo, da nekateri sektorji na disku ostanejo neizbrisani?

E-e-e - boben! Odgovor bo skoraj vedno pritrdilen! Dejansko se v večini primerov ustvarjanje datotečnega sistema zmanjša na pisanje le nekaj blokov servisnih informacij na disk, sicer pa se vsebina particije ne spremeni.

In tudi - čisto empirično - lahko domnevamo, da datotečni sistem ne more vedno zasesti vsega prostora, ki mu je dodeljen do zadnjega sektorja. Na primer, datotečni sistem FAT16 z velikostjo gruče 64 kilobajtov očitno ne more popolnoma zasesti particije z velikostjo, ki ni večkratnik 64 kilobajtov. Na koncu takega odseka bo moral biti "rep" več sektorjev, nedostopnih za shranjevanje uporabniških podatkov. Vendar te domneve ni bilo mogoče eksperimentalno potrditi.

Če želite povečati prostor, ki je na voljo za steganogram, morate uporabiti datotečni sistem z večjo velikostjo gruče. Ustvarite lahko tudi particijo, tudi če to ni potrebno (na primer na bliskovnem pogonu). Ni treba ustvarjati praznih oddelkov ali puščati nedodeljenih območij - to bo pritegnilo pozornost zainteresiranih državljanov.

Pripomoček za poskuse

Lahko se dotaknete izvorne kode pripomočka tukaj

Za izdelavo boste potrebovali Qt različico 5.0 ali novejšo in OpenSSL. Če nekaj ne deluje, boste morda morali urediti datoteko steganodisk.pro.

Velikost gruče lahko spremenite s 4 KB na recimo 512 bajtov (v secretfile.h). Hkrati se bodo povečali stroški servisnih informacij: glava in kontrolna vsota zasedata fiksnih 68 bajtov.

Pripomoček morate seveda zagnati s pravicami korenskega uporabnika in previdno. Pred prepisom določene datoteke ali naprave ne bo nobenih vprašanj!

Uživajte.

Vir: www.habr.com

Dodaj komentar