Steganografia după fișiere: ascunderea datelor direct în sectoare

O mică prefață

Steganografia, dacă cineva nu își amintește, ascunde informații în unele containere. De exemplu, în imagini (discutate aici и aici). De asemenea, puteți ascunde datele în tabelele de servicii ale sistemului de fișiere (despre acest lucru s-a scris aici), și chiar în pachetele de servicii de protocol TCP. Din păcate, toate aceste metode au un dezavantaj: pentru a „insera” informații imperceptibil într-un container, aveți nevoie de algoritmi vicleni care țin cont de particularitățile structurii interne a containerului. Și apar probleme cu rezistența containerului la manipulare: de exemplu, dacă editați puțin imaginea, informațiile ascunse se pierd.

Este posibil să faceți cumva fără algoritmi vicleni și manipulări subtile cu date și să asigurați în continuare funcționalitatea containerului și un nivel acceptabil de securitate a datelor ascunse? Privind în viitor, voi spune - da, poți! O să ofer chiar și o utilitate.

Detalii sângeroase ale metodei

Ideea de bază este la fel de simplă ca o lovitură în frunte: există zone pe disc în care sistemul de operare nu scrie niciodată (sau scrie în cazuri rare). Pentru a evita nevoia de a căuta aceste zone folosind algoritmi vicleni, vom folosi redundanța - adică ne vom duplica informațiile ascunse de multe, de multe ori în toate sectoarele discului. Apoi, chiar peste toată această splendoare, puteți crea partițiile necesare, formata sistemele de fișiere, scrieți fișiere și instalați sisteme de operare - cu toate acestea, o parte din datele secrete vor fi salvate și vor putea fi recuperate, iar duplicarea repetată ne va ajuta puneți întregul original împreună din bucăți.

Avantajul acestei metode este evident: nu depindem de formatul de fișier și nici măcar de tipul de sistem de fișiere folosit.

Dezavantajele sunt de asemenea, cred, evidente:

  • Datele secrete pot fi modificate doar prin rescrierea completă a întregului disc, urmată de recrearea conținutului vizibil utilizatorului. Cu toate acestea, nu puteți utiliza software care recreează discul dintr-o imagine: va recrea și datele secrete anterioare.
  • Cu cât volumul de date secrete este mai mare, cu atât este mai mare probabilitatea de a pierde unele informații.
  • Recuperarea datelor de pe disc poate dura mult timp. De la câteva minute la câteva zile (discurile moderne sunt mari).

Acum să trecem la detalii.

Este clar că, dacă pur și simplu mânjiți date secrete pe tot discul, acestea vor fi ascunse doar cu ochiul liber. Dacă îți echipezi privirea cu, să zicem, un editor de disc, datele vor apărea în toată gloria. Prin urmare, ar fi o idee bună să criptați datele, astfel încât acestea să nu apară. Vom cripta simplu, dar cu gust: folosind algoritmul aes256-cbc. Vom cere utilizatorului cheia de criptare și îl vom lăsa să vină cu o parolă bună.

Următoarea întrebare este cum putem distinge datele „bune” de datele proaste. Aici ne va ajuta o sumă de control, dar nu una simplă, ci SHA1. Si ce? Este suficient de bun pentru git, așa că ne va potrivi și nouă. Hotărât: oferim fiecărei informații stocate o sumă de control, iar dacă după decriptare se potrivește, înseamnă că decriptarea a avut succes.

Veți avea nevoie, de asemenea, de numărul fragmentului și de lungimea totală a datelor secrete. Numărul fragmentului este pentru a urmări ce piese am descifrat deja și care au rămas. Lungimea totală ne va fi utilă la procesarea ultimului fragment, pentru a nu scrie date inutile (adică umplutură). Ei bine, deoarece mai avem un antet, vom adăuga acolo numele fișierului secret. Va fi util după decriptare, pentru a nu ghici cum se deschide.

Testarea metodei în practică

Pentru a verifica, să luăm cel mai comun mediu - o unitate flash. Am găsit unul vechi cu o capacitate de 1 GB, care este destul de potrivit pentru experimente. Dacă ți-a venit, ca și mine, ideea de a nu te deranja cu mediul fizic, ci de a-l testa pe un fișier - o imagine de disc, atunci voi spune imediat: nu va funcționa. Când formatează un astfel de „disc”, Linux creează din nou fișierul și toate sectoarele neutilizate vor fi umplute cu zerouri.

Ca mașină cu Linux, din păcate, a trebuit să folosesc o stație meteo pe Raspberry Pi 3, întinsă pe balcon, nu există multă memorie acolo, așa că nu vom ascunde fișiere mari. Ne limităm la o dimensiune maximă de 10 megaocteți. De asemenea, nu are rost să ascunzi fișierele care sunt prea mici: utilitarul scrie datele pe disc în clustere de 4 KB. Prin urmare, mai jos ne vom limita la un fișier de 3 kb - se încadrează într-un astfel de cluster.

Vom bate joc de unitatea flash în etape, verificând după fiecare etapă dacă informațiile ascunse sunt lizibile:

  1. Formatare rapidă în format FAT16 cu o dimensiune a clusterului de 16 KB. Aceasta este ceea ce Windows 7 oferă de a face cu o unitate flash care nu are un sistem de fișiere.
  2. Umplerea unității flash cu tot felul de gunoi cu 50%.
  3. Umplerea unității flash cu tot felul de gunoi cu 100%.
  4. Formatare „lungă” în format FAT16 (suprascrierea tuturor).

Primele două teste, așa cum era de așteptat, s-au încheiat cu o victorie completă: utilitarul a reușit să extragă cu succes 10 megaocteți de date secrete de pe unitatea flash. Dar după ce unitatea flash a fost umplută la capacitate maximă cu fișiere, a apărut o eroare:

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

După cum puteți vedea, doar 158 de clustere au fost decriptate cu succes (632 de kiloocteți de date brute, ceea ce oferă 636424 de octeți de încărcare utilă). Este clar că nu există nicio modalitate de a obține 10 megaocteți aici și, totuși, printre aceste clustere există în mod clar duplicate. Nici măcar nu puteți recupera 1 megaoctet în acest fel. Dar putem garanta că vom recupera 3 kiloocteți de date secrete de pe o unitate flash chiar și după ce va fi formatată și scrisă la capacitate maximă. Cu toate acestea, experimentele arată că este foarte posibil să extragi un fișier de 120 de kiloocteți de pe o astfel de unitate flash.

Ultimul test, din păcate, a arătat că întreaga unitate flash a fost suprascrisă:

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

Nici un grup nu a supraviețuit... Trist, dar deloc tragic! Înainte de formatare, să încercăm să creăm o partiție pe unitatea flash și deja în ea un sistem de fișiere. Apropo, a venit din fabrică exact cu această formatare, așa că nu facem nimic suspect.
Este de așteptat ca spațiul disponibil pe unitatea flash să fi scăzut ușor.

De asemenea, este de așteptat ca 10 megaocteți să nu poată fi ascunși pe un disc complet plin. Dar acum numărul de clustere decriptate cu succes s-a dublat!

Total clusters read: 250752, decrypted: 405

Din păcate, este imposibil să asamblați un megaoctet din bucăți, dar două sute de kiloocteți sunt ușor.

Ei bine, știrile despre ultima, a patra verificare, de data aceasta sunt vesele: formatarea completă a unei astfel de unități flash nu a dus la distrugerea tuturor informațiilor! 4 de kiloocteți de date secrete se potrivesc perfect în spațiul neutilizat.

Tabel rezumat al testului:

Steganografia după fișiere: ascunderea datelor direct în sectoare

Puțină teoretizare: despre spațiul liber și sectoarele nefolosite

Dacă v-ați împărțit vreodată hard disk-ul în partiții, este posibil să fi observat că nu este întotdeauna posibil să alocați tot spațiul liber de pe disc. Prima secțiune începe întotdeauna cu o indentație (de obicei 1 megaoctet sau 2048 de sectoare). În spatele ultimei secțiuni, se întâmplă și să rămână o mică „coadă” de sectoare nefolosite. Și uneori există decalaje între secțiuni, deși rar.

Cu alte cuvinte, există sectoare de pe disc care nu pot fi accesate în timpul lucrului normal cu discul, dar datele pot fi scrise în aceste sectoare! Și asta înseamnă și să-l citești. Ajustat pentru faptul că există, de asemenea, un tabel de partiții și un cod de bootloader, care sunt situate în zona goală de la începutul discului.

Să luăm o pauză de la secțiuni și să ne uităm la disc din vedere de pasăre, ca să spunem așa. Aici avem o partiție goală pe disc. Să creăm un sistem de fișiere în el. Putem spune că unele sectoare de pe disc rămân neșterse?

E-e-e - ruliu de tobe! Răspunsul va fi aproape întotdeauna da! Într-adevăr, în majoritatea cazurilor, crearea unui sistem de fișiere se rezumă la scrierea doar a câtorva blocuri de informații de serviciu pe disc și, în caz contrar, conținutul partiției nu se modifică.

Și, de asemenea, - pur empiric - putem presupune că sistemul de fișiere nu poate ocupa întotdeauna tot spațiul alocat acestuia până la ultimul sector. De exemplu, un sistem de fișiere FAT16 cu o dimensiune de cluster de 64 de kiloocteți, evident, nu poate ocupa complet o partiție cu o dimensiune care nu este un multiplu de 64 de kiloocteți. La sfârșitul unei astfel de secțiuni va trebui să existe o „coadă” a mai multor sectoare, inaccesibile pentru stocarea datelor utilizatorului. Cu toate acestea, această presupunere nu a putut fi confirmată experimental.

Deci, pentru a maximiza spațiul disponibil pentru steganogramă, trebuie să utilizați un sistem de fișiere cu o dimensiune mai mare a clusterului. De asemenea, puteți crea o partiție, chiar dacă acest lucru nu este necesar (pe o unitate flash, de exemplu). Nu este nevoie să creați secțiuni goale sau să lăsați zone nealocate - acest lucru va atrage atenția cetățenilor interesați.

Utilitate pentru experimente

Puteți atinge codul sursă al utilitarului aici

Pentru a construi, veți avea nevoie de versiunea Qt 5.0 sau mai mare și OpenSSL. Dacă ceva nu funcționează, poate fi necesar să editați fișierul steganodisk.pro.

Puteți modifica dimensiunea clusterului de la 4 KB la, să zicem, 512 octeți (în secretfile.h). În același timp, costul informațiilor de serviciu va crește: antetul și suma de control ocupă fix 68 de octeți.

Trebuie să rulați utilitarul, desigur, cu drepturi de utilizator root și cu precauție. Nu vor fi puse întrebări înainte de a suprascrie fișierul sau dispozitivul specificat!

Bucurați-vă.

Sursa: www.habr.com

Adauga un comentariu