Certificate Pinning unter neuem Android vermeiden

Vor Kurzem haben wir gezeigt, wie eine Analyse-Umgebung konstruiert wird, um Certificate Pinning in Android-Anwendungen zu umgehen. Der große Vorteil ist, dass man den Netzwerkverkehr überprüfen und leicht bestimmen kann, welche Daten durch das Netzwerk über ein sicheres Kommunikationsprotokoll übertragen werden.

Diesmal legen wir unser Hauptaugenmerk auf die Schritte, die es braucht, um Cydia Substrate und Android SSL TrustKiller zu installieren. Diese Programme können via SSL versendete Datenpakete analysieren.

Leider besitzen die Anwendungen auch den Nachteil, dass sie nur bis zur Android-Version 4.2.2 funktionieren. Deshalb fragten wir uns, wie man diesen Schutzmechanismus umgehen kann. Das folgende Tutorial wird es zeigen. Dafür benötigt man nur Xposed Framework und das „JustTrustMe“-Modul.

Schritt 1: Sample-Analyse

Es gibt unterschiedliche Methoden, um herauszufinden für welche Android-Version eine spezielle Anwendung entwickelt wurde. Der einfachste Weg führt zum Manifest. Dort kann der uses-sdk tag ausgelesen werden, um die notwendige API zu bestimmen.

Dieser tag beschreibt die minimale benötigte API-Version (minSdkVersion) und diejenige, (targetSdkVersion) für die eine App eigentlich entwickelt wurde.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >

    <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="23" />

    ...

</manifest>

Dennoch ist es möglich, dass dieser tag nicht in allen Anwendungen angegeben ist. Das trifft besonders auf Apps zu, die mit Tools wie apktool kompiliert wurden. Dafür müssen wir die Berechtigungen im Manifest überprüfen. Daraus kann man die benötigte API-Version auslesen. Zum Beispiel wurde die GET_ACCOUNTS PRIVILEGED Erlaubnis in API 23 hinzugefügt. Wenn diese Berechtigung also vorhanden ist, benötigen wir eine virtual machine (VM) für diese Android-Verison.

Letztendlich könnten wir auch nach sogenannten conditional elements Ausschau halten, welche den Arbeitsablauf aufteilen, wenn ein Set SDK vorhanden ist. Solche Flow-Controls können wie folgt aussehen:

if (Build.VERSION.SDK_INT < 17) {

// hacer algo

} else {

// hacer otra cosa

}

Diese Zeilen verraten uns, welche virtuelle Maschine wir einsetzen müssen, um diejenige Funktionalität hervorzurufen, die wir analysieren wollen.

Wenn wir eine .apk direkt vom Play Store installieren, gelangt man auch an brauchbare Informationen.

Android Version 4.1y

Schritt 2: Emulieren einer virtuellen Umgebung

Wir benutzen Genymotion als Virtualisierungs-Engine und kreieren eine höhere Android-Version als 4.2.2 Jelly Bean. Für dieses spezielle Beispiel verwenden wir API 23. Dafür braucht es aber einige zusätzliche Schritte der Konfiguration. Empfehlenswert ist diejenige API-Version zu benutzen, die eine zu analysieren Anwendung benötigt (siehe Schritt 1).

Wer noch keine Erfahrung mit Genymotion hat, kann sich einige Online-Tutorials dazu ansehen.

Genymotion Virtual Machine

Schritt 3: Root-Zugriffrechte erlangen

Um loszulegen, benötigen wir Root-Rechte. Abhängig von der API und dem benutzten Emulator, muss eventuell auch die virtual machine manuell gerootet werden. In unserem Fall betrifft das API 23 in Genymotion. Standardmäßig gibt es keine SuperUser-Implementierung.

Man kann jede superuser-Anwendung verwenden – wir benutzen die bekannte App SuperSU. Die .apk kann über unterschiedliche Ressourcen bezogen werden. Eine gängige Bezugsquelle ist xda-developers.

Nach dem Entpacken der benötigen Komponenten irgendwo im System werden diese in die VM kopiert und mit dem folgenden Script ausgeführt:

