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.
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).
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):
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
Modificare il Manifest dell’app. Da cui possono aprirsi due strade:
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:
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
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.
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 è 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:
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.
Copiare il file ovpn sul device di test
Connettere il device alla VPN appena installata
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
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
Come per Android ci possono essere diverse casistiche, vediamone alcune.
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.
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:
Frida: anche qui ci sono diversi script per provare a bypassarlo, come ios12-ssl-bypass
Objection: stessa cosa, con il comando:
objection –gadget “nome.pacchetto.applicazione” explore -s “ios sslpinning disable”
Stessa metodologia di Android con OpenVPN.
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.