
🤖 Eine CLI-Anwendung, die automatisch Android-APK-Dateien für die HTTPS-Inspektion vorbereitet
Eine CLI-Anwendung, die automatisch Android-APK-Dateien für die HTTPS-Inspektion vorbereitet
Das Inspizieren des HTTPS-Verkehrs einer mobilen App mit einem Proxy ist wahrscheinlich der einfachste Weg, um herauszufinden, wie sie funktioniert. Allerdings ist es durch die Network Security Configuration, die mit Android 7 eingeführt wurde, und durch App-Entwickler, die MITM-Angriffe mittels Zertifikat-Pinning zu verhindern versuchen, recht mühsam geworden, eine App mit einem HTTPS-Proxy zum Laufen zu bringen.
apk-mitm automatisiert den gesamten Prozess. Sie müssen ihm lediglich eine APK-Datei geben und apk-mitm wird:
Sie können apk-mitm auch verwenden, um Apps mit Android App Bundle zu patchen, und ein gerootetes Telefon ist nicht erforderlich.
Das Ändern des normalen Verhaltens einer App, um Sicherheitsfunktionen wie Zertifikat-Pinning zu umgehen, erfordert entweder die Änderung des Quellcodes der App vor dem Ausführen oder das "Hooking" der App während der Laufzeit, um Funktionsaufrufe abzufangen.
apk-mitm verfolgt derzeit den erstgenannten Ansatz, indem es den Code der App zunächst mit Apktool "disassembliert", Änderungen an mehreren Dateien vornimmt und sie dann wieder zusammensetzt (wieder mit Apktool).
Dieser Ansatz hat den Vorteil, dass er kein gerootetes Gerät erfordert, hat aber auch mehrere Nachteile. Das größte Problem ist, dass Apps eigentlich nicht dafür gedacht sind, disassembliert zu werden. Apktool versucht das trotzdem, aber insbesondere bei großen und komplexen Apps stößt es häufig auf Probleme.
Ein weiteres Problem bei diesem Ansatz ist, dass einige Zertifikat-Pinning-Methoden, wie Prüfungen in nativen Binärdateien (wie bei Frameworks wie Flutter), nur sehr schwer oder gar nicht zu umgehen sind. Aus diesem Grund kann es von Vorteil sein, bei schwierigeren Apps andere Ansätze auszuprobieren.
Insbesondere möchte ich auf mitmproxys android-unpinner-Projekt und die zugrunde liegenden frida-interception-and-unpinning-Skripte von HTTP Toolkit hinweisen. Ihr Ansatz wendet Patches zur Laufzeit mit Frida an, was viel leistungsfähiger ist, aber auch bedeutet, dass es ohne ein gerootetes Gerät entweder nicht oder nur schwer genutzt werden kann.
Wenn Sie eine aktuelle Version von Node.js (14+) und Java (8+) haben, können Sie apk-mitm mit folgendem Befehl installieren:
npm install -g apk-mitm
Nach der Installation können Sie diesen Befehl ausführen, um eine App zu patchen:
apk-mitm <path-to-apk>
Das Patchen einer APK-Datei namens example.apk könnte wie folgt aussehen:
$ apk-mitm example.apk
✔ Decoding APK file
✔ Modifying app manifest
✔ Replacing network security config
✔ Disabling certificate pinning
✔ Encoding patched APK file
✔ Signing patched APK file
Done! Patched APK: ./example-patched.apk
Sie können nun die Datei example-patched.apk auf Ihrem Android-Gerät installieren und einen Proxy wie Charles oder mitmproxy verwenden, um den Datenverkehr der App zu untersuchen.
Sie können auch Apps mit Android App Bundle patchen, indem Sie apk-mitm eine *.xapk-Datei (z. B. von APKPure) oder eine *.apks-Datei (die Sie selbst mit SAI exportieren können) übergeben. Wenn Sie dies unter Linux tun, stellen Sie sicher, dass sowohl zip als auch unzip installiert sind.
Manchmal müssen Sie manuelle Änderungen an einer App vornehmen, damit sie funktioniert. In diesen Fällen ist die --wait-Option das Richtige für Sie. Wenn Sie sie aktivieren, wartet apk-mitm vor dem erneuten Codieren der App, sodass Sie Änderungen an den Dateien im temporären Verzeichnis vornehmen können.
Wenn Sie mit verschiedenen Änderungen an einer APK experimentieren möchten, ist die Verwendung von --wait wahrscheinlich nicht die bequemste Option, da Sie bei jeder Verwendung von vorne beginnen müssen. In diesem Fall sollten Sie sich APKLab ansehen. Es ist eine Android-Reverse-Engineering-Workbench, die auf VS Code basiert und apk-mitm-Unterstützung bietet, sodass Sie viel schneller iterieren können.
Auf einigen Geräten (wie Android TVs) können Sie möglicherweise kein neues Zertifikat zu den Systemstammzertifikaten hinzufügen. In diesen Fällen können Sie das Zertifikat Ihres Proxys direkt zur Network Security Config der App hinzufügen, da dies auf jedem Gerät funktioniert. Sie erreichen dies, indem Sie apk-mitm mit dem --certificate-Flag auf den Pfad des Zertifikats (.pem- oder .der-Datei) Ihres Proxys ausführen.
Wenn die App Google Maps verwendet und die Karte nach dem Patchen defekt ist, ist der API-Schlüssel der App wahrscheinlich auf das Zertifikat des Entwicklers beschränkt. Sie müssen einen eigenen API-Schlüssel ohne Einschränkungen erstellen und apk-mitm mit der --wait-Option ausführen, um den Wert com.google.android.geo.API_KEY in der AndroidManifest.xml-Datei der App ersetzen zu können.
Wenn apk-mitm beim Decodieren oder Codieren abstürzt, liegt das Problem wahrscheinlich an Apktool. Überprüfen Sie deren Issues auf GitHub, um mögliche Workarounds zu finden. Falls Sie eine Apktool-Version finden, die von dem Problem nicht betroffen ist, können Sie apk-mitm anweisen, diese zu verwenden, indem Sie den Pfad der JAR-Datei über die --apktool-Option angeben.
MIT © Niklas Higi