adb shell mount -o remount,rw /system

adb push <carpeta_SuperSU>/x86/su.pie /system/bin/su

adb shell chmod 0755 /system/bin/su

adb push <carpeta_SuperSU>/x86/su.pie /system/xbin/su

adb shell chmod 0755 /system/xbin/suadb shell su --installadb shell "su --daemon&"

adb shell setenforce 0

adb shell mount -o remount,ro /system

Nach dem Öffnen der SuperSU-App wird man gefragt, die neuste Version zu installieren und dann die VM neu zu starten. Dem ist einfach Folge leisten.

Nach dem Neustart sollten Root-Rechte vorhanden sein.

Schritt 4: Xposed Framework installieren

Xposed ist ein Framework, das Usern die Möglichkeit der Installation von zusätzlichen Modulen auf Android-Geräten gibt. Damit kann das Verhalten des Betriebssystems und von einzelnen Anwendungen beeinflusst werden.

Um diesen Prozess zu initiieren, benutzen wir GenyFlash. Damit flashen wir die neuste Version von Xposed für API 23 und x86 Architekturen. Danach wird folgendes Skript ausgeführt:

git clone https://github.com/rovo89/GenyFlash

cd GenyFlash && ./install.sh

adb push <carpeta_xposed>/xposed-v86-sdk23-x86.zip /sdcard/

adb shell flash-archive.sh /sdcard/xposed-v86-sdk23-x86.zip

Im Anschluss muss der Xposed Installer heruntergeladen und ausgeführt werden. Zugang zu der Datei erlangt man über die Xposed directory bei XDA-Developers. Um sie zu installieren, schieben wir die Datei mit der Maus in die VM. Die Anwendung erscheint nun im App-Menü.

Xposed Installer Android

Schritt 5: JustTrustMe installieren

JustTrustMe ist ein Modul, das unter Xposed arbeitet. Es ermöglicht uns den certificate authentication process im Sicherheitsprotokoll SSL zu umgehen und Traffic zu überwachen. Die neuste Version kann man hier beziehen.

Danach wird es wieder per drag & drop in die VM installiert.

Die Anwendung besitzt kein User Interface. Die Autorisierung erfolgt via Xposed in der Modul-Ebene durch das Anwählen der entsprechenden Checkbox. Um alle Änderung erfolgreich zu aktivieren, muss das System neugestartet werden.

JustTrustMe Modul für Xposed

Schritt 6: Proxy konfigurieren

Es gibt verschiedene Wege einen Proxy unter Android zu installieren. Zugleich stehen viele Tools zur Verfügung, die das erledigen können. In unserem Beispiel verwenden wir Burp Suite, aber auch andere Programm wie ZAP erledigen das zuverlässig.

Wir beginnen mit der Initialisierung von Burp Suite. Unter dem Reiter Proxy > Options wird mit Hilfe des Add-Buttons eine neue traffic interception configuration angelegt. Geöffnet wird ein neues Fenster, indem wir die IP und den Port unseres Proxys festlegen müssen. Normalerweise sind das die lokale IP und der bevorzugte Port.

Burp Suite Free Edition

Mit "OK" geht es weiter. Nun sollte man sichergehen, dass der listener, der uns interessiert, mit running markiert ist. Dann können wir uns um den Emulator kümmern. Wir fahren damit fort, die Genymotion Einstellungen zu modifizieren. Der Reiter network characteristics erlaubt uns, IP- und Port-Adresse (eben in Burp Suite festgelegt) einzugeben.

Emulator Einstellungen

Schritt 7: Installieren und Ausführen der Beispielanwendung

Nach all der Vorarbeit können wir nun endlich die Anwendung installieren, deren Traffic wir analysieren möchten. In unserem Fall ist das die Gmail-App. Wir testen, ob unsere emulierte Umgebung in der Lage ist, die Zertifizierungskontrollen der Plattform auszuhebeln. Nach den vorangegangenen Schritten werden wir jetzt den sonst geschützten Traffic sehen können.

Burp Suite Free Edition Projekt