
Proof-of-concept di exploit per un bypass dell'autenticazione TLS del Wireless Debugging di adbd su Android, che sfrutta una discrepanza nel tipo di chiave EC/RSA per ottenere una shell remota non autenticata.
Disclaimer: Questa Proof of Concept (PoC) è fornita esclusivamente per scopi educativi e di ricerca sulla sicurezza autorizzata. L'accesso non autorizzato ai sistemi informatici è illegale. Assicurati sempre di avere il permesso esplicito prima di eseguire test su qualsiasi dispositivo o rete.
I dispositivi Android dispongono di una funzionalità chiamata Debug wireless, che consente agli sviluppatori di connettersi al dispositivo tramite Wi-Fi senza un cavo USB. Per mantenere sicura questa connessione, il dispositivo utilizza la crittografia TLS e richiede che il computer che si connette dimostri la propria identità tramite una chiave crittografica.
Dov'è il difetto?
Quando un computer si connette, il demone Android (adbd) verifica se la chiave del computer corrisponde a una delle chiavi precedentemente autorizzate. Lo fa utilizzando una funzione matematica integrata (EVP_PKEY_cmp) che restituisce uno di tre numeri:
1 significa: "Le chiavi corrispondono perfettamente."0 significa: "Le chiavi non corrispondono."-1 significa: "Errore: Le chiavi sono di tipi completamente diversi (ad esempio, confrontando una chiave RSA con una chiave EC)."Il bug:
Il programmatore ha scritto un semplice controllo: if (result) { grant_access(); }.
In programmazione, sia 1 che -1 sono considerati "True". Pertanto, se un attaccante invia intenzionalmente un tipo di chiave completamente diverso (ad esempio una chiave Elliptic Curve invece della chiave RSA prevista), la funzione restituisce -1 (un errore). Il codice difettoso vede -1, presume che significhi "True" e concede comunque l'accesso completo.
Il risultato: Un attaccante sulla stessa rete Wi-Fi può aggirare completamente l'autenticazione e ottenere una shell remota sul dispositivo senza bisogno delle chiavi di pairing originali e senza che l'utente veda alcuna richiesta di approvazione.
Perché questo exploit funzioni, il dispositivo Android di destinazione deve soddisfare due condizioni:
Questo script richiede Python 3 e la libreria cryptography per generare i certificati effimeri al volo.
Puoi installare la libreria richiesta usando apt (su Debian/Ubuntu/Kali) oppure pip:
Usando apt (consigliato per Linux):
sudo apt update
sudo apt install python3-cryptography
Utilizzo di pip (multipiattaforma):
pip3 install cryptography
A differenza del debug USB, Android assegna una porta casuale con numero elevato per il Debug Wireless ogni volta che il dispositivo si riavvia o la rete Wi-Fi cambia.
Se non conosci la porta corrente, puoi facilmente individuarla usando nmap. Le porte del debug wireless in genere rientrano nell'intervallo tra 30000 e 50000.
Esegui il seguente comando, sostituendo <hostname> con l'indirizzo IP del dispositivo di destinazione:
nmap -Pn -p T:30000-50000 <hostname>
Come leggere l'output:
Cerca una porta che risulti open. Ad esempio:
PORT STATE SERVICE
41234/tcp open unknown
In questo esempio, 41234 è la porta che utilizzerai nel passaggio successivo.
Una volta ottenuti il nome host/IP di destinazione e la porta corretta, puoi eseguire l'exploit.
Per aprire una shell remota interattiva completa (simile a SSH):
python3 adb_bypass.py <hostname> <port>
Esempio:
python3 adb_bypass.py 192.168.1.50 41234
Una volta connesso, verrai portato a un prompt utente shell. Premi Ctrl+C per uscire.
Se vuoi semplicemente eseguire un comando specifico e vedere l'output senza entrare in una shell interattiva, usa il flag --cmd:
python3 adb_bypass.py <hostname> <port> --cmd "id"
Per visualizzare il traffico di rete sottostante e i dettagli dell'handshake a scopo di debug o ricerca, aggiungere il flag -v:
python3 adb_bypass.py <hostname> <port> -v
CNXN e STLS per concordare un upgrade a TLS.cryptography, lo script genera in memoria una chiave privata EC P-256 effimera e un certificato X.509 autofirmato.EVP_PKEY_cmp restituisce -1, il controllo if (cmp) risulta vero e il dispositivo contrassegna la connessione come autorizzata.shell: usando un'ampia finestra delayed_ack, ottenendo una shell remota non autenticata.