CTF Mobile Android HackTheBox 20. April 2026

HTB Mobile: Pinned – SSL Certificate Pinning Bypass mit Frida

Ü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

HTB Challenge-Seite für Pinned
HTB Challenge „Pinned" – Easy, VIP. Das Szenario beschreibt eine App mit gespeicherten Credentials und aktiver SSL-Absicherung.

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.

Terminal zeigt Inhalt des Pinned-Ordners mit pinned.apk und README.txt
Der entpackte Inhalt: 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.

App läuft auf Pixel 6 Emulator mit Login-Formular und Status You are logged in
Die App auf dem Pixel-6-Emulator – Benutzername sichtbar, Passwort maskiert. Login funktioniert automatisch.

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.

Burp Suite Event Log zeigt TLS-Fehler certificate_unknown
Burp Suite schlägt fehl – Certificate Pinning blockiert das Proxy-Zertifikat zuverlässig.

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
ADB Shell: frida-server wird in /data/local/tmp gestartet
Frida-Server läuft auf dem Emulator mit Root-Rechten – bereit für die Instrumentation vom Host.

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 zeigt alle laufenden Prozesse inklusive Pinned mit com.example.pinned
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.

Frida CodeShare zeigt Universal Android SSL Pinning Bypass 2 Script
Frida CodeShare – das „Universal Android SSL Pinning Bypass 2"-Script hookt 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
Frida startet und injiziert das SSL Bypass Script in com.example.pinned
Frida 17.9.1 verbindet sich mit dem Pixel 6 und spawnt 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!}
Burp Suite HTTP History zeigt POST-Request mit Flag im Klartext
SSL Pinning überwunden – Burp Suite fängt den POST-Request ab und zeigt die Flag im Klartext.
🚩
Flag
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.

  1. 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.
  2. Frida als Bypass-Werkzeug: Dynamic Instrumentation erlaubt es, Java-Methoden zur Laufzeit zu überschreiben. Der Hook auf TrustManagerImpl.checkTrustedRecursive deaktiviert die Zertifikatsprüfung vollständig, ohne die APK anfassen zu müssen.
  3. 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