Steganografia nel filesystem

Ciao, Habr.

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

Ho creato un progetto per il nascondere informazioni all'interno del file system (di seguito FS).
). Questo può essere applicato per il furto di informazioni riservate a scopi educativi.

Steganografia nel filesystem

Come campione ho scelto un file system Linux piuttosto datato ext2.

Implementazione

Considerazioni sulla realizzazione

Se si analizza a fondo il file system ext2, si può affermare che esso contiene quelli che vengono chiamati Superblock, dove sono fornite le informazioni principali sul sistema. Ho trovato Bitmap dei blocchi e Tabella degli inode. All'improvviso è nata l'idea di registrare informazioni nei blocchi attualmente vuoti del file system. Ora bisognava pensare a una protezione contro un programmatore armato di editor esadecimale.

Se si memorizzano informazioni nascoste senza crittografia, anche se sfumate nel file system, risulteranno comunque troppo evidenti, soprattutto se il programmatore sa cosa cercare. Pertanto, è stata presa la decisione di crittografare tutti i blocchi del file originale. Ho scelto la crittografia a blocchi AES, ma come potete capire, questo non è fondamentale.

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

Il principio generale di funzionamento del sistema.

Steganografia nel filesystem

Algoritmo di scrittura

In sintesi:

  • Prima di tutto, scrivere qualche informazione nel file system originale;
  • Eliminare queste informazioni (non necessariamente tutte);
  • Dividere il file da nascondere in blocchi di lunghezza uniforme, aggiungendo un marker;
  • Crittografare questi blocchi;
  • Posizionare i blocchi crittografati in blocchi vuoti del FS.

Per gli amanti dei diagrammi di flusso

Di seguito è presentato un diagramma di flusso dell'algoritmo di scrittura. In ingresso, l'algoritmo riceve quattro file:
-Immagine del file system modificabile;
-File soggetto a steganografia;
-File con chiave di crittografia per AES;
-File con il marker.
Steganografia nel filesystem

È importante notare che questo algoritmo ha un difetto: dopo la scrittura del file nel FS, non può registrare qualcosa di nuovo nel file system, poiché qualsiasi nuova informazione potrebbe andare nei blocchi che abbiamo dedicato al nostro file steganografico; in effetti, questo apre la possibilità di "ripulire rapidamente le tracce".

Ma è abbastanza ovvio come si possa risolvere: è necessario riscrivere l'algoritmo di registrazione dei blocchi nel file system. È un compito comprensibile, ma incredibilmente laborioso.
Per il Proof Of Concept non l'ho implementato.

Di conseguenza, si otterranno le seguenti modifiche nel file system; così appare il file system prima della steganografia (un file audio è stato registrato in precedenza).
Steganografia nel filesystem
E così appare il file system con le informazioni già steganografate.
Steganografia nel filesystem

Algoritmo di lettura

In sintesi:

  • Con la conoscenza della chiave e del modo di costruire i marcatori, comporre 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 file system che iniziano con i marcatori;
  • Decifrare i blocchi ottenuti e separare i marcatori;
  • Ricomporre i blocchi ottenuti nell'ordine corretto per ottenere il file originale.

Per gli amanti dei diagrammi di flusso

Di seguito è riportato un diagramma di flusso dell'algoritmo di registrazione. L'algoritmo riceve in input tre file:
-Immagine del file system;
-File con chiave di crittografia per AES;
-File con il marker.
Steganografia nel filesystem

Dopo l'esecuzione del programma, appare il file Read, che sarà il file estratto dal file system steganografico; se la chiave o il marcatore sono stati specificati in modo errato, il file Read sarà vuoto.
(per gli amanti delle belle presentazioni, è possibile includere non solo il file, ma anche un'intestazione contenente metainformazioni: nome del file, diritti, data dell'ultima modifica, 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.
Scrittura:

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

Lettura:

  1. sudo Copy_Flash.sh “DEVICE” — otteniamo l'immagine del file system da DEVICE (flash);
  2. ./Read.sh “KEY” ‘MARKER” — creiamo un ambiente virtuale, scarichiamo le librerie necessarie e avviamo lo script di lettura;
  3. Nella cartella corrente apriamo il file Read – questa è l'informazione steganografica.

Conclusione

Questo metodo di steganografia necessita probabilmente di perfezionamenti, ulteriori test e di essere esteso a file system più popolari come Fat32, NTFS e ext4.
Ma l'obiettivo di questo lavoro era mostrare il principio con cui è possibile effettuare una memorizzazione nascosta delle informazioni nel file system.
Con algoritmi di questo tipo è possibile memorizzare le informazioni senza timore, e sebbene possa essere possibile violare un tale sistema conoscendo la chiave (ma con un algoritmo piuttosto lungo), senza conoscere la chiave questa soluzione mi sembra assolutamente robusta, tuttavia potrebbe essere un motivo per un articolo separato.

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

Vorrei esprimere la mia gratitudine all'utente PavelMSTU per i preziosi suggerimenti 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