Ataques, CTFs, Desafios de Reversing, Mobile

Alterando aplicativos Android para permitir interceptação de conexões HTTPS

Tempo de leitura: 2 minutos
TL;DR – Para interceptar as conexões HTTPS:
  1. Instale o certificado do Web Proxy (Burp, Fiddler, Charles, etc) no Android
  2. “Decompile” o aplicativo com o apktool
  3. Edite o ManifestAndroid.xml e adicione (ou edite) a configuração de segurança de rede para permitir certificados instalados pelo usuário
  4. Recrie o aplicativo com os arquivos criados (ou editados) usando o apktool
  5. 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:

  1. No “AndroidManifest.xml”, a tag “application” precisa ter o atributo android:networkSecurityConfig=”@xml/network_security_config”
  2. É necessário criar o arquivo “network_security_config.xml” em res/xml/
  3. 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:

  1. Decompilá-lo com: apktool d -s app.apk
  2. 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
  3. 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.
  4. 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

  1. https://android-developers.googleblog.com/2016/07/changes-to-trusted-certificate.html

2 Comments

Leave a Comment

O seu endereço de e-mail não será publicado.