Steganogrāfija pēc failiem: datu slēpšana tieši sektoros

Īss priekšvārds

Steganogrāfija, ja kāds neatceras, slēpj informāciju dažos konteineros. Piemēram, attēlos (apspriests šeit и šeit). Varat arī paslēpt datus failu sistēmas pakalpojumu tabulās (par to tika rakstīts šeit), un pat TCP protokola pakalpojumu paketēs. Diemžēl visām šīm metodēm ir viens trūkums: lai nemanāmi “ieliktu” informāciju konteinerā, ir nepieciešami viltīgi algoritmi, kas ņem vērā konteinera iekšējās struktūras īpatnības. Un problēmas rodas ar konteinera izturību pret manipulācijām: piemēram, nedaudz rediģējot attēlu, tiek zaudēta slēptā informācija.

Vai ir iespējams kaut kā iztikt bez viltīgiem algoritmiem un smalkām manipulācijām ar datiem un tomēr nodrošināt konteinera funkcionalitāti un pieņemamu slēpto datu drošības līmeni? Raugoties uz priekšu, es teikšu - jā, jūs varat! Es pat piedāvāšu lietderību.

Asiņainas metodes detaļas

Pamatideja ir vienkārša kā sitiens pa pieri: diskā ir apgabali, kuros operētājsistēma nekad neieraksta (vai retos gadījumos raksta). Lai izvairītos no nepieciešamības meklēt šīs jomas, izmantojot viltīgus algoritmus, mēs izmantosim dublēšanu - tas ir, mēs daudzkārt, daudzas reizes dublēsim savu slēpto informāciju visos diska sektoros. Pēc tam, tieši pa virsu visam šim krāšņumam, jūs varat izveidot nepieciešamos nodalījumus, formatēt failu sistēmas, rakstīt failus un instalēt operētājsistēmas - vienalga daļa slepeno datu tiks saglabāti un tos varēs izgūt, un atkārtota dublēšana mums palīdzēs salieciet oriģinālo veselumu no gabaliem.

Šīs metodes priekšrocība ir acīmredzama: mēs neesam atkarīgi no faila formāta vai pat no izmantotās failu sistēmas veida.

Arī trūkumi, manuprāt, ir acīmredzami:

  • Slepenos datus var mainīt, tikai pilnībā pārrakstot visu disku un pēc tam atkārtoti izveidojot lietotājam redzamo saturu. Tomēr jūs nevarat izmantot programmatūru, kas no attēla izveido disku no jauna: tā atjaunos arī iepriekšējos slepenos datus.
  • Jo lielāks ir slepeno datu apjoms, jo lielāka iespēja zaudēt kādu informāciju.
  • Datu izgūšana no diska var aizņemt ilgu laiku. No vairākām minūtēm līdz vairākām dienām (mūsdienu diski ir lieli).

Tagad pāriesim pie specifikas.

Ir skaidrs, ka, ja jūs vienkārši iesmērējat slepenos datus pa visu disku, tie tiks paslēpti tikai no neapbruņotas acs. Ja jūs aprīkojat savu skatienu ar, teiksim, diska redaktoru, dati parādīsies visā savā krāšņumā. Tāpēc būtu ieteicams datus šifrēt, lai tie netiktu parādīti. Mēs šifrēsim vienkārši, bet gaumīgi: izmantojot aes256-cbc algoritmu. Mēs prasīsim lietotājam šifrēšanas atslēgu un ļausim viņam izdomāt labu paroli.

Nākamais jautājums ir par to, kā mēs varam atšķirt “labus” datus no sliktiem datiem. Šeit mums palīdzēs kontrolsumma, bet ne vienkārša, bet gan SHA1. Un kas? Tas ir pietiekami labs gitam, tāpēc derēs arī mums. Nolemts: mēs nodrošinām katru saglabāto informāciju ar kontrolsummu, un, ja pēc atšifrēšanas tā sakrīt, tas nozīmē, ka atšifrēšana bija veiksmīga.

Jums būs nepieciešams arī fragmenta numurs un slepeno datu kopējais garums. Fragmenta numurs ir paredzēts, lai izsekotu, kurus gabalus mēs jau esam atšifrējuši un kuri ir palikuši. Kopējais garums mums noderēs, apstrādājot pēdējo fragmentu, lai nerakstītu liekus datus (tas ir, polsterējumu). Tā kā mums joprojām ir galvene, mēs tur pievienosim slepenā faila nosaukumu. Tas noderēs pēc atšifrēšanas, lai neuzminētu, kā to atvērt.

Metodes pārbaude praksē

Lai pārbaudītu, ņemsim visizplatītāko datu nesēju - zibatmiņas disku. Atradu vecu ar 1 GB ietilpību, kas ir diezgan piemērots eksperimentiem. Ja jums, tāpat kā man, radās ideja neuztraukties ar fizisko datu nesēju, bet gan pārbaudīt to failā - diska attēlā, tad es uzreiz teikšu: tas nedarbosies. Formatējot šādu “disku”, Linux izveido failu vēlreiz, un visi neizmantotie sektori tiks aizpildīti ar nullēm.

Man kā mašīnai ar Linux diemžēl nācās izmantot meteoroloģisko staciju uz balkona guļošā Raspberry Pi 3. Tur nav daudz atmiņas, tāpēc lielus failus neslēpsim. Mēs ierobežojam sevi ar maksimālo izmēru 10 megabaiti. Nav arī jēgas slēpt pārāk mazus failus: utilīta ieraksta datus diskā 4 KB klasteros. Tāpēc tālāk mēs aprobežosimies ar 3 kb failu - tas iekļaujas vienā šādā klasterī.

Mēs ņirgāsimies par zibatmiņas disku pakāpeniski, pēc katra posma pārbaudot, vai slēptā informācija ir salasāma:

  1. Ātra formatēšana FAT16 formātā ar klastera izmēru 16 KB. Tas ir tas, ko Windows 7 piedāvā darīt ar zibatmiņas disku, kuram nav failu sistēmas.
  2. Zibatmiņas diska piepildīšana ar visa veida atkritumiem par 50%.
  3. Zibatmiņas diska piepildīšana ar visa veida atkritumiem par 100%.
  4. “Garais” formatējums FAT16 formātā (pārrakstot visu).

Pirmie divi testi, kā gaidīts, beidzās ar pilnīgu uzvaru: utilīta spēja veiksmīgi izvilkt no zibatmiņas diska 10 megabaitus slepenu datu. Bet pēc tam, kad zibatmiņas disks tika piepildīts ar failiem, radās kļūme:

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

Kā redzat, tika veiksmīgi atšifrēti tikai 158 klasteri (632 kilobaiti neapstrādātu datu, kas nodrošina 636424 10 baitus lietderīgās slodzes). Ir skaidrs, ka šeit nav iespējams iegūt 1 megabaitus, un tomēr starp šīm kopām ir skaidri redzami dublikāti. Šādā veidā jūs pat nevarat atgūt 3 megabaitu. Taču mēs varam garantēt, ka no zibatmiņas diska atgūsim 120 kilobaitus slepeno datu pat pēc tā formatēšanas un ierakstīšanas līdz ietilpībai. Taču eksperimenti liecina, ka no šāda zibatmiņas diska ir pilnīgi iespējams izvilkt XNUMX kilobaitus garu failu.

Diemžēl pēdējā pārbaude parādīja, ka viss zibatmiņas disks tika pārrakstīts:

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

Neviens puduris nav saglabājies... Skumji, bet ne traģiski! Pirms formatēšanas mēģināsim izveidot nodalījumu zibatmiņas diskā un jau tajā failu sistēmu. Starp citu, tas nāca no rūpnīcas tieši ar šādu formatējumu, tāpēc neko aizdomīgu nedarām.
Paredzams, ka zibatmiņas diskā pieejamā vieta ir nedaudz samazinājusies.

Ir arī diezgan sagaidāms, ka 10 megabaitus nevarēja paslēpt pilnīgi pilnā diskā. Bet tagad veiksmīgi atšifrēto klasteru skaits ir vairāk nekā dubultojies!

