Q
RC OD
E à travers une application mobile pour scanner les badges des exposants des projets de sécurité de l'information.
L'année dernière, nous avons visité une grande exposition de projets de sécurité de l'information à Londres. En préparation, nous avons reçu nos laissez-passer sous forme de PDF «à imprimer vous-même».
Nous avons immédiatement remarqué deux types de codes-barres. Fait intéressant, le code QR semblait trop dense, étant donné qu'il suffit de stocker uniquement l'ID du participant. Curieux de nature, nous avons lancé un scanner QR et reçu le contenu du code:
{"CJe";"BHEEZST","DO";"Cvmmfuqsppg","G";"upn","KU";"Qfofusbujpo uftufs","T";"xzbuu"}
Il s'est avéré que c'était presque mais pas tout à fait JSON. Un des avantages d'un nom aussi court que le mien est qu'il attire l'attention dans de telles situations. Par conséquent, j'ai immédiatement remarqué que mon nom était codé en ROT-25 («tom» transformé en «upn»). Il est également connu sous le nom de chiffre de César, où chaque lettre est remplacée par une autre avec un décalage fixe (dans ce cas, la lettre de l'alphabet a été utilisée à la place de chaque lettre). Après avoir exécuté la ligne à travers le décodeur (en tenant compte du balisage JSON), nous avons obtenu:
{"BId";"AGDDYRS","CN";"Bulletproof","F";"tom","JT";"Penetration tester","S";"wyatt"}
C'est plus lisible.
Le casser?
Curieusement, le code QR stocke des informations qui semblent être liées au champ BId dans la base de données. Pourquoi? Eh bien, c'est assez simple. Les organisateurs ont créé une application mobile pour les vendeurs qui les aide à collecter les contacts des participants pendant l'exposition. Nous avons supposé que les données sont cryptées dans un code QR dans le cas où le signal Wi-Fi ou cellulaire est instable.
Jusqu'à présent, nous ne pouvons pas faire grand-chose avec ces informations, sauf pour modifier nos données afin d'éviter le spam des fournisseurs de l'événement. Ce serait drôle, mais à peine digne d'un e-mail au développeur du système. Nous sommes donc allés au Play Market et avons installé l'application appropriée pour voir ce qu'il fait.
Et là, nous avons rencontré un problème: nous n'avions pas les données nécessaires des organisateurs de l'événement. Nous pensions que nous pouvions simuler la réponse du serveur en utilisant le proxy MiTM, et l'application nous laisserait partir. Nous avons configuré Burpsuite et enregistré quelques tentatives de connexion infructueuses, dans l'espoir d'intercepter le trafic et de jouer avec.
Hélas, nous n'avons pas réussi. L'application a dirigé toutes les demandes à l'aide de SOAP, et les réponses n'étaient pas évidentes. Cependant, le serveur publie des documents WSDL pour l'application.
Ce n'est pas la fin
Pourquoi ne pas écrire un faux service Web pour ne plus avoir accès au vrai serveur d'applications? Quelques heures plus tard, nous avons eu un tel service, et tout le trafic a été activé. Ça marche! L'application authentifiée avec toutes les données et connectée à un faux événement.
Nous avons scanné quelques badges et tout semblait fonctionner correctement. Progrès! Après avoir erré autour de l'application pendant un certain temps, il est devenu évident qu'il utilisait une sorte de cadre basé sur WebView. En fouillant un peu dans l'APK, nous avons trouvé un certain nombre de mentions de Sencha et Ext.js, qui ont confirmé notre hypothèse.
Et maintenant - le plus intéressant. Si une application se compose d'un mélange régulier de HTML et de JavaScript, peut-elle être vulnérable aux attaques Web standard? Nous avons enveloppé quelques XSS dans le "pas-tout-JSON" que l'application attend, les avons scannés, et ...
Nous l'avons cassé
Super! L'injection HTML dans le champ "JT" a montré l'image. Nous pouvons ajouter l'attribut «onerror» à cette balise pour réaliser l'exécution du script, mais nous sommes limités par la restriction sur la longueur maximale du code QR. En conséquence, nous avons créé une charge utile qui a téléchargé le fichier JS à partir du serveur et l'a exécuté sur l'appareil. Voici, par exemple, le test standard alert ():
La lecture d'un code-barres déclenche XSS et exécute le code:
Nous l'avons piqué de manière à ce qu'il s'intègre parfaitement à la taille maximale d'un code QR lisible, pas trop dense pour l'impression sur un laissez-passer. Après avoir lu la documentation de l'API Ext.js et l'avoir comparée avec le code APK décompilé, nous avons pu créer un code-barres qui:
- Télécharger un fichier JS depuis un serveur distant
- Lit les clés de session depuis un smartphone et les envoie à notre serveur
- Lit le contenu de la base de données de contacts en cache à partir de l'application, y compris les noms et adresses e-mail de tous ceux dont les laissez-passer ont été analysés par cet appareil
- Supprime votre enregistrement d'un smartphone
Ensuite, l'attaque se résume à ce qui suit: le vendeur scanne mon code QR en échange d'un stylo gratuit, et j'obtiens une liste complète de tous les contacts scannés par cet appareil.
Charge utile:

Demandes au serveur Web:

Tout va bien qui finit bien
Nous avons attiré l'attention des vendeurs lors de l'exposition et après quelques discussions, ils ont décidé de ne pas utiliser l'application cette année. Seules quelques personnes lors de l'événement ont profité de l'application, alors que la plupart préféraient de simples scanners de codes à barres simples. L'application du Marché n'a été téléchargée qu'environ 500 fois. Cependant, c'est un vecteur intéressant pour XSS, qui montre que vous devez vraiment filtrer les données avant utilisation, quelle que soit leur source.
Bien que cette application particulière n'ait pas été largement utilisée, imaginez si la vulnérabilité se trouvait dans une application utilisée par des milliers ou téléchargée par des millions? Toutes ces données seraient destinées aux attaquants qui en auraient disposé à leur discrétion: des campagnes de phishing aux attaques par force brute.