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.