
Preuve de concept d'exploit pour un contournement de l'authentification TLS du débogage sans fil adbd d'Android, exploitant une inadéquation de type de clé EC/RSA pour obtenir un shell distant non authentifié.
Avertissement : Cette preuve de concept (PoC) est fournie strictement à des fins éducatives et de recherche en sécurité autorisée. L'accès non autorisé à des systèmes informatiques est illégal. Assurez-vous toujours de disposer d'une autorisation explicite avant de tester sur un appareil ou un réseau.
Les appareils Android disposent d'une fonctionnalité appelée Débogage sans fil, qui permet aux développeurs de se connecter à l'appareil via Wi-Fi sans câble USB. Pour sécuriser cette connexion, l'appareil utilise le chiffrement TLS et exige que l'ordinateur qui se connecte prouve son identité à l'aide d'une clé cryptographique.
Où se situe la faille ?
Lorsqu'un ordinateur se connecte, le démon Android (adbd) vérifie si la clé de l'ordinateur correspond à l'une des clés précédemment autorisées. Il effectue cette vérification à l'aide d'une fonction mathématique intégrée (EVP_PKEY_cmp) qui renvoie l'un de trois nombres :
1 signifie : « Les clés correspondent parfaitement. »0 signifie : « Les clés ne correspondent pas. »-1 signifie : « Erreur : Les clés sont de types complètement différents (par exemple, comparaison d'une clé RSA avec une clé EC). »Le bug :
Le programmeur a écrit une vérification simple : if (result) { grant_access(); }.
En programmation, 1 et -1 sont tous deux considérés comme « Vrai ». Par conséquent, si un attaquant envoie intentionnellement un type de clé complètement différent (comme une clé à courbe elliptique au lieu de la clé RSA attendue), la fonction renvoie -1 (une erreur). Le code défectueux voit -1, suppose que cela signifie « Vrai », et accorde l'accès complet malgré tout.
Le résultat : Un attaquant présent sur le même réseau Wi-Fi peut contourner entièrement l'authentification et obtenir un shell distant sur l'appareil sans avoir besoin des clés d'appairage d'origine, et sans que l'utilisateur ne voie aucune demande d'approbation.
Pour que cet exploit fonctionne, l'appareil Android cible doit remplir deux conditions :
Ce script nécessite Python 3 et la bibliothèque cryptography pour générer les certificats éphémères à la volée.
Vous pouvez installer la bibliothèque requise à l'aide de apt (sur Debian/Ubuntu/Kali) ou de pip :
Avec apt (recommandé sous Linux) :
sudo apt update
sudo apt install python3-cryptography
Utilisation de pip (multiplateforme) :
pip3 install cryptography
Contrairement au débogage USB, Android attribue un port élevé aléatoire pour le débogage sans fil à chaque redémarrage de l'appareil ou changement de réseau Wi-Fi.
Si vous ne connaissez pas le port actuel, vous pouvez facilement le rechercher à l'aide de nmap. Les ports de débogage sans fil se situent généralement entre 30000 et 50000.
Exécutez la commande suivante, en remplaçant <hostname> par l'adresse IP de votre appareil cible :
nmap -Pn -p T:30000-50000 <hostname>
Comment lire la sortie :
Recherchez un port qui apparaît comme open. Par exemple :
PORT STATE SERVICE
41234/tcp open unknown
Dans cet exemple, 41234 est le port que vous utiliserez à l'étape suivante.
Une fois que vous disposez du nom d'hôte/IP cible et du port correct, vous pouvez exécuter l'exploit.
Pour ouvrir un shell distant entièrement interactif (similaire à SSH) :
python3 adb_bypass.py <hostname> <port>
Exemple :
python3 adb_bypass.py 192.168.1.50 41234
Une fois connecté, vous serez placé dans une invite de commande de l'utilisateur shell. Appuyez sur Ctrl+C pour quitter.
Si vous souhaitez simplement exécuter une commande spécifique et voir la sortie sans entrer dans un shell interactif, utilisez l'option --cmd :
python3 adb_bypass.py <hostname> <port> --cmd "id"
Pour voir le trafic réseau sous-jacent et les détails de la poignée de main à des fins de débogage ou de recherche, ajoutez l'option -v :
python3 adb_bypass.py <hostname> <port> -v
CNXN et STLS pour convenir d'une mise à niveau TLS.cryptography, le script génère en mémoire une clé privée EC P-256 éphémère et un certificat X.509 auto-signé.EVP_PKEY_cmp renvoie -1, la vérification if (cmp) s'évalue à vrai, et l'appareil marque la connexion comme autorisée.shell: en utilisant une grande fenêtre delayed_ack, ce qui aboutit à un shell distant non authentifié.