Android-App-Verbindungsanalyse mit mitmproxy

05.08.2019 Jonas L. Analysemethode

Ich habe bereits gezeigt, wie man mittels NetGuard sehen kann, wohin eine App eine Verbindung herstellt. Mit mitmproxy kann man z.T. sehen, was übertragen wird.

Installation

Dafür braucht man zunächst mitmproxy. Bei vielen Linux-Distributionen gibt es das Programm in den Paketquellen.

Starten von mitmproxy

Zum bequemen Benutzen ist die Darstellung der Oberfläche per Browser sinnvoll. Dafür öffnet man ein Terminal und führt dort “mitmweb” aus. (Die Weboberfläche benötigt Websockets. Wenn man diese, z.B. per user.js, deaktiviert hat, dann kann und sollte man hierfür ein neues Browserprofil erstellen.)

Android-Emulator installieren

Wegen technischen Änderungen ist diese Methode nur bis Android 6 leicht anwendbar. Aber Android 6 ist alt und man hat wahrscheinlich kein Gerät mit einer solchen alten Version. Die Lösung dafür ist der Android-Emulator. Es würde auch besser gehen, aber wenn man gleich Android Studio installiert dann hat man auch den Android-Emulator. Auf dem Startbildschirm von Android Studio kann man “Configure” und dann “AVD Manager” (AVD = Android Virtual Device) wählen. Dort kann man ein neues virtuelles Gerät erstellen (nicht vergessen: höchstens Android 6/ Marshmallow). Ich habe das Gerät “MITM” genannt, damit es gleich einfacher wird. Nun wird das Gerät NICHT grafisch gestartet. Stattdessen begibt man sich mit dem Terminal in den Ordner, in dem man das Android-SDK installiert hat. Dort führt man dann “./emulator/emulator -avd MITM -http-proxy http://127.0.0.1:8080" aus. Dann startet der Android-Emulator.

Android-Emulator vorbereiten

Direkt nach dem Hochfahren des Android-Emulators gibt es auch schon etwas zu sehen:

Von mitmproxy erfasster Captive Portal Check

Hier sieht man, dass sich der AVD zu Hause bei Google meldet. Dabei geht es darum, zu prüfen, ob eine Internetverbindung vorhanden ist, wobei die wenigsten Nutzer wissen, dass dafür standardmäßig eine Anfrage an Google gesendet wird.

Nun kann man mal den Browser öffnen und surfen. Was passiert?

Fehlermeldung zum fehlerhaften Zertifikat

Durch das mehrfache Tippen auf “Continue” wird man das Problem los. Bei Apps kann man nicht einfach so bestätigen. Dafür muss man das Zertifikat importieren. Dafür gibt man in der Adressleiste “mitm.it/cert/pem” ein, richtet dann eine Bildschirmsperre ein und importiert das Zertifikat. Danach kann man ohne Fehlermeldungen aber mit Protokollierung durch mitmproxy surfen.

Genau an dieser Stelle liegt das Problem bei Android 7 und neuer. Dort kann man das Zertifikat importieren, aber Apps müssen dort manuell angeben, dass sie auch den vom Benutzer importierten Zertifikaten vertrauen. Mit root-Rechten könnte man das Zertifikat in den Systemzertifikatsspeicher importieren, um dieses Problem zu lösen, aber solange man Android 6 verwenden kann muss man sich ja nicht die Mühe machen.

App installieren und testen

Um eine App zu installieren braucht man diese als APK-Datei. Diese kann man z.B. bekommen, indem man die App auf einem Gerät mit Play Store installiert und dann von dort kopiert.

Die APK-Datei kann man per Drag-and-Drop in den Emulator ziehen, um sie dort zu installieren.

Damit es übersichtlicher wird kann man vor dem Starten der App im Browser im Menü “mitmproxy” den Punkt “new” wählen.

Wenn man eine “normale” (verseuchte) App startet, dann zeigt mitmproxy viel an:

von mitmproxy erfasste Anfragen

Wenn man eine Anfrage auswählt, dann sieht man die Details dazu. Ich habe hier gezielt eine Anfrage ausgewählt, die gut lesbar ist:

protokollierte Telemetrieanfrage

Hier werden zwei Dinge gesendet: Die verwendete App und Details zum Gerät. Diese Daten sind als buntes Diagramm für Marketing-Menschen wichtig, weil die daran ihren Erfolg zeigen. Ob man all diese Angaben dafür braucht oder evtl. nicht etwas weniger ausreichen würde ist eine andere Frage.

Außerdem ist es so, dass der Play Store schon eine integrierte Erfassungsfunktion hat. Das bedeutet, dass der Play Store die installierten Apps erfasst, an Google sendet und Google eine Statistik generiert, auf die man zugreifen kann, wenn man die entsprechende App im Play Store veröffentlicht hat. Das sieht dann so aus:

Statistik in der Google Play Developer Console

Das ist natürlich ungenau, weil es ja nur Play-Store-Nutzer erfasst. Ist ja nicht so, dass das die Mehrheit der Nutzer ist, wodurch diese Angaben bei normalen Apps auch repräsentativ sind. Aber je mehr Organisationen so etwas erfassen desto besser … aber nicht für den Benutzer, weil dann nur eine von den mehreren Organisation Mist bauen muss damit Daten wegkommen.

Einschränkungen dieser Methode

  • ab Android 7 funktioniert das nicht ohne weiteres, da vom Benutzer importierte Zertifikate standardmäßig von Apps ignoriert werden
  • bei Apps mit Certificate Pinning funktioniert das nicht ohne weiteres
  • manche übermittelte Daten sind nicht lesbar oder zusätzlich verschlüsselt

Fazit

Braucht man für alles eine App, die schon vor der ersten Aktionen des Nutzers Daten auf der ganzen Welt verteilt?

In diesem Fall (Fastfood-Kette) braucht man überhaupt nichts Digitales. Wenn man der Meinung ist, dort essen zu müssen, dann geht man einfach dort hin.

Im Allgemeinen gibt es die meisten Inhalte auch per Browser. Der hat aber einen entscheidenden Vorteil: Die Webseiten können auf weniger (aber immer noch zu viel) Angaben zugreifen. Dort gibt es aber auch die Komfortfunktion, beim Schließen alle lokal gespeicherten Daten löschen zu lassen. Bei Apps müsste man das mit jeder App einzeln tun. Außerdem gibt es Browser-Erweiterungen, die das Laden von Trackern verhindern. Bei Apps sind die Tracker (falls vorhanden) ein fester Bestandteil. Man könnte natürlich die Kommunikation der Tracker mit der Außenwelt unterbinden, aber am besten ist es, wenn die Tracker gar nicht erst ins Haus kommen.