Como depurar comunicação HTTP (e também HTTPS)
Introdução
Se você já se perguntou como depurar algumas requisições que estão sendo feitas para ou a partir do IRIS, aqui vai um pequeno tutorial sobre como fazer isso.
Durante um projeto complexo, normalmente você recebe as especificações e implementa a comunicação entre o IRIS e outros sistemas com base nelas. Mas do papel para o mundo real geralmente existe uma grande diferença, e você precisa entender por que está recebendo um erro em um parâmetro, em um cabeçalho, por que não está recebendo os dados e assim por diante.
Se a conexão for uma conexão HTTP simples, não há problema: você sempre pode iniciar o tcpdump e capturar o tráfego. Mas e no caso de comunicação HTTPS?
E se você pudesse ter uma interface web limpa, algo que você inicia e o desenvolvedor pode acessar esse portal quando quiser?
Se você já passou por essa situação, uma solução pode ser facilmente feita com o mitmproxy (https://mitmproxy.org/).
Esse programa pode funcionar como um proxy (você pode configurá-lo no BO, por exemplo), um proxy transparente (o que eu gosto), proxy upstream (um proxy transparente que encaminha a conexão para outro proxy), ...
Setup
Para configurá-lo
- basta baixar o arquivo da página de download
- copiá-lo para o servidor com o IRIS (o mesmo servidor é mais fácil de configurar, mas também pode ser em outro servidor).
- Depois de copiado, extraia o arquivo em um diretório (eu geralmente chamo de mitm).
Inicie o MITMProxy
Também sugiro ter o tmux ou screen instalados e criar um script de inicialização, para que ele possa ser interrompido.
#!/bin/bash
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -w net.ipv4.conf.all.send_redirects=0
iptables -t nat -A OUTPUT -d THE_DESTINATION_IP -p tcp --dport 443 -j REDIRECT --to-port 46465
SSLKEYLOGFILE="$PWD/.mitmproxy/sslkeylogfile.txt" ./mitmweb --mode transparent --no-anticache --listen-port 46465 --web-host THE_SERVER_IP --web-port 46464 --ssl-insecure --server -w /tmp/`date +%Y%m%d_%H%M_mitmproxy.dump`
iptables -t nat -D OUTPUT -d THE_DESTINATION_IP -p tcp --dport 443 -j REDIRECT --to-port 46465
firewall-cmd --reload
sysctl -w net.ipv4.ip_forward=0
sysctl -w net.ipv6.conf.all.forwarding=0
sysctl -w net.ipv4.conf.all.send_redirects=1
Para iniciá-lo
- abra o tmux ou screen
- inicie o script
MITMProxy em execução
Agora você pode acessar a página web (ao iniciar o mitm ele fornecerá o link) e verificar todas as requisições capturadas no “sniffer”.
Você pode selecionar uma requisição específica, ver os cabeçalhos e o corpo, analisar a resposta e assim por diante.
Parar o MITMProxy
- Basta acessar a sessão do tmux ou screen
- interromper o script com Ctrl+C
Finalizando
Esta é uma ferramenta realmente poderosa, pode ser usada de muitas formas e é muito útil para ajudar na depuração de comunicação.
A documentação é muito bem escrita e pode ser encontrada no site: https://docs.mitmproxy.org/stable/
Ela me ajudou muito em diversas situações nos últimos 2 anos, então escrevi este artigo na esperança de ajudar outras pessoas com as mesmas necessidades.
FAQ
Esta ferramenta se chama MITM, que significa “Man In The Middle” (Homem no Meio). Isso é algo ruim?
Não... e sim. MITM é uma prática comum de cibersegurança que pode ser usada para coisas boas (como a explicada aqui), mas também para coisas muito ruins, então mantenha o uso seguro, em um ambiente de desenvolvimento. Estamos apenas arranhando a superfície do que essa ferramenta pode fazer, ela pode reescrever parcialmente ou totalmente a requisição/resposta e muitas outras coisas mais “sujas”.
Conexões SSL “não podem” ser interceptadas, mas estamos vendo isso nessa ferramenta. Como isso é possível?
O MITMProxy faz um “ataque” MITM (o quê?):
- sua conexão SSL começa a partir do IRIS
- vai para o MITM Proxy, que diz: “ei, eu sou o servidor de destino!”
- a conexão SSL é encerrada ali, e a requisição é descriptografada e exibida no MITMProxy
- o proxy se conecta ao servidor de destino dizendo: “ei, eu sou o servidor de origem”
- o proxy envia a requisição via HTTPS
Sim, se tudo estiver configurado corretamente com os certificados SSL, os resultados são incríveis