I comandi Linux: il filesystem ( 3 ) | ALTRI capitoli | |||
Il file carving Quando eliminiamo un file dal disco, eliminiamo solo le informazioni che il sistema operativo conserva su quel file ( i metadata ). Eliminando un file, quindi, rendiamo impossibile, per il sistema operativo, il recupero di quel file. Ma il file, con i dati che contiene, resta memorizzato nei cluster del disco, almeno fino a quando tutti i cluster, una volta riservati al file, non saranno rioccupati, dal sistema operativo, per ospitare i frammenti di altri file. Il file carving è il processo di identificazione dei frammenti ( cluster ) di un file, su un disco fisso, nel tentativo di ricostruire l'intero file, anche se precedentemente eliminato ( o perso ). Naturalmente, prima si interviene con il processo di file carving, più possibilità si hanno di ricostruire l'intero file. Se uno o più cluster, una volta riservati al file che cerchiamo di ricostruire, fossero già stati riscritti una o più volte, il lavoro di recupero dei vecchi dati sarebbe compromesso, a volte in modo definitivo. La sovrascittura dei cluster riservati ad uno specifico file è il compito riservato al comando Linux
chiamata SOI ( Start of Image ), seguita da una serie di marcatori, usati per conservare le informazioni sul file, delimitati dalla sequenza:
dove XX rappresenta il tipo di marcatore. Immediatamente dopo il tipo di marcatore, troviamo due byte che indicano le dimensioni del marcatore, seguiti dai dati contenuti dal mercatore. La fine della sequenza dei marcatori viene segnalata dalla sequenza di byte:
che indica l'inizio dell'immagine stessa: Start of Stream ( SOS ). I due byte successivi esprimono le dimensioni dello stream di dati e sono seguiti dallo stream di dati stesso. Il footer di una immagine JPEG è espresso dalla sequenza:
Le sequenze iniziale e finale:
sono i cosiddetti numeri magici ( magic number ), numeri nascosti, posti all'inizio ed alla fine ( o nelle vicinanze ) di un file, che indicano il tipo di file. Per leggere il magic number di un file, è sufficiente utilizzare il comando
oppure direttamente in caratteri ASCII ( o in notazione ottale, quando incontra caratteri non stampabili ):
Per vedere una tabella di numeri magici ( magic number ), associati ai relativi tipi di file, andate alla pagina di Gary C. Kessler. Nell'attività di file carving, gli header ed i footer sono utili solo nei casi di file non frammentati ( memorizzati in cluster contigui del disco ). I sistemi operativi moderni tendono a non utilizzare la frammentazione, ad eccezione di tre casi particolari in cui la frammentazione risulta essere la sola soluzione a portata di mano:
Come è facile dedurre, i file maggiormente soggetti alla frammentazione sono i file creati ed usati dagli utenti e per gli utenti ( come i file LOG, oppure i file TMP ), che richiedono, spesso, aggiornamenti continui. Quindi, la frammentazione è sempre presente, in misura minore o maggiore. Come si può procedere, in caso di presenza di frammentazione dei file? Il processo di file carving dovrà tentare di ricostruire il file andando ad analizzare la struttura interna del tipo di file da ricostruire: "per esempio, i file JPEG contengono metadata, tabelle colore e immagine vera e propria. I file ZIP contengono una directory e diversi file compressi. I file Microsoft Word contengono una Master Sector Allocation Table ( MSAT ), una Sector Allocation Table ( SAT ), una Short Sector Allocation Table ( SSAT ), una directory ed uno o più stream di dati" ( Carving contiguous and fragmented files, di Simson L. Garfinkel, 2007 ). La validazione degli header e dei footer ignora completamente il contenuto del file. Quindi, è possibile distinguere due differenti strategie, da adottare nel processo di file carving:
Una volta estratti i frammenti di un file, inoltre, un corretto processo di file carving dovrà prevedere una fase di validazione dei dati, per assicurarsi che l'insieme dei frammenti estratti possano appartenere ad uno stesso file. Sempre seguendo Simson L. Garfinkel, nel suo Carving contiguous and fragmented files, è possibile comprendere in cosa consista questa fase di validazione: "per esempio, l'ultima sezione di un file JPEG consiste in una rappresentazione dell'immagine conforme all'algoritmo di David Huffman. Quindi, se questa sezione non potrà essere decompressa, l'immagine non potrà essere decodificata: di conseguenza, l'insieme dei frammenti recuperati potrà essere considerato non valido ... Anche le sezioni testuali di un file di Microsoft Office possono essere utilizzate per la validazione: se contengono caratteri non validi, la validazione fallisce ... La validazione semantica è un altro potente strumento di validazione: se le lettere " hospi " appaiono come ultimi cinque caratteri di un settore del disco e le lettere " tals " appaiono come primi caratteri del settore successivo, sarà ragionevole dedurre che la parola " hospitals " sia stata frammentata in due settori contigui. I due settori verranno considerati consecutivi, presumibilmente, nel file risultante dall'attività di file carving, anche nel caso in cui fossero stati separati, sul disco fisso, da 16 settori ( cluster ) contenenti una poesia in lingua francese. E' ragionevole dedurre, infatti, che la poesia in lingua francese appartenesse ad un file differente ". Esistono diversi programmi che eseguono il file carving. I più noti ed efficaci sono: Il comando
Dalla home page del comando
dove
Se si desidera che
Per utilizzare un differente file
per poi chiedere a
E' possibile specificare una directory, in modo che
Il comando
Il comando
per poi tentare di recuperare il file, o i file, mancante, direttamente dal file immagine.
dove:
specifica il tipo di file da cercare, mentre:
specifica dove cercarlo e:
specifica in quale directory salvare i file ricostruiti ( directory di destinazione ). Ricordate che la partizione da analizzare non potrà mai essere indicata come directory di destinazione, in cui salvare i file ricostruiti:
In questo esempio, stiamo cercando, all'interno della partizione
Per cercare, all'interno della partizione
Naturalmente, è possibile specificare più tipi di file:
Naturalmente, per poter indagare la partizione
in cui vengono riportate tutte le occorrenze riscontrate:
ed una sottodirectory, per ciascun tipo di file, all'interno della quale salva i file recuperati. Per limitare l'azione di
Per spingere
In questo modo, verrà creata una nuova directory di destinazione, per ciascuna invocazione di
L'opzione
In modalità " quick mode ",
che attiva il riconoscimento dei cosiddetti " indirect block ", che, nei sistemi Unix ed Unix-like, contengono i metadata relativi ai file.
Seleziona un file di configurazione diverso da quello di default,
vengono specificati i formati di file da cercare, per tutti i file per i quali
Header, sensibilità alle maiuscole, dimensioni ed estensione sono obbligatori, mentre il footer è facoltativo. E' possibile specificare i valori, usando la notazione esadecimale:
oppure ottale:
E' possibile rappresentare lo spazio con la sequenza:
Per esempio, la sequenza:
viene decodificata come:
E' possibile utilizzare il carattere wildcard (
Attenzione: dovendo cercare il carattere
e tutte le occorrenze del carattere wildcard presenti nel file di configurazione. Quando cancelliamo un file, in realtà, non lo cancelliamo. Semplicemente, lo rimuoviamo dalla tabella dei file del sistema operativo. I dati contenuti nel file restano memorizzati nel disco fisso, almeno fino a quando lo spazio occupato da essi non venga assegnato ai dati di un nuovo e differente file. Quindi, un file cancellato potrebbe essere recuperato senza grande sforzo, utilizzando programmi e comandi speciali, se si intervenisse prima che i blocchi di spazio a lui riservati venissero riutilizzati. Anche nel caso di un riutilizzo dei blocchi di spazio per un altro file, è possibile che restino delle tracce che rivelino i vecchi dati. Con apparecchiature molto sofisticate, e molto costose, quindi, sarebbe possibile recuperare i vecchi dati anche quando lo spazio occupato su disco fosse stato già riassegnato ad altro file. E' solo dopo un certo numero di riutilizzi dello stesso spazio su disco che è possibile immaginare che i vecchi dati non siano più recuperabili. Per perdere le tracce dei vecchi dati, è necessario sovrascrivere un blocco di disco più e più volte. Questo è esattamente il compito del comando
Attenzione:
La rimozione avverrà solo dopo la sovrascrittura del file. Il comando
sulle quali, ovviamente, non può essere esercitata l'opzione di rimozione. Se si desidera modificare il numero di passaggi da effettuare su un file, usare l'opzione
Più passaggi verranno effettuati, più sarà completa la distruzione dei dati contenuti nel file. Per verificare quanti passaggi vengono effettuati, attivare la modalità " verbose ":
Per forzare la sovrascrittura del file, anche modificandone i permessi di accesso:
Per forzare l'ultima sovrascrittura con una sequenza di zero, in modo da nascondere l'attività di
Per eseguire
L'efficacia del comando
dove la prima modalità è quella di default. Il comando
Se non altrimenti specificato,
elenca tutti i file contenuti nella cartella corrente e nelle sottodirectory in essa contenute. Se desiderate limitare la ricerca ad un numero massimo di sottodirectory, usate l'opzione
In questo esempio,
In questo esempio, stiamo cercando tutti i file
In questa espressione, stiamo cercando i file
Il comando
Per evitare di riempire lo schermo di messaggi di errore, reindirizzate i messaggi di errore nel cestino:
dove:
E' possibile specificare più directory in cui cercare:
In questo esempio,
Se volete che
L'azione ( cosa fare ) di default del comando
dove
corrispondente al comando:
che stampa: il numero di inode del file, le dimensioni del file in blocchi ( un blocco è di 512 byte, oppure 1 Kb, a seconda che sia impostata o meno la variabile d'ambiente POSIXLY_CORRECT ), il tipo di file ed i permessi di accesso associati al file, il numero di hard link che puntano al file, l'utente proprietario del file, il gruppo principale dell'utente proprietario del file, le dimensioni del file, in byte, la data dell'ultima modifica ed il nome del file.
E' possibile reindirizzare l'output di
Il file di destinazione verrà sempre creato, anche se il comando
dove i metacaratteri
indica un carattere che sia o una "p", oppure una "f", oppure una "g". La ricerca eseguita da
Se si ha bisogno di utilizzare un set completo di espressioni regolari, usare le opzioni:
dove la prima effettua una ricerca "case sensitive" ( sensibile alle lettere maiuscole e minuscole ), mentre la seconda effettua una ricerca "case insensitive". Attenzione: i riscontri avvengono sull'intero percorso del file. Quindi, per cercare un file con nome
è possibile utilizzare una delle seguenti espressioni regolari:
ma non una espressione regolare come la seguente:
dove abbiamo dimenticato di rappresentare i caratteri che identificano il percorso:
Le espressioni regolari normalmente utilizzate da
Oltre al nome, è possibile specificare anche il tipo di file da cercare:
dove:
oppure le sue dimensioni, sia espresse in byte:
sia espresse in blocchi da 512 byte:
arrotondati all'intero superiore. E' possibile cercare un file per data di accesso al file ( atime ), di modifica del file ( mtime ) o di modifica delle informazioni di inode ( ctime ). Per data si intende il numero di ore precedenti:
Quindi, i comandi:
cercano i file il cui "access time", oppure "modification time", oppure "change time" sia uguale a 2 giorni, con zero che indica il giorno corrente. E' possibile utilizzare i modificatori:
per identificare i file la cui data ( di accesso o di modifica ) sia superiore o inferiore a quella data:
Nei primi tre esempi, stiamo cercando i file la cui data ( di accesso o di modifica ) sia inferiore ai due giorni ( quindi: i file che siano stati aperti o modificati negli ultimi due giorni ). Negli ultimi tre esempi, invece, stiamo cercando i file la cui data ( di accesso o di modifica ) sia superiore ai due giorni ( quindi: i file che non siano stati aperti o modificati negli ultimi due giorni ). Attenzione: non esistono valori frazionali. Quindi, l'espressione:
indica tutti i file il cui ultimo accesso risalga ad almeno due giorni prima. E' anche possibile chiedere, come unità di misura temporale, il minuto:
I file possono anche essere cercati per i permessi di accesso a loro associati. Sono quattro i test che è possibile effettuare per sapere cosa un utente possa fare con un file.
Le prime tre espressioni, ricercano i file della sola cartella corrente che siano leggibili, sovrascrivibili ed eseguibili dall'utente corrente, mentre la quarta espressione ricerca tutti i file in cui "other" ( resto del mondo ) abbia il permesso di scrittura ( write ). Le prime tre espressioni tengono conto anche degli artifici software che influenzano i permessi associati ai file, quali le Access Control List, artifici che i test
dove
sia in notazione ottale:
In questa forma,
troverà quei file che abbiano attivato il solo bit "write" per il gruppo, mentre:
troverà quei file che abbiano attivati i soli bit "read" e "write" per il proprietario del file e per il gruppo primario del proprietario, ed il solo bit "read" per il resto del mondo ( other ). Se
dovranno trovare riscontro i soli bit riportati da
troverà quei file che abbiano attivato il bit "write" per il gruppo ( senza verificare gli altri bit ), mentre:
troverà quei file che abbiano attivati i bit "read" e "write" per il proprietario del file e per il gruppo primario del proprietario, ed il bit "read" per il resto del mondo ( other ), senza verificare la situazione degli altri bit. Se
dovrà trovare riscontro almeno uno dei bit riportati da
troverà quei file che abbiano attivato il bit "write" o per il proprietario, oppure per il gruppo primario del proprietario, oppure per il resto del mondo. Mentre:
troverà quei file che abbiano attivato il bit "write" o per il proprietario, oppure per il gruppo primario del proprietario. Per quanto riguarda i simboli e gli operatori disponibili, vediamone il significato:
Se quello che cercate è una directory, è possibile specificare un percorso completo, piuttosto che il nome di un file:
Il parametro
In questo esempio, si chiede a
Per far sì che
Le opzioni
dove
e così via.
Per quanto riguarda l'azione
dove
Il comando
Il comando
Quando non viene specificato alcun argomento,
Nel primo esempio, il comando
Per poter vedere anche i file nascosti, usare l'opzione
oppure:
che restituisce tutti i file che iniziano con un punto (
che restituisce il totale dei blocchi ( normalmente, di 1024 byte ciascuno ) allocati dal sistema operativo per i file contenuti nella directory:
e, per ciascun file trovato:
dove:
Il terzo carattere, per ciascun gruppo di permessi, può assumere diversi valori:
che esprime il permesso di esecuzione;
che indica che sono attivi sia il suid bit ( nel caso del proprietario ) o lo sgid bit ( nel caso del gruppo ), sia il permesso di esecuzione;
che indica che è attivo il suid bit ( nel caso del proprietario ) o lo sgid bit ( nel caso del gruppo ), ma non il permesso di esecuzione;
che indica che sono attivi sia lo sticky bit, sia il permesso di esecuzione;
che indica che è attivo lo sticky bit, ma non il permesso di esecuzione. Se il tipo di file è una directory ( d ), al posto del numero degli hard link viene pubblicato il numero delle directory contenute nella directory. Questo numero comprende anche le directory:
che identificano la directory corrente e la directory superiore. Tornando al numero di blocchi allocati per la directory, esso è la somma dei blocchi allocati per ciascuno dei file elencati, verificabili con l'opzione
Se si desidera avere informazioni su un singolo file:
Se, di un file, si desidera visualizzare il numero di inode:
Se si desidera avere informazioni su una singola directory (
Se si desidera che le dimensioni del file siano espresse in un formato più leggibile:
Il comando
L'opzione
L'opzione
L'opzione
e disabilita le opzioni:
dove l'opzione
ordina i risultati per estensione dei file, con i file senza estensione prima.
ordina i risultati per dimensione dei file, con i file più grandi prima.
elenca i risultati in ordine temporale. La data presa in considerazione è la data dell'ultima modifica ( modification time o
elenca i risultati in ordine temporale. La data presa in considerazione e pubblicata è la data dell'ultima modifica dell'inode ( change time o
elenca i risultati in ordine alfabetico, ma stampa la data dell'ultima modifica dell'inode ( change time o
elenca i risultati in ordine temporale. La data presa in considerazione e pubblicata è la data dell'ultimo accesso al file ( access time o
elenca i risultati in ordine alfabetico, ma stampa la data dell'ultimo accesso al file ( access time o
elenca i risultati in ordine di versione, considerando il nome ed il numero di versione.
|
||||
I comandi Linux: il filesystem ( 3 ) | Le guide di .bit: contenuto originale |