Steganografie dincolo de fișiere: ascunzând date direct în sectoare

O scurtă introducere

Steganografia, dacă cineva nu își amintește, este ascunderea informațiilor în diverse containere. De exemplu, în imagini (discutate aici și aici). De asemenea, se pot ascunde date în tabelele de sistem ale sistemului de fișiere (despre care s-a scris aici), și chiar în pachetele de control ale protocolului TCP. Din păcate, toate aceste metode au un dezavantaj: pentru a „încorpora” informații în mod invizibil într-un container, sunt necesare algoritmi ingenioși care să ia în considerare specificitatea structurii interne a containerului. De asemenea, există probleme cu rezistența containerului la manipulări: de exemplu, dacă se modifică puțin o imagine, informația ascunsă se pierde.

Este posibil să se evite algoritmii ingenioși și manipulările delicate cu datele și, în același timp, să se asigure funcționarea containerului și un nivel acceptabil de păstrare a datelor ascunse? Între timp, pot să spun — da, se poate! Și chiar voi propune un utilitar.

Detaliile metodului

Ideea de bază este simplă, ca o lovitură cu ciocanul în cap: pe disc există zone în care sistemul de operare nu scrie niciodată (sau scrie în cazuri rare). Pentru a nu fi necesar să căutăm aceste zone cu algoritmi ingenioși, ne vom folosi de redundanță — adică vom multiplica informația noastră ascunsă de multe ori în toate sectoarele discului. Apoi, direct deasupra acestei bogății, se pot crea cele necesare partitii, se pot formata sistemele de fișiere, se pot scrie fișiere și se pot instala sistemele de operare — oricum, o parte din datele secrete vor rămâne și le vom putea extrage, iar multiplicarea repetată ne va ajuta să reconstruim informația inițială din fragmente.

Avantajul acestei metode este evident: nu depindem de formatul fișierelor sau chiar de tipul sistemului de fișiere utilizat.

Dezavantajele sunt, cred, la fel de evidente:

  • Datele secrete pot fi modificate doar prin rescrierea completă a întregului disc, urmată de reconstrucția conținutului vizibil pentru utilizator. În acest caz, nu se poate folosi software care reconstruiește discul dintr-o imagine: acesta va reconstrui și datele secrete anterioare.
  • Cu cât volumul datelor secrete este mai mare, cu atât mai mare este probabilitatea de pierdere a unei părți din informație.
  • Extracția datelor de pe disc poate dura mult timp. De la câteva minute la câteva zile (discurile moderne sunt mai mari).

Acum să trecem la detalii.

Este clar că, dacă doar împrăștie informațiile sensibile pe întregul disc, acestea vor fi ascunse doar de un ochi neechipat. Dacă echipăm ochiul, să spunem, cu un editor de disc, datele vor fi la vedere. Prin urmare, ar fi bine să le criptăm, astfel încât să nu fie evidente. Voi folosi o criptare simplă, dar elegantă: cu algoritmul aes256-cbc. Vom cere utilizatorului cheia de criptare; să își găsească o parolă bună.

Întrebarea următoare este cum să distingem datele „corecte” de cele corupte. Aici ne va ajuta un checksum, dar nu unul obișnuit, ci SHA1. De ce nu? Pentru git este suficient de bun, deci ne va fi și nouă util. Așadar, am decis: vom echipa fiecare fragment salvat de informație cu un checksum, și dacă acesta coincide după decriptare, înseamnă că decriptarea a avut succes.

De asemenea, va fi necesar numărul fragmentului și lungimea totală a datelor secrete. Numărul fragmentului este pentru a urmări ce piese am decriptat deja și care au rămas. Lungimea totală ne va fi de folos la procesarea ultimului fragment, pentru a nu scrie date suplimentare (în termeni tehnici, padding). Și, deoarece oricum ne pregătim un titlu, să adăugăm acolo numele fișierului secret. Acesta ne va fi de ajutor după decriptare, pentru a ști cu ce să-l deschidem.

Testăm metoda în practică

Pentru verificare, vom folosi cel mai comun suport — un stick USB. Am găsit unul vechi de 1 GB, care este perfect pentru experimente. Dacă și ție, ca și mie, ți-a venit ideea să nu te complici cu suporturile fizice, ci să testezi pe un fișier — imagine de disc, atunci îți spun imediat: nu va funcționa. Atunci când formatezi un astfel de „disc”, linuxul recreează fișierul, iar toate sectoarele neutilizate vor fi umplute cu zerouri.

Din păcate, am fost nevoit să folosesc o stație meteorologică pe Raspberry Pi 3 care zăcea pe balcon ca mașină cu linux. Memoria este limitată, așa că nu vom ascunde fișiere mari. Ne vom limita la o dimensiune maximă de 10 megabaiți. Fișierele prea mici nu merită ascunse: utilitarul scrie date pe disc în clustere de 4 KB. Așadar, vom limita dimensiunea fișierului la 3 KB — acesta încapă într-un astfel de cluster.

Ne vom ocupa de stick-ul USB pas cu pas, verificând după fiecare etapă dacă informația ascunsă este citibilă:

  1. Formatare rapidă în format FAT16 cu o dimensiune a cluster-ului de 16 kB. Aceasta este ceea ce oferă Windows 7 pentru un stick USB fără sistem de fișiere.
  2. Umplerea stick-ului cu tot felul de fișiere inutile în proporție de 50%.
  3. Umplerea stick-ului cu tot felul de fișiere inutile în proporție de 100%.
  4. Formatare „îndelungată” în format FAT16 (cu rescrierea întregului conținut).

