
Prova de conceito de exploit para um bypass de autenticação TLS do Android adbd Wireless Debugging, utilizando uma incompatibilidade de tipo de chave EC/RSA para obter um shell remoto não autenticado.
Aviso: Esta Prova de Conceito (PoC) é fornecida estritamente para fins educacionais e de pesquisa de segurança autorizada. O acesso não autorizado a sistemas de computador é ilegal. Certifique-se sempre de que possui permissão explícita antes de testar contra qualquer dispositivo ou rede.
Os dispositivos Android possuem um recurso chamado Wireless Debugging (Depuração Sem Fio), que permite aos desenvolvedores conectar-se ao dispositivo via Wi-Fi sem a necessidade de um cabo USB. Para manter essa conexão segura, o dispositivo utiliza criptografia TLS e exige que o computador que se conecta prove sua identidade usando uma chave criptográfica.
Onde está a falha?
Quando um computador se conecta, o daemon do Android (adbd) verifica se a chave do computador corresponde a alguma chave previamente autorizada. Ele faz isso usando uma função matemática interna (EVP_PKEY_cmp) que retorna um de três números:
1 significa: "As chaves correspondem perfeitamente."0 significa: "As chaves não correspondem."-1 significa: "Erro: As chaves são de tipos completamente diferentes (por exemplo, comparar uma chave RSA com uma chave EC)."O Bug:
O programador escreveu uma verificação simples: if (result) { grant_access(); }.
Em programação, tanto 1 quanto -1 são considerados "Verdadeiro". Portanto, se um atacante enviar intencionalmente um tipo completamente diferente de chave (como uma chave de Curva Elíptica em vez da chave RSA esperada), a função retorna -1 (um erro). O código com bug vê -1, assume que significa "Verdadeiro" e concede acesso total mesmo assim.
O Resultado: Um atacante na mesma rede Wi-Fi pode contornar completamente a autenticação e obter um shell remoto no dispositivo sem precisar das chaves de emparelhamento originais, e sem que o usuário veja qualquer solicitação de aprovação.
Para que este exploit funcione, o dispositivo Android alvo deve atender a duas condições:
Este script requer Python 3 e a biblioteca cryptography para gerar os certificados efêmeros em tempo real.
Você pode instalar a biblioteca necessária usando apt (no Debian/Ubuntu/Kali) ou pip:
Usando apt (Recomendado para Linux):
sudo apt update
sudo apt install python3-cryptography
Usando pip (multiplataforma):
pip3 install cryptography
Diferente da depuração USB, o Android atribui uma porta aleatória de número alto para a Depuração Sem Fio toda vez que o dispositivo reinicia ou a rede Wi-Fi muda.
Se você não sabe a porta atual, pode facilmente escaneá-la usando nmap. As portas de depuração sem fio normalmente ficam entre 30000 e 50000.
Execute o seguinte comando, substituindo <hostname> pelo endereço IP do seu dispositivo de destino:
nmap -Pn -p T:30000-50000 <hostname>
Como ler a saída:
Procure por uma porta que apareça como open. Por exemplo:
PORT STATE SERVICE
41234/tcp open unknown
Neste exemplo, 41234 é a porta que você usará na próxima etapa.
Depois de obter o hostname/IP de destino e a porta correta, você pode executar o exploit.
Para abrir um shell remoto interativo completo (semelhante ao SSH):
python3 adb_bypass.py <hostname> <port>
Exemplo:
python3 adb_bypass.py 192.168.1.50 41234
Uma vez conectado, você será levado a um prompt do usuário shell. Pressione Ctrl+C para sair.
Se você deseja apenas executar um comando específico e ver a saída sem entrar em um shell interativo, use a flag --cmd:
python3 adb_bypass.py <hostname> <port> --cmd "id"
Para ver o tráfego de rede subjacente e os detalhes do handshake para fins de depuração ou pesquisa, acrescente a flag -v:
python3 adb_bypass.py <hostname> <port> -v
CNXN e STLS para acordar uma atualização para TLS.cryptography, o script gera uma chave privada EC P-256 efêmera e um certificado X.509 autoassinado em memória.EVP_PKEY_cmp retorna -1, a verificação if (cmp) é avaliada como verdadeira, e o dispositivo marca a conexão como autorizada.shell: usando uma janela delayed_ack grande, resultando em um shell remoto não autenticado.