Jak sprawdzić wychodzące żądania HTTP pojedynczej aplikacji?

70

Moja aplikacja wysyła żądania HTTP do jakiegoś serwera i chcę zobaczyć rzeczywiste dane, które wysyła. Niektóre szczegóły, które chciałbym zobaczyć:

  • Metoda żądania (GET / POST / PUT itp.)
  • Typ zawartości
  • Ciało

Jaki jest najlepszy i prosty sposób na osiągnięcie tego?

megas
źródło
„metoda żądania, rodzaj treści, treść itp.” Czy mówisz o inspekcji specyficznej dla HTTP? Czy to HTTPS (zabezpieczony) przez przypadek?
gertvdijk
Tak, masz rację, ale to nie jest wysyłanie przez przeglądarkę
megas
Przepraszamy, to tylko żądania HTTP
megas
3
Okej, więc w porządku. Czy to tylko jeden, czy mały zestaw serwerów, z którymi rozmawia? I żadne inne aplikacje nie rozmawiają z tymi serwerami? Jeśli oba tak, to wybrałbym odpowiedź na temat Wireshark. Dowiedz się, jak to działa. To nie jest takie trudne.
gertvdijk

Odpowiedzi:

71

Cóż, dla wszystkich fanów tcpdump =)

URUCHOM WSZYSTKIE TE POLECENIA JAKO ROOT !!!

Uzyskaj root w terminalu za pomocą

sudo -i

Aby przechwycić pakiety RAW ...

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

Będzie to uchwycić wszystkie surowe pakiety na wszystkich portach, na wszystkich interfejsach i zapisać je do pliku /tmp/http.log.

Uruchom aplikację. To oczywiście pomaga, jeśli nie uruchamiasz żadnych innych aplikacji korzystających z HTTP (przeglądarki internetowe).

Zabić tcpdump

killall tcpdump

Aby odczytać dziennik, użyj -Aflagi i potokuj dane wyjściowe do less:

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

Te -Aodciski flagę na „ładunek” lub tekst ASCII w pakietach. Spowoduje to wysłanie danych wyjściowych do less, możesz przewijać strony w górę iw dół. Aby wyjść less, wpisz Q.

Kiedy idę do Google, widzę (w pakietach raw):

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

tcpdumpma długi zestaw opcji, aby udoskonalić gromadzenie danych od określenia interfejsów sieciowych do portów do źródłowych i docelowych adresów IP. NIE może odszyfrować (więc nie będzie działać z HTTPS).

Gdy wiesz, czym jesteś zainteresowany, możesz użyć wielu opcji, tcpdumpaby zapisać tylko interesujące dane. Ogólna strategia polega na zapisaniu wszystkich pakietów, przejrzeniu nieprzetworzonych danych, a następnie przechwyceniu tylko interesujących pakietów.

Niektóre pomocne flagi (opcje):

-i Specify an interface
-i eth0

tcp port xx
tcp port 80

dst 1.2.3.4
specify a destination ip address

Istnieje krzywa uczenia się, zarówno w zakresie używania, jak tcpdumpi uczenia się, jak analizować gromadzone dane. Do dalszej lektury gorąco sugeruję Primer Daniela Miesslera tcpdumpz przykładami .

Pantera
źródło
1
nie przechwytuje to niczego na moim Ubuntu 14.04. Mój laptop łączy się z Internetem przez router Wi-Fi. Czy to wpłynęłoby na użycie tcpdump? Kiedy go zabiję, mówi tylko: 0 packets captured 0 packets received by filter 0 packets dropped by kernel Ale otworzyłem kilka stron w przeglądarce Chrome, gdy tcpdump monitorował.
faizal
1
ahh powiązany artykuł pomógł. tcpdump -i any -w /tmp/http.log &pracował
faizal
22

Pierwsza instalacja tcpflowz oficjalnych repozytoriów Ubuntu:

sudo apt-get install tcpflow

Następnie uruchom to polecenie, aby sprawdzić wszystkie żądania HTTP na standardowym porcie:

sudo tcpflow -p -c port 80
Vanni Totaro
źródło
1
i gdzie zobaczyć wyniki? Dziękuję Ci!
Gediminas
2
@Gediminas widać dane wyjściowe w terminalu. Pamiętaj, że ruch HTTPS nie jest wyświetlany. Spróbuj odwiedzić stronę HTTP, taką jak httpvshttps.com
Vanni Totaro
1
Znacznie wygodniejsze niż tcpdump, jeśli chcesz zobaczyć żądania i nie musisz zajmować się wszystkimi szczegółami TCP (syn, ack ...)
herm
13

Proponuję spróbować WiresharkZainstaluj Wireshark

Pamiętaj, że Wireshark jest dość zaawansowany, więc może trochę przyzwyczaić się. Nie używałem go od kilku lat, ale nadal powinien być idealny do tego, czego szukasz - jeśli nie jest zbyt pełen funkcji.

Informacje na temat Wireshark i sposobu korzystania z niego można znaleźć na stronie głównej Wireshark .

CruzBishop
źródło
1
To nie działa w przypadku pojedynczego procesu. Dostaniesz cały ruch na interfejsie i będziesz musiał filtrować go według adresu IP / protokołu itp. Wireshark - filtruj według procesu / pid
gertvdijk
tak, ale można to łatwo osiągnąć za pomocą interfejsu wireshark.
Panther
2
Próbowałem już wireshark i jest dla mnie zbyt zaawansowany, szukam innej opcji
megas
4
Inną opcją jest tcpdump. tcpdump to narzędzie wiersza poleceń, z łatwością wykona zadanie, ale ma bardziej stromą krzywą uczenia się. danielmiessler.com/study/tcpdump
Panther
1
@gertvdijk - jak sobie życzysz;) Zapraszam do dodania do podstaw
Panther
5

Możliwy również z poleceniem, które daje uporządkowane wyjście, nawet dla SSL:

sudo tcpdump dst port 80
Giedymina
źródło