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.