Telegram Android Forensics – II parte

Seconda parte concernente l’analisi forense della più veloce applicazione di messaggistica sul mercato, Telegram. Questa seconda parte è dedicata ad Android.

Con la versione 4.8.11 – ultima release attualmente scaricabile da Play store alla data di stesura dell’articolo – arrivano su Telegram numerose altre funzioni interessanti: possibilità di selezionare una chat come letta/non letta premendo su di essa; anteprima della conversazione con un determinato contatto premendo la foto profilo nella lista chat; possibilità, scrivendo un messaggio, di inserimento di un URL cliccabile e annullamento dei messaggi non ancora inviati.

Telegram è, come già illustrato nell’articolo precedente, un’applicazione di messaggistica istantanea sicura con il vantaggio di essere disponibile su iOS, Android e Windows Phone, ma anche in una versione Web; vi sono applicazioni anche per MacOS, Windows e Linux. Quindi è possibile utilizzare Telegram comodamente su quasi tutte le piattaforme possibili e immaginabili.

Per chi volesse approfondire la conoscenza di Telegram per Android, può consultare il sito https://github.com/DrKLO/Telegram, dove troverà i sorgenti dell’applicazione e le istruzioni per crearne una propria dalle caratteristiche similari.

Le caratteristiche dell’applicazione sono state già descritte nell’articolo su iOS; quindi darò dei cenni qualora vi siano delle evidenti discrepanze.

Ad esempio: una peculiarità che differenzia le ‘chat segrete’ di iOS da Android è la possibilità del primo di effettuare screenshot all’interno della chat che vengono comunque notificate all’interlocutore; su Android ciò non è possibile – a meno di determinati accorgimenti: l’impostazione del PIN o di una password prima dell’inizio della chat consente di effettuare screenshot -; senza tale accorgimento, si riceverà il messaggio evidenziato in fig.1:

Fig.1

Come ribadito innumerevoli volte, il primo passo per effettuare l’analisi forense di un’app consiste nel comprenderne le funzionalità al fine di rilevarne quelle di interesse prettamente investigativo, analizzandole e identificando quelle che possano portare informazioni dirimenti nella varie indagini e cioè:

  • l’account utente Telegram: all’interno del sistema, ogni utente è identificato in modo univoco tramite il suo ID Telegram (TID), un numero intero (scelto da Telegram) che è associato a un numero di telefono. Inoltre, ogni utente può opzionalmente impostare un nome utente che consentirà ad altri utenti di trovarlo tramite la funzionalità di ricerca fornita di Telegram e una foto inerente il profilo. Tutte queste informazioni possono avere un valore investigativo molto significativo. Il TID identifica in modo univoco l’utente all’interno di Telegram, mentre il numero di telefono può essere usato per risalire alla sua vera identità. La foto può invece fornire ulteriori informazioni e suggerimenti sull’identità dell’utente, specie se visualizza un volto o qualsiasi elemento che possa essere univocamente associato a quella persona.
  • Contatti: ogni utente è associato a un elenco di contatti, e cioè ad altri utenti che possono comunicare tra loro. Per ciascuno contatto, Telegram memorizza il suo TID, il numero di telefono e foto del profilo. L’importanza investigativa con espresso riguardo alle informazioni sui contatti è palese, dato che consente a un investigatore di determinare chi era in contatto con l’utente e la possibilità di definire, eventualmente, la vera identità di ogni contatto.
  • Scambio di messaggi: Telegram offre ai suoi utenti la possibilità di effettuare comunicazioni one-to-one, one-to-many e many-to-many usando, rispettivamente, chat, canali e gruppi, dove gli utenti possono scambiarsi messaggi testuali e non, organizzando gli stessi in modo da definire la corrispondenza di ognuno a una specifica chat, gruppo o canale. La capacità di ricostruire la cronologia e il contenuto degli scambio messaggi è di evidente importanza investigativa, in quanto consente all’investigatore di determinare le comunicazioni con gli altri utenti, quando queste comunicazioni si sono verificate e ciò che è stato scambiato.
    Inoltre, l’identificazione delle proprietà di ogni finestra di dialogo in cui l’utente era coinvolto con – tipo, il creatore, la data di creazione, gli amministratori, etc. – può fornire prove preziose in varie ricostruzioni probatorie. La scelta di utilizzare una chat segreta, ad esempio, potrebbe indicare l’intenzione degli utenti di “cercare” di nascondere totalmente le conversazioni. Analogamente, sia la creazione che l’amministrazione di un gruppo o un canale privato su cui può essere condiviso materiale illegale e trasmesse comunicazioni illecite, potrebbe fornire prova che l’utente fosse coinvolto in attività criminali di vario genere – sextortion[1], cyber estorsione, detenzione di materiale pedopornografico, etc. -.
  • Chiamate vocali: già dalla versione 3.18, Telegram fornisce ai propri utenti chiamate vocali che, come chat segrete, si basano sulla crittografia end-to-end (EE2E). La capacità di ricostruire la cronologia delle chiamate vocali – quando una chiamata è stata effettuata, ricevuta, con chi e per quanto tempo – rappresenta anch’essa un’informazione di un evidente valore investigativo.

