Wie ich moderne Verkaufsautomaten hackte

author
4 minutes, 6 seconds Read
Ursprünglich veröffentlicht von Matteo Pisani am 10. Oktober 2018 192,920 liest

„Hauen und Stechen“ die gebündelte App des europaweit größten Vertriebsunternehmens.

Vorwort

Unbestreitbar sind Automaten Kultobjekte. Köstliche Häppchen von Hackern, immer. Anfangs funktionierten sie offline nur mit Münzen, dann verbreiteten sich NFC-Schlüssel/Karten-Modelle. Wenn ich „COGES“ sage, kommen einem sicher bessere Zeiten in den Sinn. Aber… In ein paar Jahren haben sich die Dinge radikal geändert. Du lenkst ab und einen Moment später findest du die Welt ersetzt durch Dinge, die mit dem Internet verbunden sind…

GESCHICHTE

Eines Tages beschloss ich, meine Reifung in der Fledermaushöhle zu unterbrechen und direkt in meine Heimatstadt zu fahren, um etwas Sonnenlicht zu bekommen, also ging ich zur Universität, um einen alten Professor zu begrüßen.

„Geh einen Kaffee trinken!“ – sagte er- und wir fingen an zu plaudern, während wir durch den Hauptkorridor gingen.

Eingetroffen…

Ich: „Lass mich bezahlen, ich habe Münzen!“.
Er: „Warte! Lass mich die App des Automaten zum Bezahlen benutzen, dann ist der Kaffee billiger“.

BLE + NFC

Gehirn: „Mmm… Virtuelle Geldbörsen sind cooles Zeug…“.

Exzellent.

HOT-POT

Seele: „Trau dich, das zu hacken!“

~$ Weiße Hut-Innenstimme: „nur Schulterklopfen, wenn keine Bug-Bounty-Belohnung“.
~$ Graue Hut-Innenstimme: „ok, ich mache das nur zu Lehrzwecken“.
~$ Schwarze Hut-Innenstimme: „c’mon man, lass uns das HEAP hacken, toller Jupiter!“.

Später an diesem Tag…

Pwnie express.

ANALYSE

Unnötig zu sagen, dass ich mein schmutzig gerootetes Android-Smartphone (mit aktiviertem USB-Debugging) in die Hand nahm, die anvisierte App aus dem Play Store installierte und die Original *.apk auf meinen Laptop via adb.

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

Ich dekompilierte die *.apk mit apktool

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

und extrahierte die Java-Quellen mit jadx

# jadx ./Argenta.apk 

Zunächst habe ich die *.apk debugging-fähig gemacht, indem ich die Datei AndroidManifest.xml durch Hinzufügen der Eigenschaft android:debuggable="true" zur application <tag>

Dann habe ich die *.apk

# apktool b ./Argenta

mit keytool

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

signiert und die *.apk mit jarsigner unter Verwendung des generierten Schlüssels

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

zu guter Letzt habe ich es mit zip ausgerichtet, um es lauffähig zu machen

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

und ich installierte die fertige *.apk

# adb install ./Argenta-signed.apk

Ich ließ die App auf dem Smartphone laufen und fing an, die Logs mit logcat zu betrachten, indem ich sie nach dem Paketnamen filterte

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

Nichts Besonderes gefunden, also fing ich an, die Quelltexte zu durchkämmen und nach pikanten Informationen zu suchen.

Bei genauerer Betrachtung der Datei AndroidManifest.xml fand ich Hinweise auf RushOrm

Die erste Stichwortsuche war also db_name

Cool. Ich startete den Root Explorer auf dem Telefon und suchte nach argenta.db

Fund. Also habe ich es mit adb

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

auf meinen Laptop gezogen und versucht, es mit einem DB Browser für SQLite

offenbar zu öffnen, war sie passwortgeschützt

REVERSE-ENGINEERING

Schritt zurück zu den Quellcodes, schaute mir RushAndroidConfig.java

an, wo ich die Methoden zur Konfiguration der Datenbank fand.
Meine Aufmerksamkeit erregte this.encryptionKey = getDeviceId(context);

Ich ging zu seiner Definition und…

fand, dass die angestrebte App die IMEI des Telefons (*#06#)als Verschlüsselungsschlüssel für die SQLite-Datenbank verwendete.

Abracadabra.

Boom Baby.

Nach ein paar Sekunden der Inspektion, öffnete ich die UserWallets Tabelle

und bearbeitete das walletCredit Feld mit den Änderungen

dann schob ich die Datenbank mit gepumptem Guthaben zurück auf das Telefon

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

VERDICT

In der Zwischenzeit, während ich mich wie „Robin Hood“ fühlte (nostalgische und explizite Anspielung auf den Age Of Empires Cheat-Code für +1000 Gold), entwickelte ich ein Android-Dienstprogramm, um die Datenbank der anvisierten App schnell zu dumpen/wiederherzustellen/zu manipulieren, und zwar on the fly.

Dann ging ich wieder an meine Universität zurück, um den Hack endlich zu testen

Liebes Tagebuch…

CONCLUSION

Vom Null-Kredit-Konto konnte ich:

>Das Guthaben der App aufblähen.
>Kram kaufen.
>Restliches Guthaben aktualisieren.
>Zurück zum Null-Guthaben-Status gehen.
>Guthaben wieder aufblasen.
> Neu anfangen.

Bei einer Makroinspektion aller umgedrehten Quellen fand ich einen riesigen Anteil sauberen Codes – ohne Verschleierung -, was bedeutete, dass keine großartigen Gegenmaßnahmen ergriffen wurden, um die Benutzerdaten zu schützen und die App überhaupt sicher zu machen.

Vor einem Monat…

Die innere White Hat-Stimme in mir griff zum Telefon und rief die Firma an, die hinter dieser Schande steckte, um die Sicherheitslücke zu melden. Ich schlug ihnen sanft vor, die derzeitige Architektur zu verwerfen und eine bessere und sichere von Grund auf zu entwickeln.

Hokuspokus.

Tags

Join Hacker Noon

Erstelle dein kostenloses Konto, um dein individuelles Leseerlebnis freizuschalten.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.