Comment exploiter l’API privée d’une application mobile
Le site que vous souhaitez scraper possède aussi une application mobile ? Il est temps de la regarder d’un peu plus près…
Vous pourrez avoir une bonne surprise et découvrir une API privée.
Les APIs privées des applications mobiles
Pour écouter le trafic de l’application il faut se placer entre elle et le serveur de destination.
On va mettre en place un proxy qui une fois configuré sur le téléphone interceptera toutes les données envoyées.
Avant :
Après :
Toutes les communications du téléphone passeront par le proxy hébergé sur notre ordinateur.
Nous pourrons tout écouter et même modifier les requêtes avant qu’elles n’atteignent le serveur.
Mise en place du serveur proxy
J’utilise personnellement Burp Suite, une suite d’outils pour tester la sécurité d’une application web ou mobile.
La version gratuite contient quelques limitations comme l’impossibilité d’enregistrer un projet mais nous pouvons très bien nous en passer.
Téléchargez et installez la dernière version de Burp Suite : https://portswigger.net/burp/
Démarrez un nouveau projet en utilisant la configuration par défaut. Vous devriez ensuite vous retrouvez devant l’interface de Burp Suite avec des onglets pour toutes les fonctionnalités.
La fonctionnalité qui nous intéresse est dans l’onglet proxy.
Il faut configurer le proxy pour qu’il écoute sur la bonne interface réseau. La configuration se fait dans l’onglet Options.
Par défaut il n’écoute que sur l’adresse locale (127.0.0.1 aussi appelée localhost).
Nous devons rajouter une interface réseau pour que le proxy puisse être contacté sur l’ensemble de notre réseau local.
Dans mon cas l’adresse IP de mon ordinateur sur mon réseau est 192.168.1.73 le proxy doit donc écouter sur cette interface.
Il faut rajouter un « listener » sur votre interface réseau.
Deux choses à sélectionner : le port et l’interface. Pour le port il suffit de d’entrer un port réseau disponible, 8080 est le port attribué pour les serveurs proxies par défaut.
Concernant l’interface vous devez choisir l’interface qui correspond au réseau commun avec mon mobile.
Une fois validé vérifiez bien que celui-ci est actif dans la colonne « running ». Il suffit de cocher/décocher la case pour l’activer ou le désactiver.
Le serveur proxy de Burp est maintenant opérationnel ! Mais si vous essayez de le configurer sur votre mobile vous pourrez voir que toutes les requêtes HTTPS échouent…
C’est dû au fait qu’en ajoutant un intermédiaire entre le serveur de destination et l’application mobile les certificats ne sont plus valides.
C’est tout l’intérêt du HTTPS : chiffrer et certifier les communications.
La solution : Importer dans le mobile l’autorité de certification (CA) de notre proxy. Cela aura pour effet de valider tous les certificats générés par le proxy pour tous les serveurs :
Installation du CA sur Android
Installation du CA sur iOS
Installation du CA sur Windows Device
Une fois l’autorité de certification installée il vous reste à configurer le réseau wifi de votre téléphone pour qu’il utilise le proxy.
Une fois le proxy configuré sur votre téléphone, toutes ces communications passeront désormais par le serveur proxy hébergé sur votre ordinateur. Vous pouvez intercepter et modifier chaque requête avant sa réception par le serveur de destination.
Tester le proxy en naviguant sur un site en HTTPS
Et si on testait le bon fonctionnement du proxy en testant une recherche Google par défaut en HTTPS ?
Dans l’onglet « Intercept » pour pouvez visualiser en temps réel toutes les requêtes avant qu’elles n’atteignent le serveur.
Pour chaque requête reçue par le proxy vous pouvez la supprimer (« Drop »), elle n’atteindra jamais le serveur ou l’envoyer (« Forward »).
Vous pouvez laisser passer toutes les requêtes en actionnant le bouton « Intercept is on » / « Intercept is off ».
Dans l’onglet HTTP History vous avez l’historique de toutes les requêtes. Une requête s’ajoute dans l’historique même si l’option « Intercept » est désactivée.
On voit ici les requêtes de mon téléphone lors d’une recherche Google. On peut trouver simplement la requête qui génère les résultats de l’autocomplétion de Chrome.
En nettoyant l’URL un maximum pour enlever toutes les clés on arrive à cette URL épuré qui fonctionne toujours et qui donne les résultats de Google Suggest dans un tableau facilement exploitable par la suite :
https://www.google.fr/complete/search?client=chrome&gsri=chrome-mobile-ext-ansg&q=lemon
Pour tester les requêtes vous pouvez utiliser PostMan une extension pour Chrome ou les tester directement dans Burp Suite à l’aide de l’outil Repeater.
Clic droit sur la requête puis « Send to Repeater ».
Toutes les informations de la requête seront envoyé dans l’outil Repeater accessible par l’onglet du même nom. Vous pourrez ainsi tester la requête en modifiant quelques paramètres.
Scraping des données d’un annuaire français
Et si on pouvait scraper plus simplement les applications mobiles d’annuaire que leur site web ?
L’objectif est de récupérer toutes les coordonnées des coiffeurs du 12e arrondissement en utilisant l’API privée de l’application.
Après une première recherche « Coiffeurs 75012 » dans l’application mobile on se retrouve avec plusieurs requêtes qui servent principalement pour l’autocomplétion.
Et puis la requête suivante dont le résultat est un gros objet JSON :
GET /directory/v1/search/coiffeurs%2075012
Pour tester la requête je la transfère dans l’onglet « Repeater » de Burp (clic droit sur la requête puis « Send to Repeater ».
On remarque que l’entête de la requête contient une clé. Si on supprime cette entête ou si on modifie cette clé le serveur nous renvoie une erreur 401 Unauthorized.
Mais si on garde cette entête d’authentification l’API nous renvoie les résultats quelque soit la requête.
Il suffit de changer le paramètre dans l’URL pour s’en rendre compte :
Coiffeurs 15e arrondissement :
Requête :
Résultat :
Coiffeurs 10e arrondissement :
Requête :
Résultat :
Le JSON renvoyé ne contient pas tous les résultats annoncés en début de fichier.
Mais un paramètre dans le JSON nous informe sur l’URL à appeler pour récupérer la page suivante.
Un simple paramètre GET jumpPage=X.
10 lignes de Python suffisent pour récupérer toutes les pages et d’extraire les entreprises et leurs informations.
La plupart des applications mobiles fonctionnent avec une API souvent privée qui peut servir à récupérer plus facilement les données.
N’hésitez pas à tester, avec un peu de chance vous trouverez de véritables pépites !
Have fun !