De nos jours, de nombreuses entreprises proposent des applications mobiles afin de permettre aux utilisateurs d’utiliser leurs services via smartphone. Ces applications, téléchargeables via les différentes plateformes de téléchargements, augmentent la surface d’attaque des entreprises et peuvent être la cible d’attaques diverses et variées. Notamment, des attaquants peuvent avoir recours à de l’interception de requêtes afin de pouvoir détecter de potentielles vulnérabilités sur les serveurs contactés par l’application (API).
Afin d’éviter cette interception, un mécanisme a été mis en place : le certificate Pinning ( https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning). Le principe est le suivant : l’application n’accepte de se connecter et d’échanger qu’au serveur ayant un certificat spécifique. Or, lors d’une interception de trafic (via Burp, par exemple), le certificat intermédiaire est différent.
Nous allons voir ici comment contourner relativement facilement ce mécanisme de protection sur une application Android avec un outil open source s’appelant Objection (https://github.com/sensepost/objection).
Installation
Pour installer cet outil, plusieurs éléments sont nécessaires. Il faut tout d’abord installer le SDK Android : https://developer.android.com/studio
En effet, le SDK en version « command line tools only » ne suffit pas, car ce dernier ne dispose pas des binaires nécessaires à l’utilisation d’Objection :
- apktool – https://ibotpeaches.github.io/Apktool/
- aapt – http://elinux.org/Android_aapt
- adb – https://developer.android.com/studio/command-line/adb.html
- jarsigner – http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jarsigner.html
Il faut également avoir ces binaires dans le PATH. Sur macOS et GNU/Linux, voici les commandes :
$ echo export “ANDROID_SDK /Users/<username>/Library/Android/sdk/build-tools/29.0.2/” >> ~/.bash_profile
$ source ~/.bash_profile
Ensuite, il est possible d’installer Objection. Pour cela, il est recommandé de l’installer via un environnement virtuel python 3 :
$ virtualenv --python=python3 /venv
$ source /venv/bin/activate
$ pip3 install -U objection
Objection peut ainsi être utilisé dans cet environnement virtuel :

De cette manière, nous pouvons tester le contournement d’une application de test implémentant le SSL Pinning, comme cette application: https://github.com/sh3llc0d3r1337/MobilePentest/tree/master/SSLPinningExample
Ici, l’application va chercher à requêter la page de GitHub avec son certificat préchargé via Certificate Pinning. En interceptant les requêtes du téléphone via Burp (https://support.portswigger.net/customer/portal/articles/1841101-configuring-an-android-device-to-work-with-burp), il est possible de s’apercevoir que ces dernières sont bloquées et que la page GitHub n’est pas affichée.
Contournement du SSL Pinning
Ainsi, afin d’intercepter la requête de l’application, nous avons besoin de modifier cette dernière. Objection nous permet de « patcher » l’application afin d’interagir avec elle en insérant notre hook Frida (outil qui permet d’injecter du JavaScript dans les applications Android) de la manière suivante :
$ objection patchapk –-source SSLPinningExample.apk –-architecture arm64-v8a

Lorsqu’un téléphone est branché via adb, il n’y a pas besoin de mettre l’option « architecture », comme ici :

Attention, lors de l’écriture de cet article, cette étape nécessitait un « hotfix ». En effet, il n’était pas possible de récupérer l’accès à l’application avec Frida, car il semblerait qu’il y ai un problème avec la version du gadget 1.8.6 de l’architecture arm64-v8a. Étant donné qu’Objection va automatiquement télécharger ce binaire lorsque l’on patch un APK, il a donc fallu modifier manuellement la bibliothèque située ici :
$ ~/.objection/Android/arm64-v8a/libfrida-gadget.so
Le chemin pouvant être différent, il est nécessaire de vérifier dans les logs d’Objection ( ~/.objection/objection.log)
La version utilisée était la version 12.8.6, et en la remplaçant par la version 12.8.0, il était possible de récupérer le hook Frida. Il est possible de télécharger cette bibliothèque ici : https://github.com/frida/frida/releases
Ce problème semble néanmoins résolu avec la version 1.8.9 du gadget Frida.
Décomposons ce que fait l’outil lors du patch de l’apk. Comme on peut le voir dans la première capture d’écran, Objection réalise les actions suivantes :
- Décompilation de l’application via apktool
- Recherche d’activité que l’on peut lancer (fenêtre sous Android) si une classe cible n’est pas spécifiée
- Analyse du code Smali de l’application
- Injection de code
Pour cette étape, nous avons fait un comparatif de ce fichier via la commande diff :

Il est possible de remarquer que quelques fichiers diffèrent. Néanmoins, celui nous intéressant pour cette étape est le fichier au format « smali ».
Ce fichier « MainActivity.smali » commence par le code suivant :

Après avoir « patché » l’application, ce fichier a été modifié de la manière suivante :

Il est possible d’observer qu’une classe supplémentaire a été ajoutée, contenant le gadget Frida. Ce gadget nous permettra par la suite d’avoir accès au runtime de l’application. Objection effectue ensuite les actions suivantes:
- Création de l’apk avec les fichiers modifiés
- Signature de l’apk avec jarsigner
- Optimisation de l’archive apk avec l’outil Zipalign (https://developer.android.com/studio/command-line/zipalign)
Nous pouvons désormais installer l’application sur notre smartphone :
$ adb install SSLPinningExample_fixed.objection.apk
Nous pouvons ensuite lancer l’application, qui sera figée au lancement, car elle attend le hook Frida :

Ainsi, on peut lancer Objection et interagir avec le runtime de l’application du téléphone et désactiver le SSL certificate pinning avec les commandes suivantes :
$ objection explore
$ android sslpinning disable
Voici le résultat dans objection :

Il est désormais possible d’intercepter les requêtes avec Burp et les modifier à notre guise :

En l’occurrence, comme il est possible de le voir, cette application va requêter le site github.com avec le certificat préchargé et ainsi afficher du code HTML de celle-ci:

Recommandation
Cette méthode de contournement de certificate pinning peut-être déjouée si l’application utilise une double authentification SSL. Par exemple, cette fonction peut être utilisée sur Android : https://www.example-code.com/android/http_tlsMutualAuthentication.asp
Dans ce cas, le serveur distant ainsi que le client sont authentifiés via un certificat distinct, empêchant le retour du serveur si le certificat n’est pas approprié. Il est possible pour l’attaquant de modifier celui-ci si le téléphone est rooté (ou jailbreaké), il est donc recommandé d’ajouter une fonction vérifiant si le téléphone n’a pas les droits administrateurs.
Conclusion
Nous avons vu comment mettre à mal la protection de SSL Pinning grâce à Objection.
Des outils comme Frida nous permettent d’interagir avec le runtime de l’application et il est bien entendu possible de faire tout cela manuellement. Seulement, Objection nous facilite grandement la tâche en automatisant ces actions afin de faire des tests via des téléphones qui ne sont pas rooté ou jailbreaké.
Dans tous les cas, le SSL Pinning n’est pas forcément facile à contourner si cette protection est bien implémentée, et il est toujours recommandé de la mettre en place afin d’éviter que l’on puisse facilement jouer avec l’API de l’application.
Happy hacking !