Steganografia oltre i file: nascondere i dati direttamente nei settori

Una breve introduzione

La steganografia, se qualcuno non lo ricorda, è il nascondere informazioni all'interno di contenitori. Ad esempio, nelle immagini (ne abbiamo discusso qui e qui). È anche possibile nascondere dati nelle tabelle di gestione del file system (ne abbiamo già parlato qui), e anche nei pacchetti di gestione del protocollo TCP. Purtroppo, tutti questi metodi hanno un difetto comune: per "inserire" in modo invisibile informazioni nel contenitore, servono algoritmi sofisticati che tengano conto delle peculiarità della struttura interna del contenitore. Inoltre, ci sono problemi di resistenza del contenitore alle manipolazioni: per esempio, se si modifica leggermente un'immagine, le informazioni nascoste possono andare perdute.

È possibile trovare un modo per fare a meno di algoritmi complessi e manipolazioni delicate con i dati, garantendo comunque il funzionamento del contenitore e un livello accettabile di protezione dei dati nascosti? Anticipando la risposta, dico di sì, è possibile! E suggerirò anche un'utilità.

Dettagli sul metodo

L'idea principale è semplice come un colpo in testa con un bastone: sul disco ci sono aree in cui il sistema operativo non scrive mai (o scrive solo in rari casi). Per evitare di cercare queste aree con algoritmi complicati, sfruttiamo la ridondanza: cioè, duplicheremo molte volte le nostre informazioni nascoste su tutti i settori del disco. Poi, direttamente sopra tutto questo splendore, possiamo creare le partizioni necessarie, formattare i file system, scrivere file e installare sistemi operativi: parte dei dati segreti rimarrà comunque e sarà possibile recuperarli, e la duplicazione multipla ci aiuterà a ricomporre l'intero a partire dai pezzi.

Il vantaggio di questo metodo è evidente: non dipendiamo né dal formato dei file, né dal tipo di file system utilizzato.

Anche gli svantaggi sono, penso, evidenti:

  • I dati segreti possono essere modificati solo con una riscrittura completa dell'intero disco, seguita dalla ricreazione del contenuto visibile per l'utente. In questo caso, non si può usare software che ricrei il disco da un'immagine: ricreerà anche i dati segreti precedenti.
  • Più grande è il volume dei dati segreti, maggiore è la probabilità di perdita di parte delle informazioni.
  • Il recupero dei dati dal disco può richiedere molto tempo. Da alcuni minuti a diversi giorni (i dischi moderni sono più grandi).

Passiamo ora ai dettagli.

È chiaro che se si spargono semplicemente i dati segreti su tutto il disco, essi saranno nascosti solo agli occhi inesperti. Se invece si usano strumenti come un editor di disco, i dati si presenteranno in tutta la loro evidenza. Pertanto, sarebbe opportuno cifrare i dati affinché non siano visibili. Li cifreremo in modo semplice, ma con gusto: seguendo l'algoritmo aes256-cbc. Chiederemo all'utente la chiave di cifratura, così potrà inventare una buona password.

La prossima questione è come distingueremo i dati 'corretti' da quelli danneggiati. Qui ci aiuterà un checksum, e non uno qualsiasi, ma il SHA1. E perché no? È abbastanza buono per git, quindi andrà bene anche per noi. Deciso: provvediamo a dotare ogni frammento di informazione salvato di un checksum, e se dopo la decifratura corrisponde, significa che la decifratura è riuscita.

Avremo anche bisogno del numero del frammento e della lunghezza totale dei dati segreti. Il numero del frammento è utile per tenere traccia di quali pezzi abbiamo già decifrato e quali no. La lunghezza totale ci servirà quando tratteremo l'ultimo frammento, per non scrivere dati superflui (ossia padding). E visto che abbiamo comunque intenzione di aggiungere un'intestazione, mettiamo lì il nome del file segreto. Questo sarà utile dopo la decifratura, per sapere con cosa aprirlo.

Mettiamo alla prova il metodo nella pratica

Per la verifica utilizzeremo il supporto più comune: una chiavetta USB. Ho trovato una vecchia chiavetta da 1 GB, che è perfetta per gli esperimenti. Se, come me, ti è venuta in mente l'idea di non preoccuparti dei supporti fisici e di testare un file - un'immagine del disco, ti dico subito: non funziona. Durante la formattazione di un simile 'disco', Linux ricrea il file da zero, e tutti i settori non utilizzati verranno riempiti di zeri.

Come macchina con Linux, purtroppo, ho dovuto usare una stazione meteorologica che giace sull balcone, un Raspberry Pi 3. La memoria lì non è molta, quindi non nasconderemo file grandi. Ci limiteremo alla dimensione massima di 10 megabyte. Anche file troppo piccoli non hanno senso da nascondere: l'utilità scrive i dati sul disco in cluster da 4 KB. Pertanto, da sotto limiteremo con un file di 3 KB: questo si adatta a un cluster.

Ci prenderemo gioco della chiavetta USB passo dopo passo, controllando dopo ogni fase se le informazioni nascoste siano leggibili:

  1. Formattazione rapida in FAT16 con dimensione del cluster di 16 kB. Questo è ciò che Windows 7 suggerisce di fare con una chiavetta USB priva di file system.
  2. Riempire la chiavetta USB con vari spazzatura al 50%.
  3. Riempire la chiavetta USB con vari spazzatura al 100%.
  4. Formattazione "lunga" in FAT16 (con riscrittura totale).

