=== Live Keyword Search === Come cercare delle keyword su un disco di un PC usando Linux (una live forense) sul PC stesso. Utile per cercare fra tanti PC quali sono "interessanti" e quali no, senza pagare le licenze per Encase, in parallelo, su tutti i PC assieme (usando i PC stessi come piattaforma, si spera) Una volta trovato qualcosa, poi, magari si fara` un giro con encase e una normale acquisizione. ==== Cosa voglio fare? ==== Voglio cercare delle keyword (da un file, eventualmente usando anche delle regexp) su tutto il contenuto del disco. Voglio vedere se queste keyword compaiono, vedere un pezzo di quello che gli sta intorno, ed eventualmente approfondire per capire in quale file si trovano. Voglio cercare anche nello spazio non allocato e nei files cancellati e nello slack. Tutto questo e` molto semplice se cerco in /dev/sda, visto che tanto dal punto di vista del device del disco, sono tutti dati senza alcuna differenza, perche` non mi interesso (per ora) del filesystem. ==== Come cercare le stringhe ==== Ho usato Helix2008r1 come live CD, ma penso che molti altri vadano bene, basta che non alterino mai il contenuto del disco (no automount!). * Prima di tutto, bootato Helix, mi loggo come root. * A questo punto creo un file con le mie keyword, una per riga, e lo chiamo keywords.txt (fantasia!) {{{ pistola assassino stupro abigeato bomba atomica }}} * Ora, voglio lanciare una ricerca in /dev/sda (supponendo che sia il mio disco) per quelle keyword, con un output a video che sia facilmente leggibile, e contenga l'informazione sulla posizione del risultato all'interno del file (ovvero del device). Voglio anche loggare sia i comandi che do`, sia l'output, in modo da poterlo rivedere dopo. Il primo comando avvia la registrazione della sessione nel file ricerca.script.txt evitando di sovrascriverlo se esiste. Il secondo cerca in /dev/sda le keyword che ci sono in keywords.txt, ignorando maiuscole e minuscole. Le opzioni di egrep sono tante, RTFM. "Exit" alla fine serve a terminare l'esecuzione di "script" e chiudere il file dei risultati "ricerca.stript.txt" {{{ script -a -f ricerca.script.txt cat /dev/sda | strings -td | egrep -3 --color -i -f keywords.txt exit }}} Il risultato, visibile a video, contiene in prima colonna la posizione nel file (nel device) della stringa, e a seguire la stringa. Siccome ho usato "-3" in grep, vedo anche le 3 righe precedenti e le 3 successiva a quella che contiene la stringa di ricerca. La stringa di ricerca e` evidenziata in rosso. * A questo punto, posso rivedermi il file ricerca.script.txt. Notare che ci sono i codici per i colori dentro, quindi non e` leggibilissimo... ma strings e cat | less aiutano. ==== Come identificare in quale file si trovano ==== Ponendo che io abbia trovato un risultato interessante, ora vorrei capire in quale file si trova. Prima di tutto devo sapere che file system e` usato nel disco sul quale ho appena fatto la ricerca. Questo esercizio lo lascio allo studente. Ora, supponiamo che il nostro file system sia NTFS, e che stiamo cercando nella prima partizione del nostro disco. * Prima di tutto, se prima ho usato /dev/sda per la ricerca (e non /dev/sda1) allora devo controllare quanti settori devo saltare per ricadere nella prima partizione... per farlo, uso sfdisk: {{{ sfdisk -d /dev/sda# partition table of /dev/sda unit: sectors /dev/sda1 : start= 63, size= 32067, Id=de /dev/sda2 : start= 32136, size= 610464, Id= 7, bootable /dev/sda3 : start= 642600, size=203061600, Id= 7 /dev/sda4 : start=203704200, size=421433145, Id= 5 /dev/sda5 : start=203704326, size=403327764, Id=83 /dev/sda6 : start=607032153, size= 18105192, Id=82 }}} In questo esempio sda1 inizia a 63 settori dall'inizio del disco. I settori DI SOLITO da 512 bytes, ma non e` detto, i dischi moderni hanno settori piu` grandi. Per scoprirlo, {{{hdparm -I}}} aiuta. Se prima ho fatto le ricerche dentro a una partizione e non al disco intero, allora non devo fare nulla. * Ora, vediamo a quale inode corrisponde un determinato risultato. Poniamo che nell'output della ricerca di prima una keyword cada nella posizione 85558783 (ricordate i numeri all'inizio di ogni riga? E` la posizione!). Se vogliamo sapere a quale inode corrisponde, usiamo questo comando: {{{ ifind -o 63@512 -d $((85558783/512)) /dev/sda 12619-128-4 }}} Questo comando salta i primi 63 settori da 512 bytes l'uno, dopodiche` va a caccia di quale inode si trova posizionato nella posizione indicata (notare che anche in questo caso divido per 512 il numero, per cercare il settore partendo dalla posizione assoluta). * Il risultato che ottengo (12619-128-4) va dato in pasto ad un altro programma, che mi dice vita morte e miracoli del file. {{{ istat -o 63@512 /dev/sda 12619-128-4 | less }}} Anche qui uso "-o" perche` devo dare lo stesso offset di prima. ==== E adesso? ==== Adesso se il disco "puzza", vai di dd, dcfldd, o di Encase...