Come già noto, vi sono alcuni software forensi in grado di decifrare le evidenze archiviate da Telegram – Oxygen Forensics Detective, Magnet Axiom, Belkasoft Evidence Center solo per citarne alcuni -, ma gli stessi non forniscono alcuna spiegazione su come questa decodifica venga eseguita, né tantomeno alcun ausilio su come utilizzare i vari elementi estratti al fine di ricostruire completamente le attività dell’utente.

Pertanto, alla luce di quanto sopra, è praticamente impossibile valutare la completezza e la correttezza dei risultati generati.

Nonostante la fama di instant messenger più sicuro, Telegram non crittografa i file di database pertinenti memorizzati sul dispositivo. Pertanto, l’analisi forense di Telegram sul dispositivo Android può effettuarsi senza grossi problemi, il routing potrebbe rappresentare l’unica difficoltà.

Vediamo in dettaglio la posizione degli artefatti di Telegram all’interno del dispositivo. Parliamo di un dispositivo rootato, dato che tutte le informazioni non sono disponibili agli utenti cosiddetti “standard”:

Fig.2

 

Fig.3

 

Fig.4

 

I dati principali di Telegram per Android sono memorizzati:

  • nel database cache4.db situato all’interno della directory /data/data/org.telegram.messenger/files/, all’interno del quale sono contenute molte informazioni importanti, quali la lista dei contatti dell’utente, la cronologia dei messaggi scambiati, il contenuto dei messaggi di testo e il registro delle chiamate vocali, solo per citarne alcuni;
  • nel file di configurazione XML denominato xml[2], situato all’interno della directory /data/data/org.telegram.messenger/shared_prefs/ contenente i dettagli dell’account Telegram adoperato sul dispositivo;
  • nella cartella /data/media/0/Android/data/org.telegram.messenger/cache/ ove è possibile rinvenire le foto del profilo utente e dei suoi contatti atte a rivelare informazioni importanti sull’identità degli stessi;
  • nella cartella /data/media/0/Telegram/ le copie dei file inviati o ricevuti dall’utente tramite Telegram.

La gestione della struttura dati di Telegram non è, purtroppo, così semplice: la maggior parte dei dati vengono memorizzati in strutture complesse chiamate Telegram Data Structures (TDS)[3].

Le TDS vengono archiviate in un formato binario[4], in cui i loro campi sono memorizzati come una sequenza di byte in cui ognuno di essi appare in una determinata posizione. Pertanto, per recuperare le informazioni memorizzate in una TDS, è prima necessario estrarre i suoi vari campi dalla corrispondente sequenza binaria e quindi decodificare ognuno di essi. Per eseguire i passaggi precedenti, la struttura e lo schema di serializzazione delle TDS devono essere note.

Per chi volesse approfondire gli argomenti, consiglio di consultare la documentazione ufficiale sul sito https://core.telegram.org/.

La prima verifica da effettuare in fase di analisi è la determinazione dell’account Telegram utilizzato sullo smartphone in esame; tale informazione è contenuta nel file di configurazione utente, denominato userconfing.xml e in particolare in uno dei suoi attributi, che è denominato user:

<string name=”user“>w/QTLn8cAADY02YRfRPG/B2Vj7oGQ29zaW1vAAhkZSBQaW50bwAAAAZjb29zNjAADDM5MzQ3NDQ5 NzY0OQAAAMjYWdWppzEb2NNmEXaQ1lMEAAAAPgqgGQAAAADYsQAADd9GifTG2fR2kNZTBAAAAD4K oBkAAAAA2rEAAOOdFl0wC/+iSTm57eIGSVs= </string>.

Questo attributo memorizza una TDS di tipo User, la cui struttura è riportata nella documentazione ufficiale[5] e a sua volta utilizza altre TDS di tipo UserProfilePhoto[6] e FileLocation[7].

Estraendo i campi e decodificando si ottiene la funzione di deserializzazione che è contenuta nei sorgenti dell’app e qui sono riportati solo i dati essenziali ricavati:

First name: Cosimo
Last name: de Pinto
Full name: Cosimo de Pinto
User name: coos60
Phone number: 39347XXXXXX
User picture: 429918782_45528
Status: Online
Expires: 13/07/2018 20:09:06
UID: 291951576

Analizziamo ora il contenuto del database cache4.db. Esso si compone di 41 tabelle (nella versione in esame) come evidenziato in fig. 5:

Fig.5

Le informazioni relative ai contatti sono memorizzate nella tabella users, riprodotta in fig.6:

Fig.6

La tabella contiene il campo UserID (uid), il campo name (nome) con l’eventuale nickname, il campo status (data e ora codificata secondo “Epoch Unix Timestamp”, ovvero il numero di secondi passati dal 01/01/1970 alle 00:00:00 per indicare l’ultimo cambio di stato dell’utente) e il campo data in formato BLOB[8], contenente le informazioni sull’utente. Dette informazioni non si esauriscono con il contenuto della tabella suddetta, ma sono presenti anche nelle tabelle user_contacts_v7 (userID, nome e cognome) e user_phones_v7 (userID, numero di telefono e il flag cancellato). La colonna deleted, mostrata in fig.7, può contenere valori 0/1: 0 per utente ancora nei contatti e 1 per utente cancellato.

Fig.7

Con una semplice query SQL siamo in grado di visualizzare anche un address book esaustivo:

SELECT us.uid, us.key, us.fname, us.sname, up.phone, up.sphone, up.deleted FROM user_contacts_v7 as us LEFT JOIN user_phones_v7 as up ON us.key = up.key WHERE 1;

Il risultato è mostrato in fig. 8:

Fig.8

Come già accennato, Telegram fornisce vari tipi di finestre di dialogo consentendo ai suoi utenti di scambiare messaggi testuali e non:

  • Chat one-to-one: i messaggi vengono inoltrati dal sistema e una copia di essi viene mantenuta in modo da poter essere sincronizzati su tutti i dispositivi che l’utente utilizza per accedere a Telegram. La crittografia server-client è utilizzata per crittografare i messaggi in transito tra il mittente e il sistema, e quindi da quest’ultimo al destinatario finale. Per ciascuna coppia di utenti, Telegram consente solo una singola chat.
  • Chat segrete individuali: i messaggi vengono scambiati direttamente tra dispositivi degli utenti, cioè i loro messaggi non vengono mai inviati o memorizzati sul sistema di Telegram. La crittografia dei messaggi end-to-end è utilizzata per crittografare i messaggi prima della trasmissione. A differenza delle normali chat, una coppia di utenti può creare e utilizzare contemporaneamente tante chat segrete come desiderano. Una chat segreta viene creata da uno degli utenti, ed è automaticamente unito all’altro, dopo che la creazione è stata effettuata fuori, la prima volta che si connette a Telegram.
  • Canali uno-a-molti: trasmissione a tutti i suoi utenti iscritti dei messaggi pubblicati da uno dei suoi amministratori o dal creatore del canale (a nessun altro è permesso inviare messaggi). Come per le chat regolari, i messaggi vengono inoltrati dal sistema, dove viene conservata una copia cifrata “server-client”. Un canale può essere pubblico o privato: nel primo caso, il nome utente è pubblicato sul sistema Telegram e chiunque può unirsi allo stesso, nel secondo caso possono parteciparvi solo gli utenti invitati.
  • Gruppi e supergruppi many-to-many: trasmissione a tutti membri del gruppo dei messaggi inviati dai membri che ne facciano parte. Telegram annovera due tipi distinti di gruppi: gruppi standard, che possono avere fino a 200 membri e supergruppi, che possono avere da 201 a 5.000 membri.
    Per quanto riguarda i canali, un (super) gruppo può essere pubblico o privato.

