TL;DR – Para interceptar as conexões HTTPS:
- Instale o certificado do Web Proxy (Burp, Fiddler, Charles, etc) no Android
- “Decompile” o aplicativo com o apktool
- Edite o ManifestAndroid.xml e adicione (ou edite) a configuração de segurança de rede para permitir certificados instalados pelo usuário
- Recrie o aplicativo com os arquivos criados (ou editados) usando o apktool
- Assine o aplicativo e instale no sistema alvo
Até o Android 6.0 (API level 23), era bastante simples interceptar requisições seguras (HTTPS): bastava instalar um certificado “auto-assinado”, definir a máquina que intercepta as conexões como servidor proxy do Android e pronto! Porém desde o Android Nougat (Android 7.0 – API level 24), os aplicativos não confiam mais, por padrão, em certificados instalados pelo usuário! Nas palavras do próprio Google, em seu anúncio de 07 de julho de 2016:
“O Android Nougat mudou como as aplicações interagem com CAs de usuário (…). Por padrão, apps que almejam a API level 24 não irão – por design – honrar estas CAs [adicionadas pelo usuário] a não ser que o app queira explicitamente.”¹
Portanto, para ser possível interceptar as conexões seguras de um aplicativo com o Burp, Charles ou Fiddler, é necessário que o aplicativo aceite os certificados adicionados! De forma mais clara: é necessário que o desenvolvedor aceite explicitamente estes certificados e registre isso no código do aplicativo!
Permitindo explicitamente que um aplicativo use certificados inseguros
A documentação do Google diz que para alterar algum padrão da configuração de segurança de rede, é necessário criar um arquivo XML com as configurações novas desejadas e referenciar este arquivo no Manifest da aplicação. Os passos são estes:
- No “AndroidManifest.xml”, a tag “application” precisa ter o atributo android:networkSecurityConfig=”@xml/network_security_config”
- É necessário criar o arquivo “network_security_config.xml” em res/xml/
- Por fim, é necessário adicionar este conteúdo no arquivo recém-criado:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config> <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config>
Como alterar um aplicativo para permitir interceptação?
Para modificar um aplicativo que já existe, são necessários estes passos:
- Decompilá-lo com: apktool d -s app.apk
- No arquivo AndroidManifest.xml se deve verificar se a tag “application” tem o atributo android:networkSecurityConfig=”@xml/network_security_config”. Se não tiver, é necessário adicioná-lo
- Na pasta res/xml/, é necessário verificar se tem o existe o arquivo network_security_config.xml. Se não tiver, deve-se criá-lo.
- Este arquivo deve ter o seguinte código:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config> <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config>
- Recria-se o aplicativo com os arquivos editados com o comando: apktool b PastaApkDecompilado/ -o appEdited.apk
- Agora é necessário assinar o aplicativo. Primeiro se deve criar a chave com o comando: keytool -genkey -v -keystore minhachave.keystore -alias chave -keyalg RSA -keysize 2048 -validity 10000
- Agora se assina com o comando: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore minhachave.keystore appEdited.apk chave
Pronto. Basta instalá-lo no Android, adicionar o IP e porta onde o Web Debugger aguarda a conexão e rodar o aplicativo a ser auditado. A partir deste momento será possível ver todas as requisições que o aplicativo realiza.
Ainda não vejo as requisições! O que aconteceu?
Existem alguns aplicativos na qual esta técnica não funcionará. Aplicativos que definem explicitamente qual(is) certificado(s) deve(m) ser considerado(s) apto(s) para a comunicação (SSL Pinning), não serão afetados por essa edição. Neste caso, é necessário:
– Ou retirar a restrição de certificado do código “decompilado” e reconstruir o aplicativo;
– Ou usar o “Frida”
É isso, pessoal! Espero que esse artigo ajude vocês de alguma forma.
Abraços a todos
Muito bom!!!
Muito obrigado =D
Sensacional!!!
Fantástico!!!
Bom demais