Objectif
Récupérer un code PIN auprès d’un Content Provider dans une application Android.
Outil
Installation
Pour commencer, nous allons installer l’application sur un périphérique virtuel (bien que cela fonctionne également avec les périphériques physiques), le tout grâce à ADB :
$ adb install com.mobilehackinglab.securenotes.apk
Performing Streamed Install
Success
L’application est installée avec succès et se lance parfaitement :

Commençons l’analyse !
Fichier AndroidManifest.xml
Voici le fichier AndroidManifest.xml de l’application Secure Notes :

Il est possible d’identifier un Content Provider exporté, c’est-à-dire accessible par d’autres applications du système. Il s’agit du Content Provider com.mobilehackinglab.securenotes.SecretDataProvider.
Compréhension du Content Provider
Les Content Providers permettent de mettre à disposition une « interface » afin d’accéder à des informations de l’application (généralement stockées dans une base de données ou un fichier) permettant aux autres applications d’y accéder.

Lors de l’interaction avec un Content Provider (via ADB ou via une application malveillante), la méthode query() est invoquée (présente au sein du fichier com.mobilehackinglab.securenotes.SecretDataProvider) :

Les méthodes delete(), insert() et update() peuvent également contenir des actions intéressantes en fonction des applications. Ce n’est pas le cas ici.
L’implémentation de la fonction query() permet de réaliser plusieurs actions :
- Vérifie que le selection commence par “pin=” (ligne 89)
- Extrait et formate le PIN sur 4 chiffres (%04d) (ligne 95)
- Appelle decryptSecret(pin) pour déchiffrer la donnée stockée dans encryptedSecret (ligne 100)
Dans le cadre d’un appel via ADB, le paramètre selection (ligne 89) est transmis au ContentProvider grâce à l’option –where. Pour faire appel à ce Content Provider, il sera alors nécessaire d’utiliser la commande suivante : adb shell content query –uri content://com.mobilehackinglab.securenotes.secretprovider –where « pin=1234 »
Ne voyant aucune mesure permettant de limiter le nombre de vérifications, on tente un premier script pour bruteforcer ce Content Provider :

Nous l’exécutons, mais une petite surprise nous attend lorsque l’on tente le PIN 0299 :

Lors des précédents challenges, les flags sont entourés d’accolades, tentons de modifier le script en gardant cela en tête :

Dès lors, après quelques minutes d’attente, il est possible d’accéder au code PIN convoité.