Como inspecionar solicitações HTTP de saída de um único aplicativo?

58

Meu aplicativo está enviando solicitações HTTP para algum servidor e eu quero ver os dados reais que estão sendo enviados. Alguns detalhes que gostaria de ver:

  • Método de solicitação (GET / POST / PUT, etc.)
  • Tipo de conteúdo
  • Corpo

Qual é a melhor e mais simples maneira de conseguir isso?

    
por megas 07.02.2013 / 00:27

4 respostas

56

Bem, para todos os fãs do tcpdump =)

EXECUTE TODOS OS COMANDOS COMO RAIZ !!!

Obtenha root em um terminal com

sudo -i

Para capturar os pacotes RAW ...

sudo tcpdump -i any -w /tmp/http.log &

Isto irá capturar todos os pacotes brutos, em todas as portas, em todas as interfaces e gravá-los em um arquivo, /tmp/http.log .

Execute seu aplicativo. Obviamente, ajuda se você não executar nenhum outro aplicativo que use HTTP (navegadores da web).

Mata tcpdump

killall tcpdump

Para ler o log, use o sinalizador -A e canalize a saída para less :

tcpdump -A -r /tmp/http.log | less

O sinalizador -A imprime a "carga útil" ou o texto ASCII nos pacotes. Isso enviará a saída para less , você pode paginar para cima e para baixo. Para sair de less , digite Q .

Quando vou ao Google, vejo (nos pacotes brutos):

20:42:38.179759 IP ufbt.local.56852 > sea09s02-in-f3.1e100.net.www: Flags [P.], seq 1:587, ack 1, win 913, options [nop,nop,TS val 25523484 ecr 492333202], length 586
[email protected]@..q......!#...P.(.gS.c..............u..Xh.GET /generate_204 HTTP/1.1
Host: clients1.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) rekonq Safari/534.34
Referer: http://www.google.com/
Accept: */*
Accept-Encoding: gzip, deflate, x-gzip, x-deflate
Accept-Charset: utf-8,*;q=0.5
Accept-Language: en-US, en-US; q=0.8, en; q=0.6
Cookie: PREF=ID=dd958d4544461998:FF=0:TM=1323842648:LM=1360205486:S=Fg_QCDsLMr4ZepIo; NID=67=OQJWjIDHG-B8r4EuM19F3g-nkaMcbvYwoY_CsOjzvYTOAxwqAos5kfzsk6Q14E70gIfJjHat8d8PuQIloB12BE-JuSHgsKHR2QSpgN12qSWoxeqhdcSQgzw5CHKtbR_a

tcpdump tem um longo conjunto de opções para refinar a coleta de dados, desde a especificação de interfaces de rede até portas para endereços IP de origem e de destino. Não pode descriptografar (por isso não funcionará com HTTPS).

Depois de saber em que você está interessado, você pode usar várias opções com tcpdump para registrar apenas os dados de interesse. A estratégia geral é primeiro registrar todos os pacotes, revisar os dados brutos e capturar apenas os pacotes de interesse.

Alguns sinalizadores úteis (opções):

-i Specify an interface
-i eth0

tcp port xx
tcp port 80

dst 1.2.3.4
specify a destination ip address

Há uma curva de aprendizado, tanto para usar tcpdump quanto para aprender a analisar os dados coletados. Para ler mais, sugiro tcpdump Primer com exemplos de Daniel Miessler .

    
por Panther 07.02.2013 / 05:37
15

Primeiro instale tcpflow dos repositórios oficiais do Ubuntu:

sudo apt-get install tcpflow

Em seguida, execute este comando para inspecionar todas as solicitações HTTP na porta padrão:

sudo tcpflow -p -c port 80
    
por Vanni Totaro 31.07.2015 / 12:47
12

Eu sugiro que você tente Wireshark

Por favor, note que o Wireshark é bastante avançado e, portanto, pode demorar um pouco para se acostumar. Eu não uso há alguns anos, mas ainda deve ser perfeito para o que você está procurando - se não um pouco cheio de recursos.

Informações sobre o Wireshark e como usá-lo podem ser encontradas na página inicial do Wireshark .

    
por CruzBishop 07.02.2013 / 00:34
1

Também posible com o comando, que fornece saída boa, mesmo para SSL:

sudo tcpdump dst port 80
    
por Gediminas 29.03.2018 / 10:30

Tags