Total clusters read: 250752, decrypted: 405

Diemžēl nav iespējams salikt megabaitu no gabaliem, bet divi simti kilobaitu ir viegli.

Nu, ziņas par pēdējo, 4. pārbaudi, šoreiz ir priecīgas: pilnīga šāda zibatmiņas diska formatēšana neizraisīja visas informācijas iznīcināšanu! 120 kilobaiti slepenu datu lieliski iekļaujas neizmantotā telpā.

Testa kopsavilkuma tabula:

Steganogrāfija pēc failiem: datu slēpšana tieši sektoros

Mazliet teoretizējot: par brīvu vietu un neizmantotajiem sektoriem

Ja kādreiz esat sadalījis cieto disku nodalījumos, iespējams, pamanījāt, ka ne vienmēr ir iespējams piešķirt visu diskā esošo brīvo vietu. Pirmā sadaļa vienmēr sākas ar kādu atkāpi (parasti 1 megabaits jeb 2048 sektori). Aiz pēdējās sadaļas arī gadās, ka paliek neliela neizmantotu sektoru “aste”. Un dažreiz starp sadaļām ir atstarpes, lai gan reti.

Citiem vārdiem sakot, diskā ir sektori, kuriem parastā darba laikā ar disku nevar piekļūt, bet datus var ierakstīt šajos sektoros! Un tas nozīmē arī to izlasīt. Pielāgots tam, ka ir arī nodalījuma tabula un bootloader kods, kas atrodas diska sākumā tukšajā zonā.

Uz brīdi paņemsim pauzi no sadaļām un paskatīsimies uz disku, tā teikt, no putna lidojuma. Šeit mums ir tukšs diska nodalījums. Izveidosim tajā failu sistēmu. Vai varam teikt, ka daži diska sektori paliek neizdzēsti?

E-e-e - bungu ripināšana! Atbilde gandrīz vienmēr būs jā! Patiešām, vairumā gadījumu, izveidojot failu sistēmu, diskā jāieraksta tikai daži pakalpojuma informācijas bloki, un pretējā gadījumā nodalījuma saturs nemainās.

Un arī - tīri empīriski - mēs varam pieņemt, ka failu sistēma ne vienmēr var aizņemt visu tai atvēlēto vietu līdz pēdējam sektoram. Piemēram, FAT16 failu sistēma ar klastera lielumu 64 kilobaiti acīmredzami nevar pilnībā aizņemt nodalījumu, kura izmērs nav 64 kilobaitu reizinājums. Šādas sadaļas beigās būs jābūt vairāku sektoru “astei”, kas nav pieejama lietotāja datu glabāšanai. Tomēr šo pieņēmumu nevarēja apstiprināt eksperimentāli.

Tātad, lai maksimāli palielinātu steganogrammai pieejamo vietu, ir jāizmanto failu sistēma ar lielāku klastera izmēru. Varat arī izveidot nodalījumu, pat ja tas nav nepieciešams (piemēram, zibatmiņas diskā). Nevajag veidot tukšas sadaļas vai atstāt nepiešķirtas platības – tas piesaistīs ieinteresēto iedzīvotāju uzmanību.

Lietderība eksperimentiem

Varat pieskarties utilīta avota kodam šeit

Lai izveidotu, jums būs nepieciešama Qt versija 5.0 vai jaunāka versija un OpenSSL. Ja kaut kas nedarbojas, iespējams, būs jārediģē fails steganodisk.pro.

Varat mainīt klastera lielumu no 4 KB uz, piemēram, 512 baitiem (failā secretfile.h). Tajā pašā laikā palielināsies pakalpojuma informācijas izmaksas: galvene un kontrolsumma aizņem fiksētus 68 baitus.

Protams, jums ir jāpalaiž utilīta ar root lietotāja tiesībām un piesardzīgi. Pirms norādītā faila vai ierīces pārrakstīšanas jautājumi netiks uzdoti!

Izbaudi.

Avots: www.habr.com

Pievieno komentāru