Conseils pour récupérer les données d'une application

a marqué ce sujet comme résolu.

(Désolé si le titre n’est pas assez clair, je manque de vocabulaire dans le domaine)

Bonjour,

Je joue aux cartes pokémon en ligne (https://www.pokemon.com/us/pokemon-tcg/play-online/) et il est possible de faire des échanges de cartes avec les autres joueurs : il suffit de faire une proposition d’échange qui peut être accepté par les autres joueurs.

J’aimerais avoir la liste de tous les échanges pour m’amuser à faire des statistiques sur les "prix" des cartes. Seulement l’interface du jeu ne permet pas faire cela et il n’y a pas d’API (https://www.reddit.com/r/ptcgo/comments/3zxkhr/does_the_game_have_some_sort_of_api/). Savez-vous comment faire cela simplement ?

Pour l’instant je vois deux pistes :

Modifier l’application : Le jeu est fait avec Unity, ça doit être faisable de décompiler le jeu et d’injecter un peu de code pour récupérer la liste des échanges. Inspecter le trafic et essayer de récupérer la réponse du serveur lorsque le client demande les échanges disponibles. Cela doit être faisable avec Wireshark.

Le jeu est également disponible sur android, peut-être qu’un émulateur android donne accès au trafic de l’application ?

Quelle méthode est la plus simple a priori ? Quelques liens qui peuvent m’aider ?

Merci d’avance

+0 -0

Bonjour,

Modifier l’application : Le jeu est fait avec Unity, ça doit être faisable de décompiler le jeu et d’injecter un peu de code pour récupérer la liste des échanges.

Spaectus

Ça me paraît un peu tendu … puis ce n’est pas idéal, si y’a une mise à jour du jeu.

Inspecter le trafic et essayer de récupérer la réponse du serveur lorsque le client demande les échanges disponibles. Cela doit être faisable avec Wireshark.

Spaectus

Oui, largement bien plus accessible. Tu as des bibliothèques pour analyser les paquets de Wireshark. Après tu vas peut-être être confronté à du décodage ? A voir. Tu as pyshark en Python.

Le jeu est également disponible sur android, peut-être qu’un émulateur android donne accès au trafic de l’application ?

Spaectus

Quitte à analyser le réseau, ça me paraît plus simple sur le PC.

+3 -0

Merci Yarflam pour ta réponse, je ne connaissais pas pyshark. Il me sera utile pour automatiser les manipulations à faire avec wireshark.

Pour regarder comme communique le jeu j’ai lancé une capture Wireshark lorsque je me connecte au jeu.

Tout se passe en TCP et TLSv1.2 (si on oublie les quelques requêtes DNS). Il y a en tout 15 flux TCP sécurisées par des échanges de clés Diffie-Hellman basé sur les courbes elliptiques (ECDHE). D’après mes recherches wireshark peut déchiffrer cela en fournissant le Key Log File : https://wiki.wireshark.org/TLS#Usingthe.28Pre.29-Master-Secret.

L’astuce de la variable d’environnement SSLKEYLOGFILE fonctionne pour Firefox (le fichier est créé et permet de déchiffrer). Mais lorsque je lance le jeu, le fichier Key Log n’est créé.

« The key log file is a text file generated by applications such as Firefox, Chrome and curl when the SSLKEYLOGFILE environment variable is set. To be precise, their underlying library (NSS, OpenSSL or boringssl) writes the required per-session secrets to a file. This file can subsequently be configured in Wireshark »

Il faudrait donc trouver la library utilisée par unity et rechercher dans sa doc où elle place le fichier contenant les secrets de session ?

Il faudrait donc trouver la library utilisée par unity et rechercher dans sa doc où elle place le fichier contenant les secrets de session ?

Spaectus

Ou rediriger le flux vers un proxy HTTPS qui relayera les données vers le bon serveur - attaque Man In The Middle (MITM). Ça dépend du niveau de validation du certificat. Si le jeu initialise une connexion avec une clé privée / publique, faudra trouver son empreinte ; autrement ça initialisera une première connexion avec ton proxy et le proxy effectuera la démarche avec le serveur de jeu ce qui te permettra d’extraire toutes les données en clairs (depuis le proxy).

+0 -0

J’ai mis le jeu sur un android pour désactiver facilement le «SSL pinning » avec Frida (https://blog.netspi.com/four-ways-bypass-android-ssl-verification-certificate-pinning/). J’ai ensuite installé mitmproxy sur une raspberry pour faire l’attaque (j’ai suivi ce tuto : https://www.dinofizzotti.com/blog/2019–01–09-running-a-man-in-the-middle-proxy-on-a-raspberry-pi-3/).

Mitmproxy a intercepté quelques requêtes du jeu intéressantes (comme des liens pour télécharger les images de cartes pokémon) mais aucune requête http/https intercepté ne corresponds aux échanges. Pourtant l’application a bien dû demander au serveur les échanges disponibles… Cela signifie que ces requêtes ne passent ni par le port 443 ni 80 ? Et que, au niveau de la raspberry, je dois ajouter des règles « iptables » pour rediriger les ports des requêtes vers le port écouté par mitmproxy ?

Entre temps j’ai bidouillé un peu les fichiers .dll du jeu grâce à dnSpy. Avec un ajout dégueulasse (et bien placé) de code j’ai pu extraire les propositions d’échange des autres joueurs au format JSON ; il me suffit de lancer le jeu et d’aller dans le menu des échanges pour récupérer les informations dans un fichier. Mission réussie.

Mais le top du top serait d’imiter les requêtes du client pour récupérer les informations quand je veux et de manière automatique, je pourrais ainsi faire une API. Il faut donc que je me replonge sur mitmproxy.

Cela signifie que ces requêtes ne passent ni par le port 443 ni 80 ? Et que, au niveau de la raspberry, je dois ajouter des règles « iptables » pour rediriger les ports des requêtes vers le port écouté par mitmproxy ?

Spaectus

Ça m’est difficile de te répondre. Je ne connais ni le jeu, ni les paquets réseaux échangés. Peut-être qu’en augmentant le spectre d’analyse (le nombre de ports) ? Ou est-ce une question de protocole ? Je pense aux websockets, même si ça me semble étrange … tu devrais pouvoir les analyser.

En fait mitmproxy n’intercepte pas tout les flux TLS mais uniquement les requêtes et réponses correspondants à du HTTPS. Or en cherchant dans le code décompilé, j’ai découvert que le jeu utilise son propre protocole le "WargSocket" sur le port 8181.

Pourquoi le nom "WargSocket" ?

Le warg est un loup monstrueux de la mythologie nordique. Et il se trouve que l’entreprise qui développe le jeu s’appelle Dire Wolf Digital. Un easter egg bien caché…

Du coup j’ai fait un proxy TLS basique en python sur le port 8181 (en m’inspirant de cette vidéo https://youtu.be/iApNzWZG-10) et j’ai pu intercepter ce qui m’intéressait ! A partir de là, faire mes propres requêtes en WargSocket n’a pas été compliqué.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte