Übersicht
Pinned ist eine Android-Challenge der Schwierigkeit Easy auf HackTheBox. Die App speichert Login-Credentials und meldet sich automatisch an – das Passwort ist jedoch versteckt. Ziel ist es, die implementierte SSL Certificate Pinning-Schutzmaßnahme zu umgehen, um den Login-Request mit Burp Suite abzufangen und das Passwort im Klartext zu lesen.
Plattform: HackTheBox | Kategorie: Mobile | OS: Android | Schwierigkeit: Easy
Setup & erste Analyse
Das heruntergeladene Archiv enthält eine pinned.apk sowie eine README.txt.
Die README gibt direkt einen wichtigen Hinweis: Die App muss auf einem Emulator mit
API Level 29 oder niedriger (Android 10.0) installiert werden.
Das ist entscheidend – neuere Android-Versionen blockieren User-Zertifikate im System-Trust-Store
ohne Root-Rechte, was das Einrichten eines HTTPS-Proxys erschwert.
pinned.apk und README.txt mit dem Hinweis auf API Level 29.
Ich installiere die APK auf einem gerooteten Pixel-6-Emulator und starte die App.
Die Oberfläche zeigt ein Login-Formular mit bereits eingetragenem Benutzernamen bnavarro
und einem verdeckten Passwort. Ein Klick auf LOGIN zeigt „You are logged in." –
die App funktioniert, aber wir sehen das Passwort nicht.
Das Problem: SSL Certificate Pinning blockiert Burp Suite
Ich konfiguriere den Emulator so, dass er Burp Suite als Proxy nutzt, und versuche den Login-Request abzufangen. Im Burp-Event-Log erscheint sofort der entscheidende Fehler:
The client failed to negotiate a TLS connection to pinned.com:443:
(certificate_unknown) Received fatal alert: certificate_unknown
Die App verwendet Certificate Pinning – sie akzeptiert ausschließlich das eingebettete, vom Entwickler erwartete Zertifikat. Burps selbst-signiertes Proxy-Zertifikat wird abgelehnt, der Traffic landet nicht im HTTP-History-Tab.
Lösung: Frida SSL Pinning Bypass
Um das Certificate Pinning zur Laufzeit auszuhebeln, setze ich Frida ein – ein dynamisches Instrumentation-Framework, das es erlaubt, JavaScript-Hooks in laufende Android-Prozesse zu injizieren. Der Plan: Frida-Server auf dem Emulator starten, dann vom Host aus das Bypass-Script laden.
Schritt 1: Frida-Server auf dem Emulator starten
Ich pushe den passenden frida-server (für die Emulator-Architektur) via ADB nach
/data/local/tmp/ und starte ihn mit Root-Rechten:
adb shell
su
cd /data/local/tmp
ls
# frida-server
./frida-server
Schritt 2: Prozess-Identifier der App ermitteln
Mit frida-ps -Uia liste ich alle laufenden Prozesse auf dem verbundenen USB-Gerät auf.
Die Pinned-App ist schnell gefunden – ihr Package-Name lautet com.example.pinned.
frida-ps -Uia
frida-ps -Uia listet alle Prozesse – com.example.pinned mit PID 7990 gefunden.Schritt 3: Universal SSL Pinning Bypass Script
Auf Frida CodeShare findet sich das Script
„Universal Android SSL Pinning Bypass 2" von Mattia Vinci und Maurizio Agazzini.
Es hookt die Methode checkTrustedRecursive im
com.android.org.conscrypt.TrustManagerImpl und gibt statt einer Zertifikatsprüfung
immer eine leere (d.h. vertrauenswürdige) Liste zurück – womit jedes Zertifikat
akzeptiert wird, auch Burps selbst-signiertes.
TrustManagerImpl zur Laufzeit.Schritt 4: Bypass ausführen
Mit dem --codeshare-Flag lädt Frida das Script direkt aus der Cloud und injiziert es
beim Spawn der App. Der Parameter -U verbindet sich mit dem USB-Gerät (Emulator),
-f spawnt die App neu mit aktivem Hook:
frida --codeshare sowdust/universal-android-ssl-pinning-bypass-2 \
-f com.example.pinned -U
com.example.pinned mit aktivem Bypass-Hook.Flag
Mit aktivem Frida-Hook öffne ich die App im Emulator und klicke auf LOGIN. Diesmal landet der Request im Burp-HTTP-History-Tab. Im Request-Body ist das Passwort – und damit die Flag – im Klartext sichtbar:
POST /pinned.php HTTP/1.1
Host: pinned.com
Content-Type: application/x-www-form-urlencoded
uname=bnavarro&pass=HTB{trust_n0_1_n0t_3v3n_@_c3rt!}
Zusammenfassung & Lessons Learned
Certificate Pinning ist eine sinnvolle Schutzmaßnahme gegen Man-in-the-Middle-Angriffe, aber kein unüberwindliches Hindernis – vor allem nicht auf gerooteten Geräten. Frida ermöglicht es, Sicherheitsprüfungen zur Laufzeit zu umgehen, ohne die APK zu modifizieren oder neu zu signieren.
- Certificate Pinning verstehen: Die App verankert ein bestimmtes TLS-Zertifikat im Code. Jedes andere Zertifikat – auch ein vertrauenswürdiges CA-signiertes – wird abgelehnt. Das blockiert klassische Proxy-Ansätze zuverlässig.
- Frida als Bypass-Werkzeug: Dynamic Instrumentation erlaubt es, Java-Methoden
zur Laufzeit zu überschreiben. Der Hook auf
TrustManagerImpl.checkTrustedRecursivedeaktiviert die Zertifikatsprüfung vollständig, ohne die APK anfassen zu müssen. - API Level beachten: Der Hinweis im README auf API Level ≤ 29 ist kein Zufall – auf neueren Android-Versionen wäre der Angriffspfad komplexer. Im Pentest-Alltag lohnt es sich, immer die Ziel-Android-Version im Blick zu haben.
Certificate Pinning schützt vor passiven Proxys – Frida macht daraus ein dynamisches Problem, das zur Laufzeit lösbar ist. Trust no cert, not even your own.
Tools verwendet
- Frida 17.9.1 – Dynamic Instrumentation Framework
- Frida CodeShare – Universal Android SSL Pinning Bypass 2
- Burp Suite Community Edition – HTTP/HTTPS Proxy
- ADB – Android Debug Bridge
- Android Emulator (Pixel 6, API 29)