Linux, Cosa abbiamo in memoria?

Spesso sentiamo parlare di “analisi forense”, una scienza che mira ad analizzare un drive (ad esempio, un hard disk) con lo scopo di ricavarne informazioni non ottenibili nella maniera tradizionale, navigando il file system.

In questo articolo vorrei dare un’idea di quello che anche un comune utente senza le capacità di un vero analista forense può fare, con dei semplici comandi bash.

Gli strumenti fondamentali per farlo sono tra i più semplici e, insieme, potenti del Pinguino (anche se, spesso, sono anche i meno conosciuti):

  • dd: permette di copiare i byte di una sorgente in una destinazione, in blocchi di qualsivoglia dimensione;
  • hexdump: permette di convertire in formato binario, esadecimale o ASCII uno stream di dati;
  • grep: permette di cercare una espressione regolare;
  • strings: permette di estrarre stringhe di testo da uno stream

Prima di poter partire, dobbiamo ancora fare una piccola premessa; quando installiamo il sistema operativo, tipicamente ci viene chiesto in che partizioni vogliamo suddividere il nostro hard disk. Quando lo facciamo possiamo notare una struttura simile a questa:
/dev/sda
/dev/sda1 /
/dev/sda2 /home
/dev/sda3 /boot
Cosa significa? Molto semplicemente, il device principale che rappresenta il nostro hard disk viene rappresentato come se fosse un file salvato in /dev/sda, mentre le partizioni che generiamo vengono rappresentate come se fossero dei file salvati in /dev/sda1, /dev/sda2 ecc…
Allo stesso modo, anche gli altri componenti del nostro PC vengono rappresentati come dei file; ad esempio, la RAM viene rappresentata dal device /dev/mem.
Nel seguito, si suppone che i comandi vengano digitati dall’utente root.
Torniamo quindi all’argomento principale dell’articolo: come facciamo ad esaminare il nostro hard disk? Ora sappiamo che esso è rappresentato dal device /dev/sda, e che il comando dd può essere utilizzato per estrarre i dati da un device. Facciamo 2 + 2 e proviamo a dare questo comando:
dd if=/dev/sda bs=1k count=1
Una serie di caratteri illeggibili ci comparirà sullo schermo; per essere precisi: un blocco (count=1) di un kilobyte (bs=1k) corrispondente al primo kilobyte di dati memorizzati sul nostro hard disk, in formato binario (ma guarda, corrisponde all’MBR, e spunta fuori un GRUB… 😀 ). Come facciamo ora ad esaminare questi dati?
La prima cosa che possiamo fare e’ provare a convertirli con hexdump:
dd if=/dev/sda bs=1k count=1 | hexdump -C
Ora dovremmo ottenere qualcosa di più comprensibile: quello che vediamo è esattamente quello che avevamo prima, ma hexdump ci consente di convertire i byte in caratteri ASCII con l’opzione -C.
Veniamo ora alla ricerca delle informazioni “nascoste”:
dd if=/dev/sda bs=1k | strings | grep ‘quello che sto cercando’
Notiamo che questa volta non abbiamo limitato il count di dd ad 1, perciò stiamo di fatto leggendo tutto il nostro hard disk. Utilizzando strings estraiamo dal mare di dati puramente binari le stringhe di testo ed infine, con grep, estraiamo da esse quelle contenenti il testo ‘quello che sto cercando’. Se questa stringa è presente nell’hard disk, grep ce la mostrerà. Se, ad esempio, abbiamo cancellato un file contenente quella stringa, molto probabilmente la vedremo “rispuntare” fuori: questo perché la cancellazione di un file dal filesystem non elimina i dati relativi dall’hard disk: essi verranno semplicemente sovrascritti, prima o poi. Ma fino ad allora, saranno ancora lì alla mercé dei più curiosi.
Questo è solo un assaggio di quello che si può fare con questi semplici comandi: provate a cercare in giro per il web e scoprirete migliaia di “trucchetti” interessanti!
Attenzione però: dd è un comando molto pericoloso. Noi lo abbiamo utilizzato solo per leggere dati, ma può essere usato equivalentemente per scrivere. In ogni caso, non ci verrà mai chiesto di dare conferma: dd è un mostro mansueto che fa ESATTAMENTE quello che gli diciamo. Perciò, se cambiate l’ordine degli addendi, il risultato cambia eccome: potreste zappare via tutti i dati dal vostro hard disk!

Quindi pensateci bene prima di premere invio.

  • Chiffef

    articolo interessantissimo
    in teoria posso farmi un semplice script e con un click mi da i dati del mio hd

    ps con dd si possono recuperare file cancellati erroneamente su una sd fat32 (quella del telefonino per intenderci)

    • Si, tecnicamente si, purchè quei dati cancellati non siano stati totalmente sovrascritti.

  • Sarebbe possibile quindi recuperare tutte le immagini o file di con una precisa estensione? Dopo aver dato il comando dd if=/dev/sda bs=1k | strings | grep ‘quello che sto cercando’ cosa bisogna fare per recuperarli e metterli in una precisa cartella? Non sono esperto però mi interessa molto questa possibilità. Grazie

    • Cristiano

      Tutto e’ possibile, ma non e’ cosi’ semplice 🙂

      Per recuperare un file hai bisogno sostanzialmente di sapere dove inizia e dove finisce, dopodiche’ salvarlo e’ semplice: ti basta redirigere l’output su file con >.

      Per capire dove inizia, potresti provare a cercare con grep l’header del file; ad esempio, le immagini le immagini JPEG possono iniziare con l’header ‘ff db ff e0′. Per capire dove finiscono dovresti sapere esattamente la dimensione…

      In questo caso ti consiglierei di usare dei software specifici pero’, a “mano” diventa decisamente complesso!

      • Si in effetti sembra fin troppo macchinoso per farlo con tanti file. Con uno solo in particolare sembra più fattibile. Grazie per l’interessamento!

    • Millalino

       chiedo scusa, la risposta che avevo scritto li sopra era una possibile soluzione alla tua domanda in quanto, da Gdiskdump si puo scegliere di salvare anche in un file tramite l’interfaccia grafica. Ovviamente ciò non vuole togliere il valore al post di Cristiano (visto che i comandi da terminale sono importantissimi) che è veramente interessante, complimenti.

  • Millalino

    puoi provare ad usare l’interfaccia grafica per dd, cioè  Gdiskdump, recensita tra l’altro proprio da lffl.

  • giocitta

    Grazie a Cristiano per questa proposta di “guardare dentro” il nostro sistema operativo e il modo come utilizza l’hardware, ben comprensibile e di grande chiarezza. Chiarezza che nasce anche dall’uso perfetto della nostra amata lingua italiana… Spero vi sia un seguito.

  • Articolo molto interessante.

    Complimenti. CI sarebbero diverse domande da fare. Complimenti Cristiano.

  • Pagliaccio

    a questo punto continua con un altro (oppure altri) articoli su 
    1) recupero dati, come recuperare file cancellati
    2) distruzione dati, distruggere un file in modo sicuro, impostare di default la distruzione file nel SO

    •  La distruzione dei dati, ahimè, è sempre la cosa più semplice da ottenere: basta sovrascrivere, sovrascrivere, sovrascrivere,…. Chiedi al sig. Gutmann.

      @ferramroberto:disqus , @98e7c869d4b63355eaddf765c7991c95:disqus
      Se vi interessa riprendere l’argomento qui su LFFL, io ho fatto qualche ricerca in merito un po’ di tempo fa tirandone fuori alcuni post.

  • luchino

    Aggiungo un utile trucchetto…
    per fare il backup del nostro MBR:
    dd if=/dev/sda of=/sda.mbr bs=512 count=1
    per ripristinarlo:
    dd if=sda.mbr of=/dev/sda

  • magnet magneto

    Io per recuperare dati da dischi andati oltre a dd_rescue ( la versione piu ramificata di dd) ho utilizzato foremost. Sempre da riga di comando ti raggruppa tutto in cartelle con all’interno i files per tipologia: jpg doc pdf avi etc.

  • Cristiano

    Grazie a tutti per i commenti, mi fanno molto piacere!

    Visto l’interesse cerchero’ di approfondire un po’ l’argomento in futuro. Non ho molta esperienza a riguardo, quindi non so dire se sia possibile ottenere risultati interessanti in maniera semplice. Se qualcuno con piu’ esperienza vuole dare dei suggerimenti, sono ben accetti!

  • N-Di64

    per cancellare i file in modo sicuro ce shred caricato di default in Debian

    prima di usarlo consiglio di leggere il man o almeno –help

    >> da non usare su SSD o memory-flash <<

  • dd è un vero coltellino svizzero. Sarebbe interessante vedere in azione dd, o programmi simili per vedere il contenuto della RAM (ad esempio la password di LUKS), e come fare a proteggersi da simili attacchi, anche se TEORICAMENTE con un luksClose si dovrebbe eliminare la chiave dalla RAM.

    • Cristiano

      Con il metodo descritto nell’articolo puoi fare con la RAM esattamente le stesse cose, basta utilizzare /dev/mem!

      La protezione e’ garantita dal fatto che solo l’utente root ha accesso a questi device… ragion per cui bisognerebbe fare attenzione, anche su linux, ai programmi che si lanciano con sudo…

No more articles