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

70

Meu aplicativo está enviando solicitações HTTP para algum servidor e quero ver os dados reais que está enviando. Alguns detalhes que eu 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?

megas
fonte
"método de solicitação, tipo de conteúdo, corpo e etc." Você está falando sobre inspeção específica para HTTP? É HTTPS (protegido) por acaso?
gertvdijk
Sim, você está certo, mas não é o envio pelo navegador
Megas
Desculpe, são apenas solicitações HTTP
megas
3
Ok, tudo bem então. É apenas um ou um pequeno conjunto de servidores com os quais está falando? E nenhum outro aplicativo está falando com esses servidores? Se os dois sim, então a resposta sobre o Wireshark é o que eu procuraria. Aprenda como funciona. Não é tão difícil.
gertvdijk

Respostas:

71

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

EXECUTE TODOS ESTES COMANDOS COMO RAIZ !!!

Obtenha raiz em um terminal com

sudo -i

Para capturar os pacotes RAW ...

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

Isso 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 outros aplicativos que usam HTTP (navegadores da web).

Mate tcpdump

killall tcpdump

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

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

O -Asinalizador imprime a "carga útil" ou o texto ASCII nos pacotes. Isso enviará a saída para less, você pode subir e descer a página. Para sair 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
E..~.v@[email protected]......!#...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

tcpdumppossui um longo conjunto de opções para refinar a coleta de dados, especificando interfaces de rede para portas e endereços IP de origem e destino. NÃO pode descriptografar (para que não funcione com HTTPS).

Depois de saber em que está interessado, você poderá usar várias opções tcpdumppara registrar apenas os dados de seu 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 tcpdumpquanto para aprender a analisar os dados que você coleta. Para uma leitura mais aprofundada, sugiro o tcpdumpPrimer with Examples de Daniel Miessler .

Pantera
fonte
11
isso não captura nada no meu Ubuntu 14.04. Meu laptop se conecta à Internet através de um roteador wifi. Isso faria diferença no uso do tcpdump? Quando eu o mato, ele diz: 0 packets captured 0 packets received by filter 0 packets dropped by kernel Mas eu abri vários sites no navegador Chrome quando o tcpdump estava monitorando.
faizal
11
ahh o artigo vinculado ajudou. tcpdump -i any -w /tmp/http.log &trabalhou.
faizal
22

Primeira instalação a tcpflowpartir 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
Vanni Totaro
fonte
11
e onde ver os resultados? Obrigado!
Gediminas 28/03
2
@Gediminas, você pode ver a saída no terminal. Observe que o tráfego HTTPS não é mostrado. Tente visitar um HTTP como httpvshttps.com
Vanni Totaro
11
Muito mais conveniente que o tcpdump, se você está apenas interessado em ver as solicitações e não precisa lidar com todos os detalhes do TCP (syn, ack ...)
herm
13

Eu sugiro que você tente o WiresharkInstale o Wireshark

Observe que o Wireshark é bastante avançado e pode demorar um pouco para se acostumar. Eu não o uso há alguns anos, mas ainda deve ser perfeito para o que você procura - 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 .

CruzBishop
fonte
11
Isso não funciona para um único processo. Você vai receber todo o tráfego na interface e você vai ter que filtrá-la por IP / protocolo, etc. Wireshark - filtro por processo / pid
gertvdijk
sim, mas é facilmente realizado com a interface wireshark.
Pantera
2
Eu tentei wireshark antes e é muito avançado para mim, eu estou procurando uma outra opção
Megas
4
A outra opção é tcpdump. O tcpdump é uma ferramenta de linha de comando, fará o trabalho facilmente, mas possui uma curva de aprendizado mais acentuada. danielmiessler.com/study/tcpdump
Panther
11
@gertvdijk - como quiser;) Sinta-se livre para adicionar ao básico
Panther
5

Também possível com o comando, que fornece uma saída organizada, mesmo para SSL:

sudo tcpdump dst port 80
Gediminas
fonte