Escrito por

Artigo Evandro Wendt · Maio 20 3m read

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