Kratak uvod
Steganografija, ako se netko ne sjeća, je skrivanje informacija unutar nekih kontejnera. Na primjer, u slikama (o čemu se raspravljalo i ). Također se mogu skrivati podaci u rezerviranim tablicama datotečnog sustava (o tome se pisalo ), pa čak i . Nažalost, svi ti metodi imaju jedan nedostatak: da bi se neprimjetno "ubacila" informacija u kontejner, potrebni su pametni algoritmi koji uzimaju u obzir karakteristike unutarnje strukture kontejnera. A i dugotrajnost kontejnera na manipulacije predstavljaju problem: na primjer, ako se malo uređuje slika, skrivena informacija se gubi.
Može li se nekako zaobići potreba za pametnim algoritmima i delikatnim manipulacijama s podacima, a da pritom i dalje osiguramo funkcionalnost kontejnera i prihvatljivu razinu očuvanja skrivenih podataka? Da unaprijed kažem — da, može! I čak ću ponuditi programčić.
Krvave pojedinosti metode
Osnovna ideja je jednostavna kao udarac batinom u čelo: na disku postoje područja u koja operativni sustav nikada ne piše (ili piše u rijetkim slučajevima). Da ne bismo morali tražiti ta područja složenim algoritmima, iskoristit ćemo suvišnost — to jest, mnogo, mnogo puta ćemo duplicirati naše skrivene informacije po svim sektorima diska. Zatim, izravno preko sve te raskoši možemo kreirati potrebne particije, formatirati datotečne sustave, pisati datoteke i instalirati operacijske sustave — svejedno će dio tajnih podataka ostati i moći će se izvući, a višestruko dupliciranje će nam pomoći da sastavimo iz komadića izvorni cjelina.
Prednost ove metode je očigledna: ne ovisimo ni o formatu datoteka, niti čak o tipu korištenog datotečnog sustava.
Nedostaci su također, mislim, očigledni:
- Tajne podatke moguće je promijeniti samo potpunim prepisivanjem cijelog diska, uz naknadno obnavljanje vidljivog sadržaja korisniku. Pri tome ne smijemo koristiti softver koji obnavlja disk iz slike: on će obnoviti i prethodne tajne podatke.
- Što je veći volumen tajnih podataka, to je veća vjerojatnost gubitka dijela informacija.
- Izdvajanje podataka s diska može potrajati dugo. Od nekoliko minuta do nekoliko dana (moderni diskovi su veći).
Sada pređimo na pojedinosti.
Jasno je da, ako jednostavno raširimo tajne podatke po cijelom disku, oni će biti skriveni samo od neobučenog oka. Ako naoružamo pogled, recimo, uređivačem diska, podaci će se otkriti u svojoj punoj ljepoti. Stoga bi bilo dobro da podatke enkriptiramo, kako ne bi bili očigledni. Enkriptirat ćemo jednostavno, ali sa stilom: prema algoritmu aes256-cbc. Ključ za enkripciju zatražit ćemo od korisnika, neka smisli dobar lozinku.
Sljedeće pitanje je kako razlikovati „ispravne“ podatke od pokvarenih. Tu nam pomaže kontrolna suma, a ne obična, već SHA1. Zašto ne? Za git je dovoljno dobar, pa će odgovarati i nama. Odlučeno: opskrbit ćemo svaki sačuvani fragment informacija kontrolnom sumom, i ako se nakon dekripcije poklapa — onda je dekripcija uspjela.
Također će nam biti potreban broj fragmenta i ukupna duljina tajnih podataka. Broj fragmenta — kako bismo pratili koje smo dijelove već dekriptirali, a koji su ostali. Ukupna duljina bit će nam korisna prilikom obrade posljednjeg fragmenta, kako ne bismo pisali suvišne podatke (čitaj: padding). Kako se ionako sprema naslov, dodat ćemo ime tajne datoteke. Ono će nam trebati nakon dekripcije, kako ne bismo nagađali čime je otvoriti.
Testiramo metodu u praksi
Za testiranje ćemo uzeti najrasprostranjeniji medij — USB flash. Našao sam staru od 1 GB, što je sasvim u redu za eksperiment. Ako vam, kao i meni, padne na pamet ne mučiti se s fizičkim medijima, nego testirati na datoteci — slici diska, odmah ću reći: ne ide. Prilikom formatiranja takvog „diska“, Linux ga ponovno stvara, i svi neiskorišteni sektori bit će ispunjeni nulama.
Nažalost, za mašinu s Linuxom morao sam iskoristiti meteorološku stanicu na Raspberry Pi 3 koja se našla na balkonu. Memorije tamo nema mnogo, pa nećemo skrivati velike datoteke. Ograničit ćemo se na maksimalnu veličinu od 10 megabajta. Previše male datoteke također nema smisla skrivati: alat zapisuje podatke na disk u blokovima od 4 KB. Stoga ćemo se ograničiti na datoteku od 3 KB — ona se uklapa u jedan takav blok.
Mučit ćemo USB flash korak po korak, provjeravajući nakon svake faze je li skrivena informacija čitljiva:
- Brzo formatiranje u FAT16 s veličinom klastera od 16 kB. To je ono što Windows 7 nudi učiniti s flash diskom koji nema datotečni sustav.
- Punjenje flash diska raznoraznim smećem do 50%.
- Punjenje flash diska raznoraznim smećem do 100%.
- „Dugo“ formatiranje u FAT16 (s prepisivanjem svega).
Prva dva testa završila su očekivano potpunom pobjedom: alat je uspješno uspio izvući 10 megabajta tajnih podataka s flash diska. No nakon što je flash disk bio prepun datoteka, došlo je do kvara:
Ukupno pročitani klasteri: 250752, dekriptirani: 158
GREŠKA: ne može se zapisati nepotpuni secretFile
Kao što vidimo, uspješno je dešifrirano samo 158 klastera (632 kilobajta sirovih podataka, što daje 636424 bajta korisnog tereta). Jasno je da ovdje nema šanse prikupiti 10 megabajta, a među tim klasterima očito ima duplikata. Čak se ni 1 megabajt na taj način više ne može obnoviti. No, može se jamčiti da ćemo 3 kilobajta tajnih podataka obnoviti s flash diska čak i nakon što se formatira i napuni do kraja. Međutim, eksperimenti pokazuju da je s takvog flash diska moguće izvući datoteku duljine 120 kilobajta.
Nažalost, posljednji test pokazao je da je flash disk bio potpuno prepisan:
$ sudo ./steganodisk -p password /dev/sda
Veličina uređaja: 250752 klastera
250700 99%
Ukupno pročitani klasteri: 250752, dekriptirani: 0
GREŠKA: ne može se zapisati nepotpuni secretFile
Nijedan klaster nije sačuvan... Žalosno, ali ne i tragično! Pokušat ćemo prije formatiranja stvoriti particiju na flash disku, a zatim u njoj — datotečni sustav. Usput, s tvornice je došao upravo s takvim formatiranjem, tako da ne radimo ništa sumnjivo.
Očekivano je da je dostupni prostor na flash disku malo smanjen.
Također je očekivano da 10 megabajta nije moglo biti skriveno na potpuno punom disku. Ali zato se sada broj uspješno dešifriranih klastera više nego udvostručio!
Ukupni klasteri pročitani: 250752, dešifrirani: 405
Nažalost, nije moguće skupiti megabajt iz komadića, ali 200 kilobajta — lako.
I vijest o posljednjem, 4. testiranju, ovaj put je vesela: potpuno formatiranje takvog flash diska nije dovelo do uništenja svih informacija! 120 kilobajta tajnih podataka savršeno se uklopilo u neiskorišteni prostor.
Sažeta tabela testiranja:

Malo teorije: o slobodnom prostoru i neiskorištenim sektorima
Ako ste ikada podijelili tvrdi disk na particije, mogli ste primijetiti da nije uvijek moguće iskoristiti sav slobodni prostor na disku. Prva particija uvijek počinje s određenim odstupanjem (obično to bude 1 megabajt ili 2048 sektora). Iza posljednje particije također ponekad ostane mali 'rep' neiskorištenih sektora. Čak i između particija ponekad ostaju razmaci, iako rijetko.
Drugim riječima, na disku postoje sektori kojima se ne može pristupiti tijekom običnog rada s diskom, ali podaci se mogu zapisati u te sektore! A to znači da se mogu i pročitati. Uz napomenu da postoji još tablica particija i učitavača, koji su smješteni u praznom području na početku diska.
Odvojimo se na trenutak od particija i pogledajmo disk s visine, da tako kažemo, iz ptičje perspektive. Imamo na disku praznu particiju. Stvorimo u njoj datotečni sustav. Možemo li reći da su neki sektori na disku ostali neizbrisani?
I-i-i — bubnjevi! Odgovor će gotovo uvijek biti — da! Naime, u većini slučajeva, stvaranje datotečnog sustava svodi se na to da se na disk zapisuje samo nekoliko blokova servisnih informacija, dok se u ostalom sadržaj particije ne mijenja.
Osim toga — čisto empirijski — može se pretpostaviti da datotečni sustav ne može uvijek zauzeti sav prostor koji mu je dodijeljen do posljednjeg sektora. Na primjer, datotečni sustav FAT16 s veličinom klastera od 64 kilobajta očito ne može potpuno ispuniti particiju veličine koja nije višekratnik od 64 kilobajta. Na kraju takve particije morat će ostati 'rep' od nekoliko sektora, nedostupnih za pohranu korisničkih podataka. Međutim, eksperimentalno ovu pretpostavku nije bilo moguće potvrditi.
Dakle, kako biste maksimizirali prostor dostupan za steganogram, potrebno je koristiti datotečni sustav s većom veličinom klastera. Također možete stvoriti particiju, čak i ako to nije nužno (na primjer, na USB-u). Ne treba stvarati prazne particije ili ostavljati neizdijeljena područja — to će privući pažnju znatiželjnih građana.
Alat za eksperimente
Izvore alata možete isprobati
Za kompilaciju će biti potrebni Qt verzije 5.0 i više i OpenSSL. Ako se nešto ne kompajlira — možda će biti potrebno prilagoditi datoteku steganodisk.pro.
Možete promijeniti veličinu klastera sa 4 Kb na, recimo, 512 bajta (u secretfile.h). Tada će se povećati troškovi za pomoćne informacije: zaglavlje i kontrolna suma zauzimaju fiksnih 68 bajtova.
Pokretanje alata treba, naravno, obaviti s pravima korisnika root, i to s oprezom. Neće biti nikakvih upozorenja prije prepisivanja navedenog datoteke ili uređaja!
Uživajte.
Izvor: habr.com