Primele două teste s-au încheiat, precum era de așteptat, cu o victorie completă: utilitarul a reușit să extragă cu succes 10 megabytes de date secrete de pe stick. Însă, după ce stick-ul a fost umplut complet cu fișiere, a apărut o eroare:

Total de clustere citite: 250752, decriptate: 158
EROARE: nu se poate scrie secretFile incomplet

Așa cum vedem, am reușit să decriptăm doar 158 de clustere (632 kilobytes de date brute, ceea ce oferă 636424 bytes de sesiuni utile). Este clar că nu se pot obține 10 megabytes aici, iar printre aceste clustere există evident duplicate. Chiar și 1 megabyte nu poate fi recuperat astfel. Totuși, putem garanta că 3 kilobytes de date secrete vor fi recuperate de pe stick chiar și după ce acesta a fost formatat și umplut complet. Cu toate acestea, experimentele arată că este perfect posibil să extragi un fișier cu o lungime de 120 kilobytes de pe un astfel de stick.

Ultimul test, din păcate, a arătat că stick-ul a fost complet rescris:

$ sudo .\/steganodisk -p parola \/dev\/sda
Dimensiunea dispozitivului: 250752 clustere
250700 99%
Total clustere citite: 250752, decriptate: 0
EROARE: nu se poate scrie secretFile incomplet

Nu a rămas niciun cluster... Trist, dar nu tragic! Vom încerca să creăm o partiție pe stick înainte de format, iar în acea partiție - un sistem de fișiere. Apropo, el a venit din fabrică cu o astfel de formatare, așa că nu facem nimic suspect.
Era de așteptat ca spațiul disponibil pe stick să fi scăzut puțin.

De asemenea, era de așteptat ca cei 10 megabytes să nu fie ascunși pe un disc complet umplut. Dar, cu toate acestea, numărul cluster-elor decriptate cu succes a crescut de mai mult de două ori!

Total clustere citite: 250752, decriptate: 405

Din păcate, nu va fi posibil să aduni un megabyte din fragmente, dar 200 de kilobytes se pot obține ușor.

Bine, iar vestea despre ultimul, al 4-lea test, de data aceasta este veselă: formatarea completă a unui astfel de stick nu a dus la distrugerea întregii informații! 120 kilobytes de date secrete s-au încăput perfect în spațiul neutilizat.

Tabel sumar al testării:

Steganografie dincolo de fișiere: ascunzând date direct în sectoare

Puțină teorie: despre spațiul liber și sectoarele neutilizate

Dacă ai împărțit vreodată un hard disk în partiții, ai remarcat că nu întotdeauna reușești să aloci tot spațiul liber de pe disc. Prima partiție începe întotdeauna cu o anumită margine (de obicei, aceasta este de 1 megabyte sau 2048 sectoare). De asemenea, după ultima partiție, uneori rămâne un mic "coadă" de sectoare nefolosite. Și între partiții, uneori rămân goluri, deși rar.

Cu alte cuvinte, pe disc există sectoare la care nu ai acces în timpul utilizării obișnuite, dar datele pot fi totuși scrise în aceste sectoare! Așadar, pot fi citite și ele. Cu mențiunea că există și o tabelă de partiții și un cod de boot, care se află în zona goală de la începutul discului.

Să ne abatem de la partiții și să privim discul dintr-o perspectivă mai înaltă, așa să zic, ca din zborul unei păsări. Avem o partiție goală pe disc. Vom crea un sistem de fișiere în ea. Putem spune că unele sectoare de pe disc au rămas neșterse?

Și... tobe! Răspunsul va fi aproape întotdeauna — da! Deoarece, în majoritatea cazurilor, crearea unui sistem de fișiere constă în scrierea pe disc a doar câtorva blocuri de informații de sistem, iar conținutul restului partiției nu se schimbă.

Și, pur și simplu din experiență, se poate presupune că sistemul de fișiere nu poate ocupa întotdeauna tot spațiul alocat până la ultimul sector. De exemplu, sistemul de fișiere FAT16 cu dimensiunea clusterului de 64 kilobytes nu poate ocupa complet o partiție cu o dimensiune care nu este multiplu de 64 kilobytes. La sfârșitul unei astfel de partiții, va trebui să rămână o "coadă" de câteva sectoare, inaccesibile pentru stocarea datelor utilizatorului. Totuși, experimental, această presupunere nu a fost confirmată.

Așadar, pentru a maximiza spațiul disponibil pentru steganogramă, trebuie să folosești un sistem de fișiere cu o dimensiune mai mare a clusterului. Poți chiar să creezi o partiție, chiar dacă nu este necesar (de exemplu, pe un stick USB). Nu este necesar să creezi partiții goale sau să lași zone nealocate — acestea ar atrage atenția cetățenilor interesați.

Utilitar pentru experimente

Sursa utilitarului poate fi explorată aici

Pentru a construi, va fi nevoie de Qt versiunea 5.0 sau mai recentă și OpenSSL. Dacă ceva nu se compilează - s-ar putea să fie nevoie să ajustezi fișierul steganodisk.pro.

Este posibil să schimbați dimensiunea clusterului de la 4 KB la, să spunem, 512 byte (în secretfile.h). Aceasta va crește cheltuielile pentru informațiile administrative: antetul și suma de control ocupă 68 byte fix.

Desigur, trebuie să rulați utilitarul cu drepturi de utilizator root, și trebuie făcut cu prudență. Nu vor fi întrebări înainte de a rescrie fișierul sau dispozitivul specificat!

Bucurați-vă.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster