Intercettare Traffico Mobile - Android&iOS

Tempo di lettura: 9 minuti
Data pubblicazione: March 7, 2022

L’intercettazione del traffico HTTPS durante un’attività di Penetration Test Mobile è una fase fondamentale per la buona riuscita di un PT, in quanto se non si riescono a vedere le API chiamate dall’applicazione è praticamente impossibile proseguire e identificare le vulnerabilità che affliggono le API.

In questo articolo andremo a vedere i principali metodi per intercettare il traffico, bypassare eventuali pinning e come avere un buon setup per intercettare senza troppi problemi di sorta.

Per chi non avesse nessun’infarinatura, consiglio Come Funziona un’applicazione Android e Introduzione alla sicurezza di un’applicazione Android, anche se ne potete trovare altri nella categoria Mobile.

Nel seguente articolo utilizzerò un Android Galaxy S8 (Android 9) con il root e un iOS (iPhone 7 v. 14.3) con il jailbreak.

Android

Nessun Controllo - Android API < 24

Nel caso in cui l’applicazione non effettui nessun controllo sulla bontà della connessione, sarà sufficiente installare il certificato di Burp nel Certificate Storage di Android e impostare il proxy di Burp sul device (o usare ProxyDroid).

Nessun Controllo - Android API >= 24

Dalle API >=24 (da Android Nougat) Android ha però eliminato la possibilità di aggiungere un certificato nello storage utente (o meglio, si può ma le applicazioni che usano quelle API lo ignoreranno) e di conseguenza non potremo più intercettare.

Le possibilità per riuscire ad intercettare sono due (grazie a ropnop per gli step):

  1. Installare il certificato di Burp a livello di sistema: in questo caso con pochi comandi andremo ad installare il certificato non più nel Certificate Storage a livello utente ma a livello di sistema. I passaggi sono:

    #Converto il certificato di Burp in PEM
    openssl x509 -inform DER -in cacert.der -out cacert.pem
    
    #Estraggo l'hash del certificato
    openssl x509 -inform PEM -subject_hash_old -in cacert.pem |head -1
    
    #Rinomino il certificato con <hash>.0
    mv cacert.pem 9a5ba575.0
    
    #Rimonto il sistema e copio il certificato
    adb root
    adb remount
    adb push 9a5ba575.0 /sdcard/
    adb shell
    vbox86p:/ # mv /sdcard/9a5ba575.0 /system/etc/security/cacerts/
    vbox86p:/ # chmod 644 /system/etc/security/cacerts/9a5ba575.0
    vbox86p:/ # reboot
    

    Nel caso in cui dia problemi a copiare in system bisogna prima renderlo scrivibile, fare i passaggi e poi renderlo read only nuovamente

    mount -o rw,remount /system
    
    mount -o ro,remount /system
    
  2. Modificare il Manifest dell’app. Da cui possono aprirsi due strade:

    • Modificare la flag platformBuildVersionCode presente nel file AndroidManifest.xml, metterla uguale a 23 e compilare l’apk. In questo modo verranno presi in considerazione i certificati utente.
    • Inserire all’interno del file network_security_config.xml il trust-anchors ai certificati utente. Su ropnop ci sono tutti i passaggi del caso.

Default Pinning

Il pinning SSL, noto anche come Public Key Pinning, si assicura che la catena di certificati usata sia quella che l’applicazione si aspetta, controllando che una particolare chiave pubblica o certificato appaia nella catena. In questo caso non basterà inserire il certificato di Burp nello storage, perchè l’applicazione si accorgerà che la catena di certificati non è più la stessa.

In questo caso, la maggior parte delle applicazioni utilizzano classi note per fare il controllo e basterà utilizzare frida o objection per fare il bypass:

  1. Frida: ci sono numerosi script che effettuano l’hooking delle classi e lo bypassano. Alcuni tra i più popolari sono Universal Android SSL Pinning Bypass with Frida e frida-multiple-unpinning. Per verificare che funzioni

    frida --codeshare pcipolloni/universal-android-ssl-pinning-bypass-with-frida -f YOUR_BINARY
    
  2. Objection: molto simile a frida, contiene al suo interno i bypass per le classi più comuni. Per verificare che funzioni

     objection --gadget "nome.pacchetto.applicazione" explore -s "android sslpinning disable"
    

Un altro modo per patchare l’apk senza utilizzare Frida/Objection è il tool apk-mitm, il quale si occuperà di patchare tutte le classi conosciute e compilerà il nuovo apk in automatico.

Custom Pinning

Nel caso in cui nemmeno Frida o Objection funzionino è necessario decompilare l’apk e cercare all’interno del codice le classi e i metodi utilizzati che effettuano il pinning. Una volta identificate si può modificare lo smali ed eliminare i metodi e/o modificare il valore di ritorno delle funzioni collegate ad esso. Consiglio questo articolo per un’esempio pratico.

Flutter

Flutter è un caso tutto a sé poiché utilizza Dart il quale ignora il Certificate Storage del device e le impostazioni del proxy, quindi anche impostando il proxy su Android, il traffico non passerà da Burp.

Per prima cosa bisogna riuscire ad intercettare il traffico. Per farlo ci servirà OpenVPN e un paio di regole con iptables:

  1. Installare OpenVPN sulla propria macchina (io utilizzo una VM Ubuntu ad hoc per la VPN con indirizzo IP statico sulla mia LAN) con questo script.

  2. Copiare il file ovpn sul device di test

  3. Connettere il device alla VPN appena installata

  4. Impostare le sequenti regole di IPTables sulla macchina (sempre la VM Ubuntu di cui parlavo prima)

     sudo iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 80 -j REDIRECT --to-port 8080
     sudo iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 443 -j REDIRECT --to-port 443
     sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
    
  1. Impostare le regole con invisible proxy su Burp Suite e in ascolto su tutte le interfacce
  1. Ora tutto il traffico che verrà inviato dal device passerà per Burp.

Ci sono diverse guide per bypassare anche il pinning di Flutter (Intercepting traffic from Android Flutter applications e Intercepting Flutter traffic on Android (ARMv8)) ma non ho mai avuto modo di provarle, stranamente con la VPN attiva e il certificato salvato a livello System sono sempre riuscito ad intercettare anche il traffico delle applicazioni Flutter.

Recentemente è stato pubblicato un tool che permette il repacking di un’applicazione Flutter, reFlutter

iOS

Come per Android ci possono essere diverse casistiche, vediamone alcune.

Nessun Controllo

Basterà aggiungere il proxy all’iphone con l’indirizzo IP di Burp, aggiungere il certificato seguendo la guida ufficiale e il traffico potrà essere analizzato.

Pinning

Uno dei tool più comuni è SSL Kill Switch 2, il quale riesce a bypassare la maggior parte dei controlli.

Nel caso in cui non funzioni, ci possono venire incontro sempre Frida e Objection:

  1. Frida: anche qui ci sono diversi script per provare a bypassarlo, come ios12-ssl-bypass

  2. Objection: stessa cosa, con il comando:

    objection –gadget “nome.pacchetto.applicazione” explore -s “ios sslpinning disable”

Flutter

Stessa metodologia di Android con OpenVPN.

Conclusioni

Come si può vedere ci possono essere diverse tecniche per intercettare il traffico di un dispositivo mobile. Poiché mi capita spesso di doverle mettere in pratica, la mia tecnica preferita è quella con OpenVPN, in quanto una volta installato tutto non si dovrà praticamente più far nulla, solamente attivare la VPN e si avrà tutto il traffico passante per Burp.