Steganografija prošlih datoteka: skrivanje podataka izravno u sektorima

Kratak predgovor

Steganografija, ako se netko ne sjeća, skriva podatke u nekim kontejnerima. Na primjer, na slikama (razmotreno ovdje и ovdje). Također možete sakriti podatke u servisnim tablicama datotečnog sustava (o tome je pisano ovdje), pa čak i u servisnim paketima TCP protokola. Nažalost, sve ove metode imaju jedan nedostatak: da biste neprimjetno "umetnuli" informacije u spremnik, potrebni su vam lukavi algoritmi koji uzimaju u obzir osobitosti unutarnje strukture spremnika. Problemi nastaju s otpornošću spremnika na manipulaciju: na primjer, ako malo uredite sliku, izgubljene su skrivene informacije.

Je li moguće nekako bez lukavih algoritama i suptilnih manipulacija podacima, a opet osigurati funkcionalnost spremnika i prihvatljivu razinu sigurnosti skrivenih podataka? Gledajući unaprijed, reći ću - da, možete! Čak ću vam ponuditi pomoćni program.

Krvavi detalji metode

Osnovna ideja je jednostavna kao udarac u čelo: postoje područja na disku na koja operativni sustav nikada ne piše (ili piše u rijetkim slučajevima). Kako bismo izbjegli potrebu traženja tih područja pomoću lukavih algoritama, koristit ćemo redundanciju - to jest, duplicirat ćemo naše skrivene informacije mnogo, mnogo puta u svim sektorima diska. Zatim, na vrhu sve ove raskoši, možete kreirati potrebne particije, formatirati datotečne sustave, pisati datoteke i instalirati operativne sustave - svejedno će dio tajnih podataka biti spremljen i moći će se dohvatiti, a opetovano dupliciranje će nam pomoći sastaviti izvornu cjelinu iz dijelova.

Prednost ove metode je očigledna: ne ovisimo o formatu datoteke, pa čak ni o vrsti datotečnog sustava koji se koristi.

Mislim da su i nedostaci očiti:

  • Tajni podaci mogu se promijeniti samo potpunim prepisivanjem cijelog diska, nakon čega slijedi ponovno stvaranje sadržaja vidljivog korisniku. Međutim, ne možete koristiti softver koji ponovno stvara disk iz slike: on će također ponovno stvoriti prethodne tajne podatke.
  • Što je veća količina tajnih podataka, to je veća vjerojatnost gubitka nekih informacija.
  • Dohvaćanje podataka s diska može potrajati dugo. Od nekoliko minuta do nekoliko dana (moderni diskovi su veliki).

Sada prijeđimo na pojedinosti.

Jasno je da ako jednostavno razmažete tajne podatke po disku, oni će biti skriveni samo golim okom. Ako svoj pogled opremite, recimo, disk editorom, podaci će se pojaviti u punom sjaju. Stoga bi bilo dobro šifrirati podatke kako se ne bi pojavili. Šifrirat ćemo jednostavno, ali ukusno: pomoću algoritma aes256-cbc. Tražit ćemo od korisnika ključ za šifriranje i dopustiti mu da smisli dobru lozinku.

Sljedeće pitanje je kako možemo razlikovati "dobre" podatke od loših podataka. Ovdje će nam pomoći kontrolni zbroj, ali ne jednostavan, već SHA1. I što? Dovoljno je dobar za git, pa će i nama odgovarati. Odlučeno: svakom pohranjenom podatku dajemo kontrolni zbroj, a ako se nakon dešifriranja podudara, znači da je dešifriranje uspješno.

Također ćete trebati broj fragmenta i ukupnu dužinu tajnih podataka. Broj fragmenta služi za praćenje koje smo dijelove već dešifrirali, a koji su preostali. Ukupna duljina bit će nam korisna pri obradi posljednjeg fragmenta, kako ne bismo pisali nepotrebne podatke (to jest, padding). Pa, budući da još uvijek imamo zaglavlje, tamo ćemo dodati naziv tajne datoteke. Bit će korisno nakon dešifriranja, kako ne biste pogodili kako ga otvoriti.

Ispitivanje metode u praksi

Da bismo provjerili, uzmimo najčešći medij - flash pogon. Našao sam stari s kapacitetom od 1 GB, koji je sasvim pogodan za eksperimente. Ako ste, poput mene, došli na ideju da se ne zamarate fizičkim medijima, već da ga testirate na datoteci - slici diska, onda ću odmah reći: neće uspjeti. Prilikom formatiranja takvog "diska", Linux ponovno stvara datoteku, a svi neiskorišteni sektori bit će popunjeni nulama.

Kao stroj s Linuxom, nažalost, morao sam koristiti meteorološku stanicu na Raspberry Pi 3 koji leži na balkonu. Tamo nema puno memorije, pa nećemo skrivati ​​velike datoteke. Ograničavamo se na maksimalnu veličinu od 10 megabajta. Također nema smisla skrivati ​​datoteke koje su premale: uslužni program zapisuje podatke na disk u klasterima od 4 KB. Stoga ćemo se u nastavku ograničiti na datoteku od 3 kb - ona se uklapa u jedan takav klaster.

