Steganografia nel file system

Ciao, Habr.

Vorrei presentarvi un piccolo progetto di steganografia, realizzato durante il mio tempo libero dallo studio.

Ho realizzato un progetto per la memorizzazione nascosta di informazioni nel filesystem (di seguito FS).
Può essere applicato per il furto di informazioni riservate a fini educativi.

Steganografia nel file system

Come prototipo è stato scelto un filesystem Linux piuttosto datato ext2.

Implementazione

Considerazioni sull'implementazione

Se si riesce a "frugare" nel standard ext2, si può sostituire ciò che nel FS esiste un cosiddetto Superblocco, che fornisce le informazioni di base sul sistema. Successivamente ho trovato Bitmap dei blocchi e Tabella degli inode. Quasi subito è sorta l'idea di registrare informazioni in blocchi al momento vuoti del FS. Ora bisognava pensare a una protezione contro un programmatore armato di editor esadecimale.

Se si memorizzano informazioni nascoste senza crittografia, anche se sfocate nel FS, risalteranno comunque troppo, specialmente se il programmatore saprà cosa cercare. Pertanto, è stata presa la decisione di crittografare tutti i blocchi del file originale. Ho scelto una cifratura a blocchi AES, ma come potete capire, non è fondamentale.

Per distinguere i blocchi necessari da tutti gli altri durante la lettura, è stato deciso di aggiungere un marcatore speciale all'inizio di ogni blocco. Questo marcatore veniva crittografato a seconda del numero del blocco nel file originale. Questo trucco ha subito permesso non solo di trovare i blocchi necessari, ma anche di riconoscerne il corretto ordine.

Principio generale di funzionamento del sistema.

Steganografia nel file system

Algoritmo di registrazione

Punti principali:

  • Prima registrare nel filesystem originale un'informazione qualsiasi;
  • Rimuovere questa informazione (non necessariamente tutta);
  • Suddividere il file da nascondere in blocchi di lunghezza uguale, aggiungendo un marcatore;
  • Crittografare questi blocchi;
  • Posizionare i blocchi crittografati in blocchi vuoti del FS.

Per gli amanti degli schemi a blocchi

Di seguito è presentato uno schema a blocchi dell'algoritmo di registrazione. L'algoritmo riceve in input quattro file:
-Immagine del filesystem modificabile;
-File da sottoporre a steganografia;
-File con la chiave di crittografia per AES;
-File con il marcatore.
Steganografia nel file system

Vale la pena notare che questo algoritmo ha un difetto: dopo aver registrato un file nel FS, possibile scrivere qualcosa di nuovo nel FS, poiché qualsiasi nuova informazione potrebbe finire nei blocchi che abbiamo dedicato al nostro file steganografato, ma questo apre anche la possibilità di "ripulire rapidamente le tracce".

Ma è abbastanza ovvio come questo possa essere corretto: è necessario riscrivere l'algoritmo per la registrazione dei blocchi nel FS. È un compito comprensibile, ma incredibilmente laborioso.
Per il Proof Of Concept non l'ho realizzato.

Di conseguenza, ci saranno le seguenti modifiche nel FS, così appare il FS prima della steganografia (è stato precedentemente registrato un file audio).
Steganografia nel file system
E così appare il FS con informazioni già steganografate.
Steganografia nel file system

Algoritmo di lettura

Punti principali:

  • Conoscendo la chiave e il metodo di costruzione dei marcatori, creare i primi N marcatori, garantendo che N, moltiplicato per la lunghezza del blocco del file system, sia maggiore della lunghezza del file steganografato;
  • Eseguire la ricerca dei blocchi nel FS che iniziano con i marcatori;
  • Decriptare i blocchi ottenuti e separare i marcatori;
  • Assemblare i blocchi ottenuti nell'ordine corretto e ottenere il file originale.

Per gli amanti degli schemi a blocchi

Di seguito è riportato il diagramma di flusso dell'algoritmo di registrazione. In ingresso, l'algoritmo riceve tre file:
-Immagine del file system;
-File con la chiave di crittografia per AES;
-File con il marcatore.
Steganografia nel file system

Dopo l'esecuzione del programma appare il file Read, che sarà il file estratto dal FS steganografato; se la chiave o il marcatore sono stati indicati in modo errato, il file Read sarà vuoto.
(per gli amanti delle belle cose è possibile inserire non solo un file, ma anche un "intestazione" contenente metainformazioni: nome del file, diritti, data dell'ultimo cambiamento, ecc.)

Automazione dell'avvio

Per comodità sono stati scritti script bash che automatizzano l'avvio su Linux (testato su Ubuntu 16.04.3 LTS).
Analizziamo l'avvio passo dopo passo.
Registrazione:

  1. sudo Copy_Flash.sh “DEVICE” — otteniamo l'immagine del FS da DEVICE (flash);
  2. .\/Write.sh “FILE” “KEY” “MARKER” – creiamo un ambiente virtuale, scarichiamo le librerie necessarie e avviamo lo script per la registrazione;
  3. sudo .\/Write_Flash.sh “DEVICE” – scriviamo il FS modificato nuovamente su DEVICE.

Lettura:

  1. sudo Copy_Flash.sh “DEVICE” — otteniamo l'immagine del FS da DEVICE (flash);
  2. .\/Read.sh “KEY” 'MARKER” — creiamo un ambiente virtuale, scarichiamo le librerie necessarie e avviamo lo script per la lettura;
  3. Nella directory corrente, apriamo il file Read – queste sono le informazioni steganografate.

Conclusione

Questo metodo di steganografia, probabilmente, necessita di affinamenti, ulteriori test e di un ampliamento alle file system più popolari, come Fat32, NTFS e ext4.
Ma l'obiettivo di questo lavoro era mostrare il principio secondo cui è possibile effettuare un'archiviazione nascosta delle informazioni nel file system.
Con algoritmi simili, è possibile memorizzare informazioni senza timore e, sebbene sia possibile violare un tale sistema conoscendo la chiave non con un attacco a forza bruta (ma con un algoritmo piuttosto lungo), senza conoscere la chiave questo sistema mi appare assolutamente resistente; d'altra parte, questo potrebbe servire da spunto per un articolo a parte.

Tutto il codice è realizzato in Python versione 3.5.2. Esempio di funzionamento presentato sul mio canale youtube. Il codice completo del progetto è stato pubblicato su github.
(Sì, so che per una versione di produzione è necessario scrivere in qualcosa di "veloce", ad esempio in C 😉 )
Nella presente implementazione, la dimensione del file di input per la steganografia non deve superare i 1000 kB.

Desidero ringraziare l'utente PavelMSTU per i preziosi consigli nella pianificazione della ricerca e le raccomandazioni per la stesura dell'articolo.

Fonte: habr.com

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