4 février 2020

Comment contourner le SSL Pinning avec un téléphone non rooté ?

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 :

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 :

A screenshot of a cell phone

Description automatically generated

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 :

A screenshot of a cell phone

Description automatically generated

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 :

A screenshot of a cell phone

Description automatically generated

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

A screenshot of a cell phone

Description automatically generated

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:

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 :

A screenshot of a computer

Description automatically generated

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 :

A screenshot of a cell phone

Description automatically generated

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

A screenshot of a computer screen

Description automatically generated

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 !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *