Giovanni Bassetti Immagine
 Blog di Giovanni Bassetti... di Admin
 
"
Un computer sicuro è un computer spento e gettato in fondo al mare, con l'hard disk sbriciolato

N.B.
"
 

\\ Home Page : Articolo
WhatsApp forensics - recupero timestamp dei messaggi cancellati
Di Admin (del 05/12/2013 @ 14:35:16, in Computer Forensics, linkato 14514 volte)
Ieri durante una lezione, presso la scuola di GdF di Ostia, sull'uso del Cellebrite UFED e Physical Analyzer (thanks to Luca Governatori), insieme a tutta la classe (in gambissima), abbiamo fatto un po' di reverse engineering usando la visualizzazione esadecimale di Physical Analyzer del database della famosa app di messaggistica WhatsApp per Android, dato che il P.A. non visualizza i messaggi cancellati di WhatsApp, almeno su Android 4.1.2 del Samsung S3.

Il database è di tipo SqlLite 3.0 e si trova in:
\data\com.whatsapp\databases\msgstore.db  

Prima dell'acquisizione fisica tramite UFED Touch del mio Samsung S3 con Android  4.1.2, ho provveduto a cancellare due (il primo ed il terzo) messaggi di una conversazione dal mio WhatsApp, i due in figura:



Finita l'acquisizione ed ottenuto il file DumpData.bin, siamo andati ad aprire con il viewer esadecimale il file msgstoredb.db e a cercare le parole chiave dei messaggi cancellati, ottenendo una visualizzazione esadecimale come questa (in figura l'editor non è quello di P.A.):


Il messaggio si compone del numero del mittente, seguito da un numero, che rappresenta la data senza l'ora, del messaggio in Unix Epoch Time, ossia il numero di secondi passati dal 01/01/1970 alle 00:00:00, con una semplice conversione con programmi come DCode o http://www.epochconverter.com/, si ricava che il numero: 1385911713 è la data 01 Dec 2013 alle ore 15:28:33, quindi l'orario non è esatto.
Bisogna trovare  la data e l'ora (timestamp) esatta di questo messaggio, facendo un po' di prove e confrontando con i messaggi in chiaro, scopriamo che i primi sei (6) byte successivi alla fine del testo del messaggio, rappresentano il timestamp dello stesso con data ed ora corretti.
Infatti preleviamo i 6 byte successivi del primo messaggio:
01 42 AE FF E8 20 e 01 42 AF 1F BA 5F e li traduciamo in decimale con la calcolatrice e poi convertiamo il numero in Unix Milliseconds Time, infatti qui il timestamp è in millisecondi e non in secondi, poi impostiamo DCode in UTC+1 (siamo in Italia in ora solare quindi UTC+1).




Stessa procedura per l'altro messaggio:



Concludiamo avendo estratto due messaggi cancellati, abbiamo ricavato il mittente, il destinatario, il testo ed il timestamp.
è stato divertente ed illuminante, spero serva a qualcuno ;).

Nanni Bassetti
http://www.nannibassetti.com
Articolo Articolo  Storico Storico Stampa Stampa
 
# 1
Per recuperare i record SQLite cancellati senza andare a dover cercarli con editor esadecimali puoi provare il mio carver per SQLite automatico ( http://www.forensicfocus.com/Forums/viewtopic/t=11253/ ), basta che gli dai il CREATE STATEMENT preso da SQLite e lui ti dà subito una stampa su tabella. (si può usare anche sui dump fisici, immagini disco ecc). Ciao!
Di  Francesco  (inviato il 07/12/2013 @ 08:46:13)
# 2
Grazie Francesco, ma il tuo programma non mi funziona sul msgstore.db, dice che non riconosce il type Real
Di  Nanni Bassetti  (inviato il 07/12/2013 @ 15:40:12)
# 3
Scusa mi sono accorto ora di avere messo non so per quale motivo FLOAT al posto di REAL nel riconoscimento dello statement, prova a sostituire tutti i REAL con FLOAT, se non ci sono altri problemi dovrebbe andare. Ciao
Di  Francesco  (inviato il 07/12/2013 @ 17:16:32)
# 4
Fatto, sì va, ma dopo che mi augura un "nice day", c'è solo una finestra vuota...provato anche con compatibilità XP e anche lanciandolo come Amministratore.
Di  Nanni Bassetti  (inviato il 07/12/2013 @ 17:31:48)
# 5
Che strano, di sicuro non trova nessun record corrispondente. Potresti incollarmi il CREATE STATEMENT che hai usato così che vedo dove si inceppa? Ciao e grazie per il feedback.
Di  Francesco  (inviato il 07/12/2013 @ 18:51:09)
# 6
Ti ho caricato una versione modificata del programma dove ho levato la verifica della corrispondenza del tipo dei campi visto che dalla schermata che avevi accluso all'articolo ci sono campi BLOB con valori in realtà INTEGER, campi TEXT con valore numerico 0 (probabilmente un NULL di troppo) ecc. che non avevo incontrato prima e che quindi facevo scartare perchè potenziali record troncati o corrotti.

https://mega.co.nz/#!o1glUBbS!WmzqCDrYQbqpsLhrmNgc1zp5iiduJmtDxk0SwKGEr1I mi auguro che con questa versione andrà meglio.

Ciao e ancora grazie
Di  Francesco  (inviato il 07/12/2013 @ 19:51:03)
# 7
Ok visualizza i records, ma non i cancellati! Quindi non funziona per il recupero di quei messaggi... ;)
Di  Nanni Bassetti  (inviato il 08/12/2013 @ 09:00:13)
# 8
Sì hai ragione, l'ho provato sui dati che hai screenshottato nell'articolo e li salta.

Ho trovato cosa cambiare per farli leggere ma avendo levato pure la verifica dei tipi dei campi dato che il database di Whatsapp è un caso particolare, nel senso che i dati li dichiara di un tipo ma li fa salvare in un'altro facendoli convertire al volo da SQLite durante la lettura/scrittura (column affinity), probabilmente verrebbero un po' troppi record spazzatura. Se proprio non trovo altre alternative potrei risolvere mettendo una banale validazione sul mittente/destinatario che presuppongo sia sempre di formato simile ma per ora vorrei evitarlo. Ci devo pensare un po' su e più che altro trovare il tempo per installare ed estrarre il database di Whatsapp in modo da averne uno di prova. A tra qualche giorno, ciao e grazie!
Di  Francesco  (inviato il 08/12/2013 @ 14:09:24)
# 9
Magari mi dici anche come ti chiami ;)?
Di  Nanni Bassetti  (inviato il 08/12/2013 @ 15:49:38)
# 10
Questo funziona, ma non calcola i timestamps ;)
http://az4n6.blogspot.pt/2013/11/python-parser-to-recover-deleted-sqlite.html
Di  Nanni Bassetti  (inviato il 08/12/2013 @ 16:08:42)
# 11
Sfortunatamente mi sono ritrovato questa settimana e la prossima bloccate altrimenti sistemavo subito.

Identificare ed estrarre i record di SQLite non è complicato perché ogni record è formato da 3 valori (lunghezza header seriale+dati, ID, lunghezza header seriale) + una sequenza (header seriale) di tanti valori quanti i campi del record che indicano sia tipo che dimensione dei dati di ogni campo, il tutto seguito dai dati dei campi. Tutto attaccato, niente padding, separatori, ecc.

Tutti i valori che precedono i dati sono salvati in VARINT quindi si sa sempre quando ognuno di tali valori termina (quando il MSB è 0). Sui record eliminati i primi byte vengono sovrascritti, non con dati a caso, ma è una questione lunga da spiegare, basta sapere che la quasi totalità delle volte a parte i primi tre valori (lunghezza header seriale+dati, ID, lunghezza header seriale) viene fatto fuori solo il valore del primo campo (che fortunatamente se c'è una PRIMARY KEY è nullo ovvero di dimensione 0 perché essendo primary key non viene salvato ma rimanda all'ID iniziale).

Su whatsapp ci sono 26 campi, per trovarli cancellati o meno basta trattare il file come una sequenza di VARINT e trovarne 25 avente tipo e/o dimensioni compatibili (25 perchè il primo va ignorato visto che potrebbe essere sovrascritto), i dati saranno presenti subito dopo. Fatta una funzione che legge VARINT (levando i MSB e concatenarli in un long) basta leggerli in sequenza e trovare le catene da 25 corrispondenti, quindi tirare fuori i dati (di cui sarà nota dimensione e tipo) e stamparli. Per identificare tipo e lunghezza dei campi da ogni VARINT c'è la tabella sul sito di SQLite (http://www.sqlite.org/fileformat.html su Record Format).

Insomma, fare un'estrattore specifico non è niente di che, ma in questo caso richiede molta pazienza per verificare i tipi di dato che possono utilizzare i campi visto che non corrispondono sempre a quelli dichiarati. Ciao ciao!
Di  Francesco  (inviato il 13/12/2013 @ 11:29:46)
# 12
Grazie Francesco per il tuo feedback ;)
Di  Nanni Bassetti  (inviato il 13/12/2013 @ 12:18:38)
# 13
Ciao di nuovo, ho aggiornato tempo fa l'estrattore di SQLite (che ora riconosce anche i campi particolari che usa Whatsapp) ma mi ero scordato di segnalarlo. Se tu o qualcuno su CFI trova il tempo di darmi una lista delle possibili strutture della tabella dei messaggi (io ho solo quella più recente) ovvero le stringhe CREATE TABLE dentro all'interno del .DB stesso e mi dite che colonne vi servono posso fare un estrattore per i messaggi cancellati "definitivo" come ho fatto per quello di Skype (vedi qui http://www.forensicfocus.com/Forums/viewtopic/t=11223/ ). Se avete voglia/tempo fatemi sapere. Ciao.
Di  Francesco  (inviato il 23/07/2014 @ 07:34:19)
Anti-Spam: digita i numeri CAPTCHA99X
Testo (max 2000 caratteri)
Nome
e-Mail / Link


Disclaimer
L'indirizzo IP del mittente viene registrato, in ogni caso si raccomanda la buona educazione.
Ci sono 127 persone collegate

< settembre 2017 >
L
M
M
G
V
S
D
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
             

Cerca per parola chiave
 

Titolo
Annunci (62)
CHI SONO (4)
Computer Forensics (105)
SICUREZZA INFORMATICA (6)
TuttoStorto (16)

Catalogati per mese:

Gli interventi pił cliccati

Ultimi commenti:
Grazie a tutti quell...
11/09/2017 @ 19:34:32
Di Raymond
Piccola Offerta di c...
11/09/2017 @ 11:34:02
Di credito.locali.veloce
Salve ho fatto il ro...
19/07/2017 @ 16:15:53
Di Marc






20/09/2017 @ 20:19:16
script eseguito in 31 ms