Hey! Ich bin Roman, CTO bei Techvice. Manchmal führe ich Reverse Engineering für mobile Apps durch, um auf APIs zuzugreifen und Abfragen in Python- oder NodeJS-Code zu reproduzieren. Dies ist erforderlich, um einen Datenscraper zu erstellen. In einer der kürzlich gecrackten Apps sind mir Spuren der Verwendung von IBM MobileFirst aufgefallen.
IBM MobileFirst (oder IBM Mobile Foundation) ist eine Plattform zur Entwicklung, Optimierung, Integration und Verwaltung sicherer mobiler Anwendungen.
Inhaltsverzeichnis
Haftungsausschluss
-
Ich werde hier nicht den Namen der Anwendung erwähnen.
-
In der IBM-Site-Dokumentation wird darauf hingewiesen, dass dieser Schutz keine unzerbrechliche Verschlüsselung, sondern eine grundlegende Verschleierungsstufe bietet.
Anwendungsanalyse
Zuerst habe ich versucht, den Datenverkehr zwischen der mobilen Anwendung und dem Server mithilfe von Mitmproxy abzufangen. Ich habe jedoch eine Fehlermeldung erhalten, da die Anwendung SSL-Pinning verwendet.
Um das SSL-Pinning zu deaktivieren, habe ich das Frida-Dienstprogramm verwendet. Hier ist eines der Beispiele für Fridas Skripte zur Umgehung von SSL-Pinning – https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/.
Ich habe versucht, Frida-Skripte zu verwenden, die wir für Anwendungen erstellt haben, die wir zuvor untersucht haben, aber nichts hat funktioniert. Diese Anwendung verfügt wahrscheinlich über eine benutzerdefinierte SSL-Pinning-Implementierung, für die meine bisherige Vorgehensweise nicht funktioniert.
Anwendungsdekompilierung
Zum Dekompilieren von Android-Anwendungen habe ich JADX verwendet.
techvice@MacBook-Pro-techvice some_app % jadx -d ./source_code ./some_app.apk
INFO - loading ...
INFO - processing ...
ERROR - finished with errors, count: 25
Bei der Ausgabe gab uns JADX zwei Verzeichnisse: Ressourcen und Quellen. Werfen wir einen Blick in die Quelle.
techvice@MacBook-Pro-techvice some_app % ls -la source_code/sources
total 0
drwxr-xr-x 18 techvice staff 576 Jun 27 15:18 .
drwxr-xr-x 5 techvice staff 160 Jun 27 15:19 ..
drwxr-xr-x 3 techvice staff 96 Jun 27 15:18 a
drwxr-xr-x 4 techvice staff 128 Jun 27 15:18 android
drwxr-xr-x 5 techvice staff 160 Jun 27 15:18 androidx
drwxr-xr-x 3 techvice staff 96 Jun 27 15:18 b
drwxr-xr-x 33 techvice staff 1056 Jun 27 15:18 c
drwxr-xr-x 19 techvice staff 608 Jun 27 15:18 com
drwxr-xr-x 3 techvice staff 96 Jun 27 15:18 cordova
drwxr-xr-x 23 techvice staff 736 Jun 27 15:18 d
drwxr-xr-x 4 techvice staff 128 Jun 27 15:18 de
drwxr-xr-x 3 techvice staff 96 Jun 27 15:18 defpackage
drwxr-xr-x 3 techvice staff 96 Jun 27 15:18 e
drwxr-xr-x 3 techvice staff 96 Jun 27 15:18 im
drwxr-xr-x 3 techvice staff 96 Jun 27 15:18 net
drwxr-xr-x 3 techvice staff 96 Jun 27 15:18 nl
drwxr-xr-x 5 techvice staff 160 Jun 27 15:18 org
drwxr-xr-x 3 techvice staff 96 Jun 27 15:18 uk
Im Quellverzeichnis der dekompilierten Anwendung befindet sich ein Cordova-Verzeichnis. Nun, wir wissen, womit wir es jetzt zu tun haben.
Auf Cordova erstellte Anwendungen sind reguläre Webanwendungen, die auf der Chromium-Engine ausgeführt werden. JS-, CSS- und HTML-Dateien, die für die Anwendungsarbeit erforderlich sind, befinden sich im Verzeichnis „resources/assets/www
` Verzeichnis. Ich öffne dieses Verzeichnis und sehe …
Überraschung! Anstelle der erwarteten HTML-, CSS- und JS-Dateien sah ich ein in mehrere Teile aufgeteiltes Zip-Archiv.
Natürlich habe ich versucht, es zu entpacken, aber wie erwartet erhielt ich die Fehlermeldung, dass der Archivierer dies nicht konnte.
Quellcode abrufen
Zuerst suchte ich nach dem Verschlüsselungsschlüssel und versuchte herauszufinden, wie der Verschlüsselungs-/Entschlüsselungsalgorithmus funktioniert. Ein paar Stunden später fiel es mir auf…
Zuvor habe ich gesagt, dass Cordova-Anwendungen normale Webanwendungen sind, die auf der Chromium-Engine ausgeführt werden. Aber Chromium kann Zip-Archive nicht dekomprimieren und entschlüsseln! Bevor die Anwendung startet, sollte dieses Archiv also irgendwo entpackt werden.
Ich habe die App auf dem Android-Emulator gestartet. Über SSH habe ich eine Verbindung zur Emulator-Shell hergestellt und ein paar Bash-Befehle wie ausgeführt find . -name index.html
. Nach ein paar Minuten gelang es mir, eine Stelle im Dateisystem zu finden, an der das verschlüsselte Zip-Archiv entpackt ist.
So sieht der Quellcode aus.
Abschließende Gedanken
Ich habe auf index.html geklickt, das im Chrome-Browser geöffnet wurde. Dann habe ich auf der Registerkarte „Netzwerk“ in den Chrome Dev Tools (zum Öffnen F12 drücken) alle Anfragen gefunden, die die Anwendung an den Server stellt.