Telecom Italia: Responsible Disclosure

Introduzione

Il Gruppo TIM (precedentemente conosciuto come Telecom Italia S.p.A.) è un’azienda italiana di telecomunicazioni che offre, in Italia e all’estero, servizi di telefonia fissa, mobile, pubblica, telefonia IP, Internet e televisione via cavo (in tecnologia IPTV).

Nel 2018 ha introdotto una responsible disclosure, dove i ricercatori di sicurezza vengono invitati a segnalare vulnerabilità nei sistemi mobile, hardware e web dell’azienda: https://www.gruppotim.it/it/footer/responsible-disclosure.html

Il security team di Telecom Italia è stato molto cordiale e veloce sia nel rispondere alle e-mail, sia nel porre rimedio alle vulnerabilità segnalate.

È stata individuata una vulnerabilità di tipo “Broken Authentication” nel sottodominio https://easyapi.telecomitalia.it/. Questo sottodominio è molto importante in quanto consente, a chi è autorizzato, di interfacciarsi con alcune delle Web API offerte da Telecom Italia. Grazie alla vulnerabilità trovata è stato possibile bypassare il pannello di amministrazione e ad accedere alle Web API.

Sono stati individuati anche altri sottodomini che hanno la stessa interfaccia e layout e che erano potenzialmente vulnerabili allo stesso attacco. Tuttavia, non è stato possibile interfacciarsi con le Web API in quanto si trattava di vecchie istanze disattivate che rifiutavano ogni tipo di connessione.

Cos’è una Web API?

Una API (application programming interface, in italiano: interfaccia di programmazione delle applicazioni) è un insieme di interfacce che vengono esposte da un sistema informatico per permettere e facilitare lo scambio di dati e di informazioni con un altro sistema informatico.

Una Web API, nel caso di Telecom Italia una Web API server-side, è un’API che permette lo scambio di dati e di informazioni fra due sistemi informatici utilizzando il protocollo HTTP. Il funzionamento si basa su un sistema di scambio di messaggi (richiesta-risposta), dove il primo sistema (che chiameremo client) invia una richiesta per ottenere dei dati dal secondo sistema (che chiameremo server) che risponde alla richiesta inviando i dati. Solitamente i dati reperibili dal server vengono divisi in categorie e per ogni categoria viene creato un endpoint, al quale il client può interfacciarsi per recuperare una parte dei dati offerti. La divisione dei dati è molto importante in quanto consente al client di chiedere e ricevere solo ed esclusivamente i dati necessari. Inoltre, nella maggior parte dei casi, è richiesta una chiave di autenticazione che permette al client di interfacciarsi con gli endpoint del server.

Esempio Web API

Per spiegare meglio quello detto in precedenza possiamo fare un esempio: consideriamo l’azienda X (server) che è impiegata nel settore della costruzione di apparecchi elettronici e numerose aziende (ognuna di queste rappresenta un client) operanti nel settore dell’e-commerce che sono interessate alla rivendita dei prodotti dell’azienda X. Come, le aziende client, riescono a includere all’interno del loro sito web, informazioni relative a questi prodotti? L’azienda X mette a disposizione una Web API che consente, a chi è autorizzato, di ottenere informazioni relative a tutti i suoi prodotti. I client ottengono dall’azienda X una chiave per accedere agli endpoint del server e la documentazione della Web API, la quale spiega il funzionamento e i parametri/valori che quest’ultima accetta.

Leggendo la documentazione possiamo individuare:

N.B.: i valori racchiusi fra {} devono essere sostituiti con l’opportuno valore specificato all’interno della documentazione.

Funzionamento del sito

Visitando il sottodominio https://easyapi.telecomitalia.it/ verrà mostrata la pagina principale del sito web:

Se si clicca sui numeri in basso a sinistra per scorrere la lista delle Web API oppure su uno dei riquadri per accedere ai dettagli di una specifica Web API, il server farà visitare la pagina scelta la quale, individuando un utente non autenticato, effettuerà un reindirizzamento a un’altra pagina (che chiameremo intermedia), la quale, a sua volta, effettuerà un altro reindirizzamento alla pagina principale. Ecco lo screenshot della pagina intermedia:

Analizzando il codice sorgente della risposta che il server invia prima di effettuare il reindirizzamento alla pagina intermedia notiamo che il server invia per intero la pagina da visualizzare (cioè la lista delle API oppure i dettagli di una specifica API); tuttavia, dato che non si è autenticati, aggiungerà automaticamente, all’inizio della risposta, un reindirizzamento alla pagina intermedia. Il primo screenshot, riportato di seguito, mostra il codice che viene aggiunto automaticamente all’inizio della risposta e il secondo mostra la risposta del server così come apparirebbe a un utente loggato, senza il reindirizzamento:

È stato così bypassato questo primo controllo ed è quindi possibile navigare all’interno del sito web seppur con molta difficoltà in quanto siamo limitati alla lettura del codice sorgente. Per superare questo limite, dato che i rendirizzamenti vengono effetuati client-side, occorre riscrivere la risposta inviata dal server e cancellare la parte relativa al reindirizzamento; è possibile agire in due modi diversi:

É stata scelta la seconda opzione e utilizzata la seguente espressione regolare <div>\r\n(.*?)<\!DOCTYPE per eliminare la parte della risposta del server responsabile del reindirizzamento.

Individuazione delle Web API sensibili

All’interno del sito web sono state individuate le Web API più sensibili, cioè quelle che espongono informazioni relative agli utenti di Telecom Italia (da notare che i parametri mancanti, che dovranno essere riempiti per consentire al server di accettare la richiesta, sono racchiusi fra parentesi quadre); queste sono:

Bypass del pannello di amministrazione

Le chiamate da effettuare alle diverse Web API hanno bisogno di determinati parametri. Di seguito, ecco riportata la lista di tutti i parametri necessari per poter inviare al server richieste corrette. Tutti, eccetto i primi 2, sono stati trovati leggendo le documentazioni di tutte le Web API:

Per individuare i primi due parametri è necessario accedere al pannello di amministrazione che è protetto da password. Per effettuare il log-in su questo pannello, si visita la pagina principale e, in alto a destra si clicca su “Sign In”. Ecco lo screenshot del pannello di amministrazione:

Per individuare l’username e la password non sono stati effettuati attacchi a dizionario o bruteforce ma, sono solo state immesse manualmente le combinazioni più comuni.

Ecco gli screenshot del pannello di amministrazione:

Nell’ultimo screenshot si nota una sezione dedicata alla generazione del parametro Authorization; tuttavia si tratta di un parametro legato all’ambiente “Sandbox”: come tale, questo dovrebbe funzionare e restituire solamente dei dati di test e non dati reali. Non è così in quanto, come vedremo dopo, l’ambiente “Sandbox” non è altro che una copia dell’ambiente “Production”, ovvero l’ambiente destinato all’utilizzo da parte di Telecom Italia. Sempre nell’ultimo screenshot, a metà pagina, vengono forniti due comandi cURL che ci consentono di generare un codice Authorization (anche se ci viene già fornito). Se si tenta di eseguire questi due comandi il server, anche se è online, non risponde alle nostre richieste (molto probabilmente è raggiungibile solamente tramite la rete interna di Telecom Italia):

Se si torna al “Individuazione delle Web API sensibili” è possibile osservare che nei diversi screenshot, al centro della pagina, sia indicato di un altro server di “Sandbox”, raggiungibile al seguente link: https://easyapisand.telecomitalia.it:8428; in questo caso modificando i due comandi precedenti e adattandoli al nuovo server cURL non è in grado di individuare il server, molto probabilmente è stato eliminato oppure è scaduto con il passare del tempo:

A questo punto:

In quest’ultimo caso ho provato diverse combinazioni di indirizzi:

Alla fine possiamo concludere che:

Accesso alle Web API

Prima di utilizzare una Web API è necessario “sottoscriversi” ed essere accettati dal gestore della stessa. L’account presente sul pannello di amministrazione https://easyapi.telecomitalia.it ha un “accesso illimitato” che consente la sottoscrizione a qualsiasi Web API senza dover aspettare di essere accettati. Per sottoscriversi basta effettuare il log-in, visitare il link di una Web API, ad esempio una di quelle presenti nel paragrafo “Individuazione delle Web API sensibili” e cliccare sul bottone “Subscribe”:

Ecco le richieste fatte alle diverse Web API, con relativo comando e risposta da parte del server:

Altri pannelli di amministrazione

Sono stati individuati altri pannelli di amministrazione che hanno una interfaccia identica a https://easyapi.telecomitalia.it, i quali contengono altre Web API, diverse da quelle di cui ho appena parlato. Occorre servirsi dello stesso iter:

Tuttavia, in questi pannelli di amministrazione si sono presentati svariati problemi che hanno reso impossibile l’utilizzo delle Web API, ovvero:

Abuso da parte di un utente maligno

Un utente maligno avrebbe potuto abusare di questa vulnerabilità per: