
Proof-of-Concept-Exploit für eine TLS-Authentifizierungs-Umgehung bei Androids adbd Wireless Debugging, das eine EC/RSA-Schlüsseltyp-Fehlanpassung nutzt, um eine nicht authentifizierte Remote-Shell zu erlangen.
Haftungsausschluss: Dieser Proof of Concept (PoC) wird ausschließlich für Bildungszwecke und autorisierte Sicherheitsforschung bereitgestellt. Unbefugter Zugriff auf Computersysteme ist illegal. Stellen Sie stets sicher, dass Sie eine ausdrückliche Genehmigung haben, bevor Sie Tests gegen ein Gerät oder Netzwerk durchführen.
Android-Geräte verfügen über eine Funktion namens Wireless Debugging, die es Entwicklern ermöglicht, sich über Wi-Fi ohne USB-Kabel mit dem Gerät zu verbinden. Um diese Verbindung abzusichern, verwendet das Gerät TLS-Verschlüsselung und verlangt vom verbindenden Computer, seine Identität mittels eines kryptografischen Schlüssels nachzuweisen.
Wo liegt der Fehler?
Wenn ein Computer sich verbindet, prüft der Android-Daemon (adbd), ob der Schlüssel des Computers mit einem der zuvor autorisierten Schlüssel übereinstimmt. Dazu verwendet er eine eingebaute mathematische Funktion (EVP_PKEY_cmp), die eine von drei Zahlen zurückgibt:
1 bedeutet: „Die Schlüssel stimmen perfekt überein."0 bedeutet: „Die Schlüssel stimmen nicht überein."-1 bedeutet: „Fehler: Die Schlüssel sind völlig unterschiedliche Typen (z. B. Vergleich eines RSA-Schlüssels mit einem EC-Schlüssel)."Der Bug:
Der Programmierer schrieb eine einfache Prüfung: if (result) { grant_access(); }.
In der Programmierung gelten sowohl 1 als auch -1 als „Wahr". Wenn ein Angreifer daher absichtlich einen völlig anderen Schlüsseltyp sendet (etwa einen Elliptic-Curve-Schlüssel statt des erwarteten RSA-Schlüssels), gibt die Funktion -1 (einen Fehler) zurück. Der fehlerhafte Code sieht -1, nimmt an, es bedeute „Wahr", und gewährt trotzdem vollen Zugriff.
Das Ergebnis: Ein Angreifer im selben Wi-Fi-Netzwerk kann die Authentifizierung vollständig umgehen und eine Remote-Shell auf dem Gerät erlangen, ohne die ursprünglichen Pairing-Schlüssel zu benötigen und ohne dass der Benutzer eine Genehmigungsaufforderung sieht.
Damit dieser Exploit funktioniert, muss das Ziel-Android-Gerät zwei Bedingungen erfüllen:
Dieses Skript benötigt Python 3 und die Bibliothek cryptography, um die ephemeren Zertifikate spontan zu erzeugen.
Sie können die erforderliche Bibliothek entweder mit apt (unter Debian/Ubuntu/Kali) oder mit pip installieren:
Mit apt (empfohlen für Linux):
sudo apt update
sudo apt install python3-cryptography
Verwendung von pip (plattformübergreifend):
pip3 install cryptography
Im Gegensatz zum USB-Debugging weist Android für das kabellose Debugging jedes Mal, wenn das Gerät neu startet oder sich das Wi-Fi-Netzwerk ändert, einen zufälligen, hoch nummerierten Port zu.
Wenn Sie den aktuellen Port nicht kennen, können Sie ihn ganz einfach mit nmap scannen. Ports für kabelloses Debugging liegen typischerweise zwischen 30000 und 50000.
Führen Sie den folgenden Befehl aus und ersetzen Sie <hostname> durch die IP-Adresse Ihres Zielgeräts:
nmap -Pn -p T:30000-50000 <hostname>
So liest man die Ausgabe:
Suchen Sie nach einem Port, der als open angezeigt wird. Zum Beispiel:
PORT STATE SERVICE
41234/tcp open unknown
In diesem Beispiel ist 41234 der Port, den Sie im nächsten Schritt verwenden werden.
Sobald Sie den Ziel-Hostnamen/die Ziel-IP und den korrekten Port haben, können Sie den Exploit ausführen.
Um eine vollständig interaktive Remote-Shell zu öffnen (ähnlich wie SSH):
python3 adb_bypass.py <hostname> <port>
Beispiel:
python3 adb_bypass.py 192.168.1.50 41234
Sobald die Verbindung hergestellt ist, landen Sie in einer shell-Benutzereingabeaufforderung. Drücken Sie Ctrl+C, um sie zu verlassen.
Wenn Sie nur einen bestimmten Befehl ausführen und die Ausgabe sehen möchten, ohne eine interaktive Shell zu betreten, verwenden Sie das Flag --cmd:
python3 adb_bypass.py <hostname> <port> --cmd "id"
Um den zugrunde liegenden Netzwerkverkehr und die Handshake-Details zu Debugging- oder Forschungszwecken anzuzeigen, hängen Sie das Flag -v an:
python3 adb_bypass.py <hostname> <port> -v
CNXN- und STLS-Pakete aus, um sich auf ein TLS-Upgrade zu einigen.cryptography-Bibliothek erzeugt das Skript einen ephemeren EC-P-256-Privatschlüssel und ein selbstsigniertes X.509-Zertifikat im Speicher.EVP_PKEY_cmp gibt -1 zurück, die if (cmp)-Prüfung ergibt true, und das Gerät markiert die Verbindung als autorisiert.shell:-Stream unter Verwendung eines großen delayed_ack-Fensters, was zu einer nicht authentifizierten Remote-Shell führt.