Come già evidenziato, le tabelle di maggiore interesse investigativo sono tre: user_phones_v7, user_contacts_v7 e messages, ma è di fondamentale importanza conoscere anche il contenuto della tabella dialogs – cfr. fig.9 -. Telegram memorizza in questa tabella i dialoghi in cui l’utente è stato coinvolto. Ogni conversazione è identificata in modo univoco da un numero intero contenuto nel campo DID (Dialog Identifier), viene evidenziata la data e l’ora dell’ultima operazione eseguita (date), il numero di messaggi che devono ancora essere letti (unread_count_i) e altre informazioni meno rilevanti. Per identificare i messaggi scambiati, Telegram memorizza nella tabella messages un record per ogni messaggio che è stato inviato o ricevuto e nel campo UID il DID della tabella dialogs: una semplice query SQL potrà chiarire meglio quanto esplicitato:

SELECT messages.* FROM messages WHERE uid IN (SELECT did FROM dialogs);

il risultato in Fig.10:

Fig. 9

 

Fig. 10

Prendendo come esempio il valore del campo DID della fig. 9 pari a 3455600518787760128 – in seguito spiegherò il motivo della scelta – e identificandolo nella fig. 10 nel campo uid, possiamo notare la quantità di messaggi scambiati con detto utente. Questi messaggi, vedremo in seguito, fanno parte di una chat segreta. Si distinguono per la lunghezza dell’Uid (19 cifre) ma anche per i primi 4 byte presenti nel campo data pari a 0xFa555555 – fig. 11, diverso da 0xF6A1199E del messaggio di sistema – fig.12 – e da  0x3DB4F944 – fig. 13 – per un normale messaggio:

Fig. 11

 

Fig. 12

 

Fig. 13

Per ogni chat segreta – in fig.16 una chat segreta decodificata -, Telegram memorizza un record nella tabella enc_chats assieme ad altre varie informazioni quali il suo uid (campo uid), il suo nome (campo name) e il TID (Telegram ID Account) dell’utente che ha creato la chat (campo admin_id), la data di creazione (key_date) e il TID dell’utente che si è unito alla chat dopo la creazione (campo user).

Fig. 14

Onde identificare invece, le chat regolari, è possibile selezionare i record della tabella dialogs il cui campo conteneva uno dei valori memorizzati nel campo uid della tabella users; ad esempio, ritrovare un qualsiasi utente di Telegram con cui l’utente locale ha scambiato messaggi con una semplice query SQL – il risultato in fig. 15 – :

SELECT dialogs.* FROM dialogs WHERE did IN (SELECT uid FROM users);

Fig. 15

 

Fig.16

Quelle di interesse investigativo, users, enc_chat, user_phones_v7, user_contacts_v7, dialogs e messages, possono essere messe in relazione tra loro con semplici query sql e ricostruire la cronologia delle chat, come già ampiamente documentato.

Cercare di comprendere il funzionamento delle app che possono essere di ausilio all’estrazione e all’analisi delle evidenze non è certamente tempo perso anche perché, i meccanismi delle app di IM sono molto simili tra loro.

Sempre valido il mio consiglio nel testare accuratamente gli strumenti con cui si approcciano le acquisizioni e le analisi in ambito forense. Anche le proprie deduzioni e test, se supportati da prove ripetibili di laboratorio, possono costituire un ottimo strumento per alleviare le “sofferenze”.

A volte è proprio questo che fa la differenza.

Note

 

A cura di: Cosimo de Pinto

Profilo Autore

Informatico Forense, socio IISFA, socio ONIF, certificato CIFI, è Perito e Consulente Tecnico presso il Tribunale Ordinario di Roma. Laureato in Beni Culturali, è stato un pioniere della Digital Forensics, espletando il suo primo incarico come ausiliario di P.G. presso la Procura di Bari nel lontano 1990.Titolare di uno studio professionale, presta la propria consulenza a studi legali, aziende, Procure e FF.OO., in materia di Digital Forensics e CyberCrime.

Condividi sui Social Network:

Articoli simili