@matteo.pisani.91Matteo Pisani
Spielzeug zerlegen seit ’91
„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
Erstelle dein kostenloses Konto, um dein individuelles Leseerlebnis freizuschalten.