Rugat ćemo se flash pogonu u fazama, provjeravajući nakon svake faze jesu li skrivene informacije čitljive:

  1. Brzo formatiranje u FAT16 formatu s veličinom klastera od 16 KB. To je ono što Windows 7 nudi učiniti s flash pogonom koji nema datotečni sustav.
  2. Punjenje flash pogona svim vrstama smeća za 50%.
  3. Punjenje flash pogona svim vrstama smeća za 100%.
  4. “Dugo” formatiranje u FAT16 formatu (brisanje preko svega).

Prva dva testa, očekivano, završila su potpunom pobjedom: uslužni program uspio je uspješno izdvojiti 10 megabajta tajnih podataka s flash pogona. Ali nakon što se flash pogon napunio datotekama, dogodio se kvar:

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

Kao što vidite, samo 158 klastera je uspješno dešifrirano (632 kilobajta neobrađenih podataka, što daje 636424 bajta korisnog opterećenja). Jasno je da ovdje nema načina da dobijete 10 megabajta, a ipak među tim klasterima jasno postoje duplikati. Na ovaj način ne možete vratiti čak ni 1 megabajt. Ali možemo jamčiti da ćemo oporaviti 3 kilobajta tajnih podataka s flash pogona čak i nakon što se formatira i napiše do kraja. Međutim, eksperimenti pokazuju da je sasvim moguće izdvojiti datoteku dugu 120 kilobajta s takvog flash pogona.

Posljednji test je, nažalost, pokazao da je cijeli flash pogon prebrisan:

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

Niti jedan grozd nije preživio... Tužno, ali ne i tragično! Prije formatiranja, pokušajmo stvoriti particiju na flash pogonu, a već u njemu datotečni sustav. Usput, iz tvornice je došao s upravo takvim formatom, tako da ne radimo ništa sumnjivo.
Sasvim je očekivano da se raspoloživi prostor na flash disku malo smanjio.

Također je sasvim očekivano da se 10 megabajta ne bi moglo sakriti na potpuno punom disku. Ali sada se broj uspješno dešifriranih klastera više nego udvostručio!

Total clusters read: 250752, decrypted: 405

Nažalost, nemoguće je sastaviti megabajt iz dijelova, ali dvjesto kilobajta je lako.

Pa, vijest o posljednjoj, 4. provjeri, ovaj put je radosna: potpuno formatiranje takvog flash pogona nije dovelo do uništenja svih informacija! 120 kilobajta tajnih podataka savršeno stane u neiskorišten prostor.

Sažeta tablica testa:

Steganografija prošlih datoteka: skrivanje podataka izravno u sektorima

Malo teoretiziranja: o slobodnom prostoru i neiskorištenim sektorima

Ako ste ikada podijelili tvrdi disk na particije, možda ste primijetili da nije uvijek moguće dodijeliti sav slobodni prostor na disku. Prvi odjeljak uvijek počinje s određenom uvlakom (obično 1 megabajt ili 2048 sektora). Iza posljednjeg odjeljka također se događa da ostane mali "rep" neiskorištenih sektora. I ponekad postoje praznine između odjeljaka, iako rijetko.

Drugim riječima, na disku postoje sektori kojima se pri normalnom radu s diskom ne može pristupiti, ali se u te sektore mogu upisivati ​​podaci! A to znači i čitanje. Prilagođeno činjenici da postoji i tablica particija i kod za pokretanje sustava, koji se nalaze u praznom području na početku diska.

Odmorimo se nakratko od rubrika i pogledajmo disk iz, da tako kažem, ptičje perspektive. Ovdje imamo praznu particiju na disku. Kreirajmo u njemu datotečni sustav. Možemo li reći da neki sektori na disku ostaju neobrisani?

E-e-e - bubanj! Odgovor će gotovo uvijek biti da! Doista, u većini slučajeva stvaranje datotečnog sustava svodi se na zapisivanje samo nekoliko blokova servisnih informacija na disk, a inače se sadržaj particije ne mijenja.

Također - čisto empirijski - možemo pretpostaviti da datotečni sustav ne može uvijek zauzeti sav prostor koji mu je dodijeljen do zadnjeg sektora. Na primjer, datotečni sustav FAT16 s veličinom klastera od 64 kilobajta očito ne može u potpunosti zauzeti particiju veličine koja nije višekratnik 64 kilobajta. Na kraju takvog odjeljka mora postojati "rep" od nekoliko sektora, nedostupnih za pohranu korisničkih podataka. Međutim, ova se pretpostavka nije mogla eksperimentalno potvrditi.

Dakle, kako biste maksimalno iskoristili prostor dostupan za steganogram, trebate koristiti datotečni sustav s većom veličinom klastera. Također možete stvoriti particiju, čak i ako to nije potrebno (na primjer, na flash disku). Nema potrebe stvarati prazne odjeljke ili ostavljati nedodijeljena područja - to će privući pozornost zainteresiranih građana.

Uslužni program za eksperimente

Možete dodirnuti izvorni kod uslužnog programa здесь

Za izradu će vam trebati Qt verzija 5.0 ili novija i OpenSSL. Ako nešto ne radi, možda ćete morati urediti datoteku steganodisk.pro.

Možete promijeniti veličinu klastera od 4 KB do, recimo, 512 bajtova (u secretfile.h). Istodobno će se povećati cijena servisnih informacija: zaglavlje i kontrolni zbroj zauzimaju fiksnih 68 bajtova.

Morate pokrenuti uslužni program, naravno, s pravima root korisnika i s oprezom. Neće se postavljati pitanja prije prepisivanja navedene datoteke ili uređaja!

Uživati.

Izvor: www.habr.com

Dodajte komentar