Truques para inspecionar tráfego HTTP com tcpdump e filtros BPF

1. Fundamentos do tcpdump e BPF para HTTP

O tcpdump é uma ferramenta de linha de comando que captura e analisa pacotes de rede em tempo real. Sua potência reside nos filtros BPF (Berkeley Packet Filter), uma linguagem de expressão que permite selecionar pacotes com precisão cirúrgica. Para tráfego HTTP, entender a sintaxe básica é essencial:

tcpdump -i eth0 -n -s 0 -A 'tcp port 80'

O parâmetro -i define a interface, -n evita resolução DNS, -s 0 captura pacotes completos e -A exibe o payload em ASCII. Em interfaces loopback (lo), o tráfego é visto como se estivesse saindo e entrando no mesmo host, exigindo filtros como host 127.0.0.1.

2. Capturando tráfego HTTP bruto na porta 80

O filtro mais básico para HTTP é tcp port 80. Para inspecionar o payload:

tcpdump -i eth0 -A -s 0 'tcp port 80'

Para isolar pacotes com flags específicas (SYN, ACK, FIN) que indicam início e fim de sessões HTTP:

tcpdump -i eth0 'tcp port 80 and (tcp[tcpflags] & (tcp-syn|tcp-ack|tcp-fin) != 0)'

A opção -s 0 é crucial para evitar truncamento de pacotes grandes, como respostas HTTP com corpos extensos.

3. Filtrando requisições e respostas HTTP específicas

Filtros BPF permitem buscar strings no payload. Para capturar apenas requisições GET:

tcpdump -i eth0 -A -s 0 'tcp port 80 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x47455420)'

O 0x47455420 representa "GET " em hexadecimal. Para capturar respostas HTTP 200 OK:

tcpdump -i eth0 -A -s 0 'tcp port 80 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x48545450 and tcp[((tcp[12] & 0xf0) >> 2)+9:3] = 0x323030)'

Combinando filtros com operadores lógicos:

tcpdump -i eth0 -A -s 0 'tcp port 80 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x504f5354 or tcp[((tcp[12] & 0xf0) >> 2):3] = 0x505554)'

Isso captura requisições POST ou PUT.

4. Extraindo campos-chave do payload HTTP

Usando pipe com grep para extrair URLs e User-Agent:

tcpdump -i eth0 -A -s 0 'tcp port 80' | grep -E '(GET|POST|PUT) /|User-Agent:|Host:'

Para isolar cookies e cabeçalhos de autenticação:

tcpdump -i eth0 -A -s 0 'tcp port 80' | grep -E 'Cookie:|Authorization:|Content-Type:|Set-Cookie:'

Exibindo timestamps precisos e números de sequência TCP:

tcpdump -i eth0 -tttt -S -A -s 0 'tcp port 80'

O -tttt mostra data/hora completos, e -S exibe números de sequência absolutos.

5. Inspecionando tráfego HTTPS com limitações

Para tráfego HTTPS na porta 443, o tcpdump captura apenas pacotes criptografados. Para identificar handshakes TLS:

tcpdump -i eth0 -A -s 0 'tcp port 443 and (tcp[((tcp[12] & 0xf0) >> 2):1] = 0x16)'

O byte 0x16 indica um registro TLS Handshake. Para decodificar conteúdo, use ssldump com chaves privadas:

ssldump -r captura.pcap -k chave_privada.pem -d

Ou combine tcpdump com chaves do servidor:

tcpdump -i eth0 -w captura.pcap 'tcp port 443'
ssldump -r captura.pcap -k /etc/ssl/private/server.key

6. Simulando cenários de rede com tcpdump avançado

Capturando tráfego HTTP entre dois hosts específicos:

tcpdump -i eth0 -A -s 0 'tcp port 80 and host 192.168.1.100 and host 10.0.0.50'

Para tráfego HTTP com VLAN tags (ID 100):

tcpdump -i eth0 -A -s 0 'vlan 100 and tcp port 80'

Combinando tcpdump e iptables para log de pacotes descartados:

iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP_DROP: "
tcpdump -i eth0 -A -s 0 'tcp port 80 and ip[6:2] & 0x3fff != 0'

7. Automatizando análise com scripts e saída estruturada

Salvando capturas em arquivos pcap para análise posterior:

tcpdump -i eth0 -w captura_http.pcap -s 0 'tcp port 80'
tcpdump -r captura_http.pcap -A -s 0 'tcp port 80'

Script shell para monitoramento contínuo com notificações:

#!/bin/bash
tcpdump -i eth0 -l -A -s 0 'tcp port 80' | while read line; do
    if echo "$line" | grep -q "HTTP/1.1 500"; then
        echo "Erro 500 detectado em $(date)" >> http_errors.log
        notify-send "Alerta HTTP" "Erro 500 detectado"
    fi
done

Convertendo saída para JSON com tshark:

tcpdump -i eth0 -w captura.pcap -s 0 'tcp port 80'
tshark -r captura.pcap -T json -e http.request.uri -e http.response.code

8. Boas práticas e resolução de problemas comuns

Em interfaces de alta carga, use filtros restritivos para evitar perda de pacotes:

tcpdump -i eth0 -c 1000 -s 0 'tcp port 80 and host 192.168.1.1'

Para tráfego HTTP chunked, o payload pode vir fragmentado. Use:

tcpdump -i eth0 -A -s 0 'tcp port 80 and (tcp[((tcp[12] & 0xf0) >> 2):4] = 0x7472616e)'

Isso busca "tran" (início de "Transfer-Encoding: chunked").

Para debug de erros BPF, teste filtros com tcpdump -d:

tcpdump -d 'tcp port 80 and tcp[((tcp[12] & 0xf0) >> 2):4] = 0x47455420'

Permissões: execute como root ou conceda cap_net_raw:

sudo setcap cap_net_raw+ep /usr/sbin/tcpdump

Referências