MASTG-TECH-0109: Interceptando Tráfego HTTPS do Flutter
O Flutter é um kit de desenvolvimento de software (SDK) de interface de usuário (UI) de código aberto criado pelo Google. Ele é usado para criar aplicações compiladas nativamente para mobile, web e desktop a partir de uma única base de código. O Flutter usa Dart, que não é proxy-aware e utiliza seu próprio armazenamento de certificados. Um aplicativo móvel Flutter não utiliza a configuração de proxy do sistema e envia os dados diretamente para o servidor. As conexões são verificadas em relação aos certificados integrados, portanto, quaisquer certificados instalados no sistema são simplesmente ignorados. Isso torna impossível interceptar solicitações HTTPS por meio de uma configuração padrão de MiTM, uma vez que o certificado do proxy nunca é confiável.
Para interceptar o tráfego HTTPS de um aplicativo Flutter, precisamos lidar com dois desafios:
- Garantir que o tráfego seja enviado para o proxy.
- Desativar a verificação TLS em qualquer conexão HTTPS.
Geralmente, existem duas abordagens para isso: reFlutter e Frida para Android.
- reFlutter: Esta ferramenta cria uma versão modificada do módulo Flutter, que é então reempacotada no APK. Ela configura as bibliotecas internas para usar um proxy especificado e desativa a verificação TLS.
- Frida: O script disable-flutter-tls.js pode remover dinamicamente a verificação TLS sem a necessidade de reempacotamento. Como não modifica a configuração do proxy, etapas adicionais são necessárias (ex: ProxyDroid, DNS, iptables, ...).
Interceptando Tráfego usando reFlutter¶
-
Aplique um patch no aplicativo para habilitar a interceptação de tráfego.
Execute o comando para aplicar o patch no aplicativo e selecione a opção Traffic monitoring and interception e, em seguida, insira o IP da máquina na qual o proxy de interceptação está sendo executado.
$ reflutter demo.apk Choose an option: Traffic monitoring and interception Display absolute code offset for functions [1/2]? 1 Example: (192.168.1.154) etc. Please enter your BurpSuite IP: 192.168.29.216Isso criará um arquivo release.RE.apk na pasta de saída.
-
Assine o arquivo release.RE.apk modificado (ex: usando Assinador Uber para APK).
java -jar uber-apk-signer.jar -a release.RE.apk --out demo-signedIsso criará um arquivo release.RE-aligned-debugSigned.apk na pasta de saída.
-
Instale o aplicativo modificado e assinado no dispositivo móvel.
-
Configure o proxy de interceptação. Por exemplo, no Burp Suite:
-
Em Proxy -> Proxy settings -> Add new Proxy setting.
- Bind listening Port to
8083. - Select
Bind to addresstoAll interfaces. -
Request Handling -> support for invisible proxying.
-
Abra o aplicativo e comece a interceptar o tráfego.
Interceptando Tráfego usando ProxyDroid / iptables com Frida¶
Você pode configurar ProxyDroid ou criar regras de iptables para redirecionar solicitações HTTP para o Burp.
-
Se não estiver usando o ProxyDroid, execute os seguintes comandos no dispositivo Android com root para configurar o
iptablespara redirecionar as solicitações de entrada do aplicativo para Burp Suite:$ iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination <Your-Proxy-IP>:8080 $ iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination <Your-Proxy-IP>:8080 -
Configure o proxy de interceptação, como Burp Suite:
- Em Proxy -> Proxy settings -> Add new Proxy setting.
- Bind listening Port to
8080. - Select
Bind to addresstoAll interfaces. - Request Handling -> support for invisible proxying.
-
Execute o script Frida desabilitar-verificacao-TLS-flutter.
$ frida -U -f eu.nviso.flutterPinning -l disable-flutter-tls.js -
Use o aplicativo e você deverá conseguir interceptar o tráfego HTTP do aplicativo Flutter.
Explicações adicionais para esta configuração podem ser encontradas na postagem do blog da Nviso.