Comment j’ai piraté les distributeurs automatiques modernes

author
4 minutes, 39 seconds Read
Publié initialement par Matteo Pisani le 10 octobre 2018 192,920 lectures

.

« Hitting and kicking » l’App groupée de leur plus large société de distribution européenne.

PREFACE

Indiscutablement, les distributeurs automatiques sont des objets de culte. Des bouchées délicieuses pour les hackers, toujours. Au début, ils ne fonctionnaient hors ligne qu’avec des pièces de monnaie, puis, les modèles NFC- clés/cartes ont commencé à se répandre. Si je dis « COGES », je suis sûr que des temps meilleurs vont venir à l’esprit de quelqu’un. Mais… En quelques années, les choses ont radicalement changé. Vous distrayez et un moment après, trouvez le monde supplanté par des choses connectées à l’internet…

HISTOIRE

Un jour, j’ai décidé d’interrompre l’assaisonnement dans la bat-cave et de diriger vers ma ville natale pour avoir un peu de soleil, donc je suis allé à l’université pour saluer un vieux professeur.

« Va prendre un café ! ». – il a dit – et nous avons commencé à bavarder tout en marchant dans le couloir principal.

Une fois arrivé…

Moi : « laissez-moi payer, j’ai des pièces ! ».
Il : « attendez attendez ! laissez-moi utiliser l’application du distributeur automatique pour payer, le café sera moins cher ».

BLE + NFC

Cerveau : « Mmm… Les portefeuilles virtuels sont des trucs cool… ».

Excellent.

HOT-POT

Ame : « Je te défie de pirater ça ! »

~$ Chapeau blanc voix intérieure : « juste des tapes sur l’épaule si pas de récompense de bug bounty ».
~$ Chapeau gris voix intérieure : « ok, je vais le faire à des fins éducatives seulement ».
~$ Chapeau noir voix intérieure : « allez mec, on se tape ce HEAP, super Jupiter ! ».

Plus tard dans la journée…

Pwnie express.

ANALYSE

Il va sans dire que j’ai pris mon smartphone Android rooté sale (avec débogage USB activé), installé l’application ciblée depuis le Play Store et vidé l’original *.apk sur mon ordinateur portable via adb.

# adb pull /data/app/com.sitael.vending-1/base.apk ./Argenta.apk

J’ai décompilé le *.apk avec apktool

# apktool d ./Argenta.apk -o ./Argenta

et extrait les sources Java avec jadx

# jadx ./Argenta.apk 

En premier lieu, j’ai rendu le *.apk débuggable en modifiant le fichier AndroidManifest.xml en ajoutant la propriété android:debuggable="true" à la application <tag>

Puis, j’ai reconstruit le *.apk

# apktool b ./Argenta

créé une nouvelle clé avec keytool

# keytool -genkey -v -keystore Argenta.keystore -alias Argenta -keyalg RSA -keysize 2048 -validity 10000

signé le *.apk avec jarsigner en utilisant la clé générée

# jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore Argenta.keystore Argenta.apk Argenta

en dernier lieu, je l’ai aligné par zip pour le rendre exécutable

# zipalign -v 4 Argenta.apk Argenta-signed.apk

et j’ai installé l’*.apk

# adb install ./Argenta-signed.apk

J’ai lancé l’App sur le smartphone et j’ai commencé à regarder les logs avec logcat en les filtrant via son nom de package

# adb logcat --pid=`adb shell pidof -s com.sitael.vending`

Rien de spécial trouvé, j’ai donc commencé à passer au peigne fin les codes sources à la recherche d’informations juteuses.

En regardant mieux le fichier AndroidManifest.xml, j’ai trouvé des références à RushOrm

Donc, la première recherche par mot-clé était db_name

Cool. J’ai démarré le Root Explorer sur le téléphone en cherchant argenta.db

Found. Je l’ai donc tiré sur mon ordinateur portable avec adb

# adb pull /data/data/com.sitael.vending/databases/argenta.db ./

et j’ai essayé de l’ouvrir avec un DB Browser pour SQLite

évidemment, il était protégé par un mot de passe

REVERSE-ENGINEERING

Retourner aux codes sources, regarder RushAndroidConfig.java

où j’ai trouvé les méthodes utilisées pour configurer la base de données.
Mon attention a été attirée par this.encryptionKey = getDeviceId(context);

Je suis passé à sa définition et…

J’ai découvert que l’App ciblée utilisait l’IMEI du téléphone (*#06#)comme clé de cryptage pour la base de données SQLite.

Abracadabra.

Boom baby.

Après quelques secondes d’inspection, j’ai ouvert la table UserWallets

et j’ai édité le champ walletCredit en écrivant les changements

puis j’ai repoussé la base de données avec le crédit pompé vers le téléphone

# adb pull ./argenta.db /data/data/com.sitael.vending/databases/argenta.db

VERDICT

En attendant, alors que je me sentais comme « Robin des Bois » (référence nostalgique et explicite au code de triche d’Age Of Empires pour +1000 or), j’ai développé un utilitaire Android pour vider/restaurer/tamper rapidement la base de données de l’App ciblée à la volée.

alors je suis retourné à nouveau à mon Université pour enfin tester le Hack

Cher journal…

CONCLUSION

À partir d’un compte à zéro crédit, j’ai pu :

> Gonfler le crédit de l’appli.
> Acheter des trucs.
> Obtenir la mise à jour du crédit restant.
> Revenir à l’état de crédit zéro.
> Gonfler à nouveau le crédit.
> Recommencer.

Avec une inspection macro de toutes les sources inversées, j’ai trouvé une énorme portion de code propre – sans obfuscation – qui signifiait qu’aucune grande contre-mesure n’avait été adoptée pour protéger les données des utilisateurs et sécuriser l’App du tout.

Il y a un mois…

La voix intérieure de White Hat en moi a pris le téléphone et a appelé la société derrière cette honte pour signaler la vulnérabilité. Je leur ai gentiment suggéré de jeter l’architecture actuelle et d’en développer une meilleure et sécurisée à partir de zéro.

Hocus bogus.

Tags

Rejoignez Hacker Noon

Créez votre compte gratuit pour débloquer votre expérience de lecture personnalisée.

Similar Posts

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.