I primi due test si sono conclusi, come previsto, con una vittoria totale: l'utility è riuscita a estrarre con successo 10 megabyte di dati segreti dalla chiavetta. Tuttavia, dopo aver riempito la chiavetta con file fino all'orlo, si è verificato un errore:

Cluster totali letti: 250752, decriptati: 158
ERRORE: impossibile scrivere secretFile incompleto

Come possiamo vedere, siamo riusciti a decifrare solo 158 cluster (632 kilobyte di dati grezzi, equivalenti a 636424 byte di dati utili). È chiaro che non possiamo arrivare a 10 megabyte, e tra questi cluster ci sono chiaramente dei duplicati. Anche 1 megabyte, in questo modo, non potrà essere recuperato. Tuttavia, possiamo garantire che 3 kilobyte di dati segreti verranno recuperati dalla chiavetta anche dopo la formattazione e il riempimento. Tuttavia, gli esperimenti dimostrano che è possibile estrarre un file di 120 kilobyte da una chiavetta di questo tipo.

Sfortunatamente, l'ultimo test ha dimostrato che la chiavetta è stata completamente sovrascritta:

$ sudo .\/steganodisk -p password \/dev\/sda
Dimensione del dispositivo: 250752 cluster
250700 99%
Cluster totali letti: 250752, decrittografati: 0
ERRORE: impossibile scrivere secretFile incompleto

Nessun cluster è stato conservato... Triste, ma non tragico! Proveremo a creare una partizione sulla chiavetta prima di formattarla, e quindi implementeremo un file system al suo interno. A proposito, è stata inviata in questo formato di fabbrica, quindi non stiamo facendo nulla di sospetto.
È abbastanza prevedibile che lo spazio disponibile sulla chiavetta sia leggermente diminuito.

È anche abbastanza prevedibile che non siamo riusciti a nascondere 10 megabyte su un disco completamente pieno. Ma ora il numero di cluster decifrati con successo è aumentato di più di due volte!

Cluster totali letti: 250752, decifrati: 405

Purtroppo, non è possibile raccogliere un megabyte da frammenti, ma duecento kilobyte sono facili da recuperare.

E l'ultima novità, il 4° controllo, è questa volta gioiosa: la formattazione completa di una chiavetta di questo tipo non ha portato alla distruzione di tutte le informazioni! 120 kilobyte di dati segreti sono stati perfettamente collocati nello spazio inutilizzato.

Tabella riassuntiva dei test:

Steganografia oltre i file: nascondere i dati direttamente nei settori

Un po' di teorizzazione: sullo spazio libero e sui settori inutilizzati

Se hai mai suddiviso un disco rigido in partizioni, avrai notato che non sempre è possibile utilizzare tutto lo spazio libero sul disco. La prima partizione inizia sempre con un certo margine (di solito è di 1 megabyte, ovvero 2048 settori). Anche dietro l'ultima partizione, a volte, rimane un piccolo "resto" di settori non utilizzati. E tra le partizioni, a volte rimangono spazi vuoti, sebbene raramente.

In altre parole, ci sono settori sul disco ai quali non si ha accesso durante l'uso normale del disco, ma è possibile scrivere dati in questi settori! E quindi, è possibile leggerli anche. Con la precisazione che esiste anche una tabella delle partizioni e un codice di avvio, che si trovano proprio nell'area vuota all'inizio del disco.

Distacchiamoci per un momento dalle partizioni e osserviamo il disco da un punto di vista panoramico, per così dire. Supponiamo di avere una partizione vuota sul disco. Possiamo dire che alcuni settori del disco sono rimasti non sovrascritti?

E-e-e — rullo di tamburi! La risposta sarà praticamente sempre — sì! Infatti, nella maggior parte dei casi, la creazione di un filesystem consiste nel registrare sul disco solo alcuni blocchi di informazioni di servizio, mentre il contenuto della partizione rimane invariato.

Inoltre — puramente empiricamente — si può ipotizzare che un filesystem non occupi sempre tutto lo spazio a sua disposizione fino all'ultimo settore. Ad esempio, un filesystem FAT16 con una dimensione del cluster di 64 kilobyte non sarà evidentemente in grado di occupare completamente una partizione con una dimensione non multipla di 64 kilobyte. Alla fine di tale partizione dovrebbe rimanere un "resto" di alcuni settori, inaccessibili per la memorizzazione di dati utente. Tuttavia, questo presupposto non è stato confermato sperimentalmente.

Pertanto, per massimizzare lo spazio disponibile per la steganografia, è necessario utilizzare un filesystem con dimensioni del cluster più grandi. Si può anche creare una partizione, anche se non è necessario (sulla chiavetta USB, ad esempio). Non è necessario creare partizioni vuote o lasciare aree non allocate — questo attirerebbe l'attenzione di cittadini curiosi.

Strumento per esperimenti

È possibile esaminare i sorgenti dello strumento qui

Per la compilazione è necessaria la versione Qt 5.0 o superiore e OpenSSL. Se qualcosa non si compila, potrebbe essere necessario modificare il file steganodisk.pro.

È possibile cambiare la dimensione del cluster da 4 KB a, diciamo, 512 byte (in secretfile.h). Aumenteranno così le spese per le informazioni di intestazione: l'intestazione e il checksum occupano 68 byte fissi.

È necessario eseguire l'utilità, ovviamente, con i diritti dell'utente root, e fare attenzione. Non ci saranno domande prima di riscrivere il file o il dispositivo specificato!

Buon divertimento.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster