Come controllare le richieste HTTP in uscita di una singola applicazione?


70

La mia applicazione sta inviando richieste HTTP ad alcuni server e voglio vedere i dati effettivi che sta inviando. Alcuni dettagli che vorrei vedere:

  • Metodo di richiesta (GET / POST / PUT, ecc.)
  • Tipo di contenuto
  • Corpo

Qual è il modo migliore e semplice per raggiungere questo obiettivo?


"metodo di richiesta, tipo di contenuto, corpo ecc." Stai parlando di ispezione specifica HTTP? È HTTPS (protetto) per caso?
gertvdijk,

Sì, hai ragione, ma non viene inviato dal browser
megas

Siamo spiacenti, sono solo richieste HTTP
megas

3
Va bene, allora va bene. È solo uno o un piccolo set di server con cui sta parlando? E nessun'altra applicazione sta parlando con quei server? Se entrambi sì, allora la risposta su Wireshark è ciò che vorrei. Scopri come funziona. Non è così difficile.
gertvdijk,

Risposte:


71

Bene, per tutti quei fan di tcpdump =)

ESEGUI TUTTI QUESTI COMANDI COME ROOT !!!

Ottenere radice in un terminale con

sudo -i

Per acquisire i pacchetti RAW ...

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

Ciò catturare tutti i pacchetti grezzi, su tutte le porte, su tutte le interfacce e scrivere in un file, /tmp/http.log.

Esegui la tua applicazione. È ovviamente utile se non si eseguono altre applicazioni che utilizzano HTTP (browser Web).

Uccidere tcpdump

killall tcpdump

Per leggere il registro, utilizzare il -Aflag e reindirizzare l'output per less:

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

Il -Aflag stampa il "payload" o il testo ASCII nei pacchetti. Questo invierà l'output a less, è possibile scorrere su e giù. Per uscire less, digitare Q.

Quando vado su Google, vedo (nei pacchetti non elaborati):

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@.@..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

tcpdumpha una lunga serie di opzioni per perfezionare la raccolta dei dati dalla specifica delle interfacce di rete alle porte agli indirizzi IP di origine e destinazione. NON può decrittografare (quindi non funzionerà con HTTPS).

Una volta che sai cosa ti interessa, puoi usare una serie di opzioni con tcpdumpper registrare solo i dati di interesse. La strategia generale consiste nel registrare prima tutti i pacchetti, rivedere i dati non elaborati e quindi acquisire solo i pacchetti di interesse.

Alcuni flag utili (opzioni):

-i Specify an interface
-i eth0

tcp port xx
tcp port 80

dst 1.2.3.4
specify a destination ip address

Esiste una curva di apprendimento, sia per l'utilizzo tcpdumpche per l'apprendimento di come analizzare i dati raccolti. Per ulteriori letture, consiglio vivamente tcpdumpPrimer con esempi di Daniel Miessler .


1
questo non cattura nulla sul mio Ubuntu 14.04. Il mio laptop si collega a Internet tramite un router wifi. Ciò farebbe la differenza nell'uso di tcpdump? Quando lo uccido, dice solo che 0 packets captured 0 packets received by filter 0 packets dropped by kernel ho aperto un sacco di siti nel browser Chrome mentre tcpdump stava monitorando.
faizal

1
ahh l'articolo collegato ha aiutato. tcpdump -i any -w /tmp/http.log &lavorato.
faizal

22

Prima installazione tcpflowdai repository ufficiali Ubuntu:

sudo apt-get install tcpflow

Quindi eseguire questo comando per ispezionare tutte le richieste HTTP sulla porta standard:

sudo tcpflow -p -c port 80

1
e dove vedere i risultati? Grazie!
Gediminas,

2
@Gediminas puoi vedere l'output nel terminale. Si noti che il traffico HTTPS non viene mostrato. Prova a visitare uno HTTP come httpvshttps.com
Vanni Totaro

1
Molto più conveniente di tcpdump se sei solo interessato a vedere le richieste e non devi occuparti di tutti i dettagli TCP (syn, ack ...)
herm

13

Suggerirei di provare WiresharkInstalla Wireshark

Si prega di notare che Wireshark è piuttosto avanzato e quindi potrebbe richiedere un po 'di tempo per abituarsi. Non lo uso da alcuni anni, ma dovrebbe comunque essere perfetto per quello che stai cercando, se non un po 'troppo pieno di funzionalità.

Informazioni su Wireshark e su come utilizzarlo sono disponibili nella homepage di Wireshark .


1
Questo non funziona per un singolo processo. Otterrai tutto il traffico sull'interfaccia e dovrai filtrarlo per IP / protocollo, ecc. WireShark - Filtra per processo / pid
Gertvdijk

sì, ma è facilmente realizzabile con l'interfaccia WireShark.
Pantera

2
Ho già provato WireShark ed è troppo avanzato per me, sto cercando un'altra opzione
megas

4
L'altra opzione è tcpdump. tcpdump è uno strumento da riga di comando, farà facilmente il lavoro, ma ha una curva di apprendimento più ripida. danielmiessler.com/study/tcpdump
Pantera

1
@gertvdijk - come desideri;) Sentiti libero di aggiungere alle basi
Pantera

5

Possibile anche con il comando, che fornisce un output ordinato, anche per SSL:

sudo tcpdump dst port 80
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.