Monitorando o tráfego HTTP usando tcpdump

42

Para monitorar o tráfego HTTP entre um servidor e um servidor web, estou usando atualmente tcpdump. Isso funciona bem, mas eu gostaria de me livrar de alguns dados supérfluos na saída (eu sei sobre tcpflowe wireshark, mas eles não estão prontamente disponíveis no meu ambiente).

Na tcpdumppágina do manual:

Para imprimir todos os pacotes HTTP IPv4 de e para a porta 80, ou seja, imprima apenas pacotes que contenham dados, não, por exemplo, pacotes SYN e FIN e pacotes somente ACK.

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Este comando

sudo tcpdump -A 'src example.com e porta tcp 80 e (((ip [2: 2] - ((ip [0] & 0xf) << 2) << 2)) - ((tcp [12] & 0xf0) >> 2) )! = 0) '

fornece a seguinte saída:

19: 44: 03.529413 IP 192.0.32.10.http> 10.0.1.6.52369: Flags [P.], seq 918827135: 918827862, ack 351213824, win 4316, options [nop, nop, TS val 4093273405 ecr 869959372], comprimento 727

E ..... @ ....... .... P..6.0 ......... D ...... __ .. e = 3 ...__ HTTP / 1.1 200 OK Servidor: Apache / 2.2.3 (Red Hat) Tipo de conteúdo: text / html; charset = UTF-8 Data: sábado, 14 de novembro de 2009 18:35:22 GMT Idade: 7149
Comprimento do conteúdo: 438

<HTML> <HEAD> <TITLE> Exemplo de página da web </TITLE> </HEAD> <body>
<p> Você acessou esta página da web ... </p> </BODY> </HTML>

Isso é quase perfeito, exceto pela parte destacada. O que é isso, final - mais importante - como me livrar dele? Talvez seja apenas um pequeno ajuste na expressão no final do comando?

otto.poellath
fonte

Respostas:

39

O tcpdump imprime pacotes completos. "Lixo" que você vê são realmente cabeçalhos de pacotes TCP.

você certamente pode massagear a saída com um script perl, mas por que não usar tshark, a versão textual do wireshark?

tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

ele usa os mesmos argumentos que o tcpdump (mesma biblioteca), mas como é um analisador, ele pode fazer uma inspeção profunda de pacotes para que você possa refinar ainda mais seus filtros, ou seja,

tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -R'http.request.method == "GET" || http.request.method == "HEAD"'

Aleksandar Ivanisevic
fonte
1
Obrigado - depois de experimentar todas as sugestões, o tshark parece ser a melhor ferramenta para o trabalho. Atualmente, estou usando "tshark -d tcp.port == 8070, http -R 'http.request ou http.response'". Agora, se eu pudesse fazer com que o tshark "seguisse o fluxo tcp", como o wireshark pode (isso é muito solicitado, mas ainda não encontrei a resposta). "-V" exibe informações sobre os pacotes TCP e IP e assim por diante, das quais não estou interessado. Mas acho que posso remover isso usando um script.
Otto.poellath
4
Você também pode procurar por "GET" em um filtro de captura, combinando os valores ASCII para cada personagem: tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420. Eu adicionei uma página para o Wireshark web site um tempo atrás que ajuda a criar cordas filtros de captura correspondentes: wireshark.org/tools/string-cf.html
Gerald Combs
18

dê uma olhada no ngrep - ele pode ser útil para você.

como referência para outros httpry [o servidor parece estar inoperante agora, mas espero que seja temporário] e o tshark também sejam úteis para análise de protocolo passivo - primeiro apenas para http, segundo - por muito mais.

pQd
fonte
2
+1 para ngrep. Ferramenta muito útil
tylerl
ngrep e httpry parecem definitivamente úteis, mas ngrep não tem conhecimento do HTTP e do AFAIK, o activationpry funciona apenas com cabeçalhos HTTP e não pode exibir os dados da carga útil.
Otto.poellath
@sapporo - com certeza - o ngrep é independente de protocolo, mas você pode adicionar o filtro pcap "porta 80" e obter .. [na maioria dos casos] apenas o tráfego http.
PQD
Imo, ngrep é 100000x melhor do que tcpdump
Daniel W.
5

Experimente o enablepry ou justniffer

Justniffer funciona bem em pacotes tcp reordenando retrasmissions e fragmentação de ip

Mole24
fonte
1
Obrigado! justniffer é o que eu estava procurando (acho que é a única ferramenta mencionada que é muito simples e mede a duração da solicitação).
gkop
1

Eu sugeriria o uso de uma linha de comando tcpdump simplificada que armazena tudo em um arquivo pcap para pós-processo. Dependendo do que exatamente você está procurando no diagnóstico, o tcpflow funciona muito bem para reunir as comunicações de maneira coerente para análise.

Algumas outras informações boas, incluindo alguns usos para o enablepry, podem ser encontradas em: http://taosecurity.blogspot.com/2008/06/logging-web-traffic-with-httpry.html

ScottZ
fonte
0

O servidor da web que você está usando não produz logs? Certamente essa seria uma maneira muito melhor de monitorar o tráfego HTTP, há uma infinidade de ferramentas para analisar os dados e qualquer servidor Web competente deve produzir logs confiáveis.

JamesHannah
fonte
4
Claramente. Eu imagino que ele já pensou nisso, no entanto. Às vezes é útil para monitorar os dados reais que estão sendo enviados entre o ponto A eo ponto B.
tylerl
0

Existem várias ferramentas disponíveis no mercado, projetadas especialmente para monitorar o tráfego HTTP. Fiddler2 ( http://www.fiddler2.org ) e HTTP Debugger Pro são exemplos dessas ferramentas.


fonte
4
Obrigado por suas sugestões. Infelizmente, ambas as ferramentas parecem funcionar apenas no Windows. Eu não tinha mencionado, mas estou procurando algo que funcione no Linux.
Otto.poellath