Runtime Manipulation
Last updated
Last updated
Pour bypass le login on va tout simplement manipuler les valeurs en mémoire de certains registre afin de bypass.
On va utiliser cutter et frida.
Après décompilation, on recherche des class ou des méthodes portant le nom login pour comprendre leur fonctionnement.
On identifie un jump vers une autre fonction login. On va donc de nouveau analyser cette fonctiion :
On regarde le code décompiler et on s'aperçoit que le bypass est conditionné par un if :
On va donc changer la valeur du registre w0 (en réalité x0) en utilisant frida.
Astuce faite un clique droit sur le if pour afficher la vue du déassembleur à l'endroit de cette instruction ou bien copier son adresse
On Ă©crit notre script pour bypass le login :
On a une pop up sur l'appareil qui nous dit qu'on a bien réussi à s'authentifié.
C'est la même méthode :
Le login et le mot de passe Ă©tait Ă©crit en clair :
La première idée que j'ai eu était de regarder le code source pour pouvoir identifié où l'url est déclaré et donc m'attacher avec frida afin de changer sa valeur. Or après plusieurs essaies infructueux, j'ai décidé de tracer avec frida-trace les classes et méthode appelé lorsqu'on clique sur le bouton.
L'idée était de voir les appels fait par la classe NSURL et identifié si des call sont fait :
On clique sur le bouton et on remarque l'appelle de plusieurs classes dont la NSURLRequest :
On remarque que requête HTTP est envoyé mais pas la bonne. Pourquoi ?
Allons voir dans burp quelle requĂŞte sont faite.
Donc on constate qu'on tappe sur la mauvaise classe et fonction.
L'idée est donc de voir quelle classe en objective-C permet l'interaction entre user/machine et l'ouverture du navigateur.
La classe qui permet de faire l'action cité précedemment est la classe UIApplication avec la méthode openURL.
Donc essayons de tracer Ă nouveau avec frida-trace pour voir si un call de cette classe et de cette fonction est fait :
Un appel à la classe UIApplication et à la méthode openURL est détecté.
Donc on va s'attacher Ă cette fonction et simplement voir l'url qui est ouvert :
En s'attachant et en regardant le contenu de args[2] on voit l'url qui est renvoyé il suffit de la modifier et la redirection fonctionne :
args o pointer vers reference de laclasse
args 1 selecteur = methode
args 2,3,4 vrai valeur de la fonction/argument
On va donc commencer par chercher la fonction responsable de la validation du mot de passe. On recherche à l'aide de Ghidra le string "Incorrect Code" qui est le string affiché sur la pop up.
Je décide donc de voir sur cutter l'instruction situé à cette adresse :
On remarque une instruction à gauche success et l'encadré rouge de droite, on y voit %ld: Incorrect Code. Il y a donc un cmp évidant qui fait pour déterminer si la valeur entrée est la bonne.
On le remarque dans le premier encadré rouge, le registre x9 est comparé au registre x8. Il suffirait de juste lire la valeur du registre x8 mais le principe de ce challenge est de brute force. Alors j'ai écris un script js que je lance à l'aide de frida pour déterminé le pin :
VoilĂ le code pin est 8848.
Encore une fois grâce au code décompilé grâce à ghidra on arrive à déterminer la fonction LoginValidate
On va tracer cette fonction pour voir si celle-ci est effectivement tracé :
Effectivement, la Classe LoginValidate est bien appelé avec la méthode validateCode qui prends notre pin et viewcontroller qui prend un pointer lui permettant de dire où afficher la popUP.
NB : Quand il y a un + C'est une méthode d'une classe donc pas besoin d'instancier un objet de type LoginValidate, il est possible de directement utilisé la méthode (Exemple pandas en python)
Quand il y a un - C'est une méthode d'instance, il est necessaire d'instancier un objet pour utiliser la méthode associ+é à la classe.
DĂ©sormais, il faut trouver un moyen pour appeler cette fonction :
La fonction prend plusieurs paramètre un pointeur vers la classe, un pointeur vers la methode, un int et un pointeur de nouveau.
Une fois exécuté on remarque que la fonction est bien appelé (frida-trace nous le confirme).
Il faut désormais savoir si le pin entré est le bon. Il faut donc trouver un indicateur afin de vérifier la saisie comme on peut faire avec une SQLi blind avec un delai qui est rajouté pour déterminer si notre SQLi a fonctionnné.
Pour ce faire, on sait qu'une pop up s'affiche avec le message succès ou échec, il serai donc judicieux de récupérer ce contenu :
Schéma à voir dans téléphone perso.
Pour récupérer le contenu, le programme doit faire appel à une classe bien précise native ou non, on peut donc regarder dans la doc apple pour voir une classe qui pourrait afficher une pop-up.
On identifie UIalertcontroler et on va tracer cette classe pour confirmé notre hypothèse :
Désormais que nous avons ça on ecrit un script qui nous permet de brute force :