Wer gern wissen will, welche Daten eine Android-Anwendung nach Hause schickt, hat verschiedene Möglichkeiten der Netzwerkanalyse. Die für mich bequemste Variante, welche komplett ohne Android-Gerät auskommt, möchte ich hier vorstellen.
Schrittweise werde ich erklären, wie man
- einen Android-Emulator unter Linux einrichtet,
- eine APK-Datei aus dem PlayStore herunter lädt,
- einen Proxy zur Netzwerkanalyse installiert und den Emulator gegen den Proxy laufen lässt,
- ein eigenes SSL-Root-Zertifikat im Emulator installiert, um auch SSL-Traffic analysieren zu können.
Einrichtung des Emulators
Die mit Abstand einfachste Art und Weise, eine Android-Anwendung auf dem Desktop laufen zu lassen, ist „Shashlik“. Dabei handelt es sich um einen Satz Scripte, Dateisystem-Images und dem Emulator Qemu, welcher das Android-System emuliert. Im Gegensatz zu anderen Emulatoren kann dieser in eine APK booten und diese auf dem Desktop anzeigen.
Für Ubuntu gibt es ein fertiges Paket unter http://www.shashlik.io/download/ zum Download. Dieses muss mittels dpkg installiert werden. Anschließend werden die Abhängigkeiten installiert. Wer kein KDE-System am Laufen hat, kann optional noch „kdebase-bin“ installieren, da der Emulator Meldungen mittels kdialog anzeigt (~250 MB an dependencies auf meinem Xubuntu). Da die einzige Meldung, die damit angezeigt wird, die Erfolgsmeldung beim Installieren eines APK ist (und diese zusätzlich auch auf der Konsole angezeigt wird) habe ich darauf verzichtet.
Download der Anwendung aus dem PlayStore
Um eine Android-Anwendung direkt auf dem Desktop laufen zu lassen, benötigt man neben dem Emulator auch die APK-Datei. Die Seite https://apps.evozi.com/apk-downloader/ bietet eine solche Möglichkeit, indem einfach eine PlayStore-Adresse in das Formular kopiert wird. Im Ergebnis erhält man einen Download-Link auf die APK. Diese muss noch im Emulator installiert werden:
#> /opt/shashlik/bin/shashlik-install /tmp/my.app-1234567.apk Successfully installed my.app
Der Emulator lässt sich mit der APK-ID (my.app in diesem Fall) sowie einem Namen, der im Fenster-Titel angezeigt wird, ausführen:
#> /opt/shashlik/bin/shashlik-run my.app MyApp
Installation des Charles-Proxy
Charles ist ein interaktiver HTTP/HTTPS-Proxy, welcher die bequeme Aufzeichnung und Analyse von HTTP- und HTTPS-Traffic ermöglicht. Die Installation ist unter https://www.charlesproxy.com/documentation/installation/apt-repository/ beschrieben, im Wesentlichen wird ein Apt-Repository hinzugefügt und Charles daraus installiert:
#> wget -q -O - https://www.charlesproxy.com/packages/apt/PublicKey | sudo apt-key add - #> sudo sh -c 'echo deb https://www.charlesproxy.com/packages/apt/ charles-proxy main > /etc/apt/sources.list.d/charles.list' #> sudo apt-get update #> sudo apt-get install charles-proxy
Nachdem der Charles gestartet wurde, läuft ein lokaler Proxy auf Port 8888. Um auch SSL-Traffic zu überwachen, wird unter Proxy -> SSL Proxying Settings eine Regel für den Host „*“, Port 443 hinzugefügt.
Anschließend kann die App so gestartet werden, dass alle Verbindungen über den Proxy laufen:
#> http_proxy=127.0.0.1:8888 https_proxy=127.0.0.1:8888 /opt/shashlik/bin/shashlik-run my.app MyApp
HTTP-Verbindungen werden jetzt in Charkes angezeigt. Für HTTPS-Verbindungen erzeugt Charles on-the-fly SSL-Zertifikate. Diese werden jedoch von kaum einer Anwendung akzeptiert (wenn doch, ist die Anwendung unsicher, auch das kommt vor). Daher muss dem Root-Zertifikat von Charles noch android-system-weit vertraut werden.
Das SSL-Root-Zertifikat des Charles-Proxy installieren
Um auch SSL-verschlüsselten Traffic analysieren zu können, muss der Android-Emulator dem SSL-Zertifikat des Charles-Proxy vertrauen. Dazu wird zunächst im Proxy über Help->SSL Proxying das Zetifikat nach /tmp/charles.crt gespeichert. Anschließend kann der Hash-Code des Zertifikates ermittelt werden:
#> openssl x509 -inform PEM -subject_hash_old -in /tmp/charles.pem | head -1 064ccb4a
Damit kann nun ein Android Zertifikat-File erzeugt werden. Dieses muss den Hash gefolgt von .0 als Dateinamen haben:
#> cat /tmp/charles.pem > /tmp/064ccb4a.0 #> openssl x509 -inform PEM -text -in /tmp/charles.pem -out /dev/null >> /tmp/064ccb4a.0
Um das Zetifikat im Emulator zu installieren, muss das „/system“-Dateisystem lokal gemountet werden. Der Emulator sollte dabei nicht laufen. Es empfiehlt sich, vorher eine Sicherungskopie der Datei zu erzeugen:
#> cd /opt/shashlik/android #> sudo cp -a system.img system.img.bak #> sudo mount system.img /mnt -o loop #> sudo cp /tmp/064ccb4a.0 /mnt/etc/security/cacerts/ #> sudo chown root.root /mnt/etc/security/cacerts/064ccb4a.0 #> sudo chmod 644 /mnt/etc/security/cacerts/064ccb4a.0 #> sudo umount /mnt
Wird nun die Anwendung gestartet, wird der über SSL abgewickelte Netzwerk-Verkehr ebenfalls im Proxy korrekt angezeigt.