Come fare debug delle Mobile Application tramite Charles Proxy
Qualche giorno addietro ho avuto qualche problema con un'applicazione mobile e da curioso come sono non ho saputo resistere alla tentazione di analizzare la blackbox, in particolare il traffico dati generato. Non è la prima volta che eseguo questo particolare genere di attività di debugging e in questo post vi mostrerò lo strumento che ho utilizzato per condurre l'analisi, strumento che ho scelto ad hoc perché di facile utilizzo anche per i non addetti ai lavori.
Sono riuscito a stimolare abbastanza anche la vostra curiosità? Molto bene, prima di continuare desidero però fare una premessa, quanto descritto nel corso dell'articolo ha uno scopo puramente didattico.
Le Applicazioni Mobili connesse
La maggior parte delle più comuni applicazioni mobili (o Mobile Applications o ancora App) che oggi conosciamo (e in particolare quelle che appartengono alla categoria social) richiedono una connessione attiva alla rete internet affinché la funzionalità sia completa. Questo genere di applicazioni sfruttano la rete internet per comunicare con il provider dei servizi con l'obiettivo di scambiare dati, sia in ingresso sia in uscita. Cosa vuol dire? Se prendessimo in esame l'app di Twitter (che tutti i VIP, politicanti compresi conoscono bene), questa utilizza le API (Application Programming Interface) pubbliche esposte dal provider Twitter come mezzo per eseguire le operazioni di lettura e scrittura dei dati che riguardano i nostri tweet. Le figure a seguire mostrano gli schemi di comunicazione tra l'app e il provider dei servizi attraverso la rete internet.
La Figura 2 in particolare mostra l'interazione dell'app installata sul dispositivo mobile con i servizi pubblicati da Twitter. Il protocollo di comunicazione utilizzato è il comunissimo HTTP sfruttando le Twitter's REST API per l'accesso ai dati in lettura e scrittura.
E' possibile in modo semplice visualizzare il traffico di rete generato dalle app? Si, vediamo come nel prossimo capitolo.
Come intercettare il traffico di rete
Intercettare o sniffare, è una tecnica attraverso la quale è possibile catturare e analizzare tutti i dati che transitano all'interno di una rete. Spesso questa tecnica è usata in modo illecito per intercettare informazioni riservate con lo scopo principale di controllare la sicurezza di una rete.
Esisto diversi tools (gran parte nativi su piattaforme *nix) che consentono di condurre attività di monitoraggio e di analisi del traffico dati scambiato sulle interfacce di rete. I due tools più conosciuti sono:
- tcpdump: è un tool comune per il debug delle reti di computer che funziona da riga di comando. Consente all'utente di intercettare pacchetti e trasmissioni ad esempio nel protocollo TCP/IP condotti attraverso una rete al quale il computer è collegato. Per maggiori informazioni consiglio di consultare il sito ufficiale tcpdump & libpcap e l'utilissima cheat sheet di Tim Keary;
- wireshark: precedentemente chiamato Ethereal è un software per analisi di protocollo o packet sniffer (letteralmente annusa-pacchetti) utilizzato per la soluzione di problemi di rete, per l'analisi e lo sviluppo di protocolli o di software di comunicazione e per la didattica. Wireshark possiede tutte le caratteristiche di un analizzatore di protocollo standard (TCP, UDP, HTTP, etc..). Per maggiori informazioni consiglio di consultare il sito ufficiale di Wireshark.
Utilizzare questi tools non è proprio un gioco da ragazzi. Quale strumento tirar fuori dalla borsa attrezzi con lo scopo di analizzare il traffico di rete generato dalle app installate sul nostro dispositivo? In realtà lo strumento è già stato svelato perché contenuto nel titolo di questo post, comunque, vediamo di descrivere brevemente la tecnica per sbirciare ciò che le nostre app inviano in giro per la rete.
Cosa sarà mai questo proxy?
In informatica e telecomunicazioni, un proxy (che significa intermediario) è un programma che si interpone tra un client ed un server facendo da tramite o interfaccia tra i due host, ovvero inoltrando le richieste e le risposte dall'uno all'altro. Il client si collega al proxy invece che al server, e gli invia delle richieste. Il proxy a sua volta si collega al server e inoltra la richiesta del client, riceve la risposta e la inoltra al client. (Fonte Wikipedia)
Credo che la definizione di proxy da parte di Wikipedia sia chiara anche per i non addetti ai lavori e il diagramma di Figura 4 dovrebbe aiutare ancora di più a fissare in mente il ruolo assunto da questo componente. Le vostre idee adesso dovrebbero essere chiare al punto d'essere nelle condizioni di poter identificare client, proxy e server.
- client: Il nostro dispositivo mobile che "monta" qualunque sistema operativo (Android, iOS, ChromeOS, etc...). Nel mio caso un Samsung Galaxy Note II;
- proxy: Il ruolo del proxy in questo caso è assunto dal software Charles Proxy che dovrà essere installato sul proprio computer;
- server: E' il luogo che ospita i servizi utilizzati dalle nostre app per lo scambio dei dati. Il server potrebbe essere per esempio quello dei servizi delle piattaforme social tipo Facebook, LinkedIn, Twitter, etc...
Charles è in particolare un proxy web (HTTP Proxy / HTTP Monitor) eseguito sul proprio computer. Il browser web (o qualsiasi altra applicazione Internet o dispositivo) è quindi configurato per accedere a Internet tramite Charles, e Charles è quindi in grado di registrare e visualizzare tutti i dati inviati e ricevuti. Spostiamo la lettura verso il prossimo paragrafo affrontando finalmente la parte pratica, decisamente più interessante.
Vediamo cosa passa in rete tramite il proxy?
È necessario disporre di una rete wireless (preferibilmente), e sia computer sia dispositivo mobile (smartphone, tablet, etc...) devono essere collegati alla stessa rete tramite il router wifi. Questo tipo di configurazione è ormai d'uso comune in ogni casa, mi sbaglio? Vediamo quali sono step-by-step i passi da seguire per raggiungere il nostro obiettivo, ovvero, verificare il traffico dati scambiato dalle nostre app e i servizi in esecuzione sulla rete internet (in genere).
- Installazione di Charles Proxy adatto al vostro sistema operativo (OS X, Windows, Linux)
- Prendere nota sulle impostazioni del proxy server
- Avviare Charles
- Dal menù andare a Proxy => Proxy settings
- Prendere nota del numero della porta TCP
- Prendere nota dell'indirizzo IP assegnato all'interfaccia connessa alla rete wifi
- Configurazione della connessione Wireless sul dispositivo Android (versione 3.1 e versioni successive). Per ogni dispositivo Android la configurazione potrebbe essere leggermente diversa. Gli step indicati a seguire dovrebbero comunque andar bene per la maggior parte dei dispositivi Android.
- Andare sulle impostazione del dispositivo
- Selezionare “Wireless & Networks”
- Assicurasi che la rete WiFi sia attiva e che il dispositivo sia connesso alla vostra rete wireless
- Selezionare la rete WiFi a cui siete connessi utilizzando una pressione lunga (touch and hold)
- Selezionare “Modifica Configurazione di Rete”
- Selezionare “Mostra Opzioni Avanzate”
- Nella sezione Proxy, selezionare dall'elenco la voce “Manuale”
- Per il Proxy Hostname (Server), inserire nella casella di testo l'indirizzo IP del vostro computer (dov'è installato Charles)
- Per il Proxy Port, inserire nella casella di testo il numero di porta TCP di Charles annotata in precedenza
- Salvare la configurazione
Le immagini a seguire da Figura 7 a Figura 11 mostrano in ordine gli step di configurazione della rete wireless sul dispositivo Android, mentre la Figura 12 e Figura 13 mostrano le due App (tra quelle installate sul mio dispositivo) che ho preso di mira con lo scopo di analizzare il traffico generato.
Siete riusciti a configurare la connessione wireless? Molto bene. Da questo momento in poi, qualunque attività sul vostro dispositivo che genererà traffico verso la rete internet, sarà visibile in chiaro proprio davanti ai vostri occhi sulla console di Charles.
Ci sono riuscito?
Se siete arrivati fino a questo punto è probabile allora che sia riuscito ad attirare la vostra curiosità e per questo che son contento di aver fatto notte.