Skip to content

MASTG-TECH-0010: Monitoramento Básico de Rede/Captura de Pacotes

É possível farejar remotamente todo o tráfego Android em tempo real com tcpdump, netcat (nc) e Wireshark. Primeiro, certifique-se de ter a versão mais recente do Android tcpdump no seu telefone. Aqui estão as etapas de instalação:

adb root
adb remount
adb push /onde/você/colocou/tcpdump /system/xbin/tcpdump

Se a execução de adb root retornar o erro adbd cannot run as root in production builds, instale o tcpdump da seguinte forma:

adb push /onde/você/colocou/tcpdump /data/local/tmp/tcpdump
adb shell
su
mount -o rw,remount /system;
cp /data/local/tmp/tcpdump /system/xbin/
cd /system/xbin
chmod 755 tcpdump

Em determinadas versões de produção, você pode encontrar o erro mount: '/system' not in /proc/mounts.

Nesse caso, você pode substituir a linha acima $ mount -o rw,remount /system; por $ mount -o rw,remount /, conforme descrito nesta publicação do Stack Overflow.

Lembre-se: Para usar o tcpdump, você precisa de privilégios de root no telefone!

Execute tcpdump uma vez para verificar se funciona. Assim que alguns pacotes forem capturados, você pode parar o tcpdump pressionando CTRL+c.

$ tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes
04:54:06.590751 00:9e:1e:10:7f:69 (oui Unknown) > Broadcast, RRCP-0x23 reply
04:54:09.659658 00:9e:1e:10:7f:69 (oui Unknown) > Broadcast, RRCP-0x23 reply
04:54:10.579795 00:9e:1e:10:7f:69 (oui Unknown) > Broadcast, RRCP-0x23 reply
^C
3 packets captured
3 packets received by filter
0 packets dropped by kernel

Para farejar remotamente o tráfego de rede do telefone Android, primeiro execute tcpdump e direcione sua saída para netcat (nc):

tcpdump -i wlan0 -s0 -w - | nc -l -p 11111

O comando tcpdump acima envolve:

  • escutar na interface wlan0,
  • definir o tamanho (comprimento do snapshot) da captura em bytes para obter tudo (-s0), e
  • escrever em um arquivo (-w). Em vez de um nome de arquivo, passamos -, o que fará o tcpdump escrever para a saída padrão.

Usando o pipe (|), enviamos toda a saída do tcpdump para o netcat, que abre um listener na porta 11111. Normalmente você vai querer monitorar a interface wlan0. Se precisar de outra interface, liste as opções disponíveis com o comando $ ip addr.

Para acessar a porta 11111, você precisa encaminhar a porta para o seu computador host via adb.

adb forward tcp:11111 tcp:11111

O seguinte comando conecta você à porta encaminhada via netcat e redireciona para o Wireshark.

nc localhost 11111 | wireshark -k -S -i -

O Wireshark deve iniciar imediatamente (-k). Ele obtém todos os dados da entrada padrão (-i -) via netcat, que está conectado à porta encaminhada. Você deve ver todo o tráfego do telefone da interface wlan0.

Você pode exibir o tráfego capturado em formato legível por humanos com o Wireshark. Descubra quais protocolos são usados e se estão criptografados. Capturar todo o tráfego (TCP e UDP) é importante, então você deve executar todas as funções do aplicativo testado e analisá-lo.

Este pequeno truque permite que você identifique que tipo de protocolos são usados e para quais endpoints o aplicativo se comunica. A questão agora é: como posso testar os endpoints se o Burp não é capaz de mostrar o tráfego? Não há uma resposta fácil para isso, mas alguns plugins do Burp podem ajudar você a começar.

Firebase/Google Cloud Messaging (FCM/GCM)

O Firebase Cloud Messaging (FCM), sucessor do Google Cloud Messaging (GCM), é um serviço gratuito oferecido pelo Google que permite enviar mensagens entre um servidor de aplicação e aplicativos clientes. O servidor e o aplicativo cliente se comunicam via servidor de conexão FCM/GCM, que trata mensagens downstream e upstream.

Mensagens downstream (notificações push) são enviadas do servidor de aplicação para o aplicativo cliente; mensagens upstream são enviadas do aplicativo cliente para o servidor.

O FCM está disponível para Android, iOS e Chrome. Atualmente, o FCM fornece dois protocolos de servidor de conexão: HTTP e XMPP. Conforme descrito na documentação oficial, esses protocolos são implementados de forma diferente. O exemplo a seguir demonstra como interceptar ambos os protocolos.

Preparação do Ambiente de Teste

Você precisa configurar o iptables no seu telefone ou usar o bettercap para poder interceptar o tráfego.

O FCM pode usar XMPP ou HTTP para se comunicar com o backend do Google.

HTTP

O FCM usa as portas 5228, 5229 e 5230 para comunicação HTTP. Normalmente, apenas a porta 5228 é usada.

  • Configure o encaminhamento de porta local para as portas usadas pelo FCM. O exemplo a seguir se aplica ao macOS:
$ echo "
rdr pass inet proto tcp from any to any port 5228-> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 5229 -> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 5230 -> 127.0.0.1 port 8080
" | sudo pfctl -ef -
  • O proxy de interceptação deve escutar na porta especificada na regra de encaminhamento de porta acima (porta 8080).

XMPP

Para comunicação XMPP, o FCM usa portas 5235 (Produção) e 5236 (Teste).

  • Configure o encaminhamento de porta local para as portas usadas pelo FCM. O exemplo a seguir se aplica ao macOS:
$ echo "
rdr pass inet proto tcp from any to any port 5235-> 127.0.0.1 port 8080
rdr pass inet proto tcp from any to any port 5236 -> 127.0.0.1 port 8080
" | sudo pfctl -ef -

Interceptando as Requisições

O proxy de interceptação deve escutar na porta especificada na regra de encaminhamento de porta acima (porta 8080).

Inicie o aplicativo e acione uma função que use FCM. Você deve ver mensagens HTTP no seu proxy de interceptação.

Criptografia End-to-End para Notificações Push

Como uma camada adicional de segurança, as notificações push podem ser criptografadas usando Capillary. Capillary é uma biblioteca para simplificar o envio de mensagens push criptografadas end-to-end (E2E) de servidores de aplicação baseados em Java para clientes Android.