Vraag Door mensen leesbaar formaat voor http-headers met tcpdump


Ik zou graag de HTTP-headers zien die werden verzonden van Apache (luisterend op poort 80) naar Tomcat (op poort 4080) op een Linux-machine.

Volgens Wikipedia,

Koptekstvelden zijn door colon gescheiden naam / waarde-paren in een tekenreeks met duidelijke tekst.

Ik heb enkele variaties op het volgende geprobeerd tcpdump commando:

$ sudo tcpdump -lnX dst port 4080 -c 10

11:29:28.605894 IP SOME_IP.33273 > SOME_IP.4080: P 0:49(49) ack 1 win 23 <nop,nop,timestamp 1191760962 509391143>
    0x0000:  4500 0065 3a9f 4000 3f06 0084 628a 9ec4  E..e:.@.?...b...
    0x0010:  628a 9c97 81f9 0ff0 9e87 eee0 144b 90e1  b............K..
    0x0020:  8018 0017 fb43 0000 0101 080a 4708 d442  .....C......G..B
    0x0030:  1e5c b127 4845 4144 202f 6461 7070 6572  .\.'HEAD./dapper
    0x0040:  5f73 6572 7669 6e67 2f41 644d 6f6e 6b65  _serving/AdMonke
    0x0050:  793f                                     y?

Het resultaat was altijd hetzelfde - een vreemde mix van wartaal en Engelse woorden (bijv. HEAD).

Hoe kan ik de headers bekijken in een voor mensen leesbaar formaat?


55
2018-05-02 11:41


oorsprong


Tcpdump toont het volledige pakket. Dit omvat de IP- en TCP-headers. AFAIK, je kunt niet alleen de TCP-payload weergeven. - Zoredache


antwoorden:


Hier is een one-liner die ik bedacht voor het weergeven van HTTP-headers die gebruikmaken van request en response tcpdump (wat ook voor uw geval zou moeten werken):

sudo tcpdump -A -s 10240 'tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | egrep --line-buffered "^........(GET |HTTP\/|POST |HEAD )|^[A-Za-z0-9-]+: " | sed -r 's/^........(GET |HTTP\/|POST |HEAD )/\n\1/g'

Het beperkt het pakket om 10KB en kent alleen GET-, POST- en HEAD-commando's, maar dat zou in de meeste gevallen genoeg moeten zijn.

BEWERK: aangepast om bij elke stap van de buffers af te komen om deze responsiever te maken. Heeft echter nu Perl en stdbuf nodig, dus gebruik de originele versie als je die niet hebt: BEWERK: Gewijzigde scriptpoortdoelen van 80 naar 4080, om daadwerkelijk te luisteren naar verkeer dat al door apache is gegaan, in plaats van direct buiten verkeer dat aankomt bij poort 80:

sudo stdbuf -oL -eL /usr/sbin/tcpdump -A -s 10240 "tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)" | egrep -a --line-buffered ".+(GET |HTTP\/|POST )|^[A-Za-z0-9-]+: " | perl -nle 'BEGIN{$|=1} { s/.*?(GET |HTTP\/[0-9.]* |POST )/\n$1/g; print }'

Enkele verklaringen:

  • sudo stdbuf -oL-nl  maakt tcpdump run-line-gebufferd
  • het magic-filter tcpdump wordt hier in detail uitgelegd: https://stackoverflow.com/questions/11757477/understanding-tcpdump-filter-bit-masking
  • grep zoekt naar lijnen met GET, HTTP / of POST; of alle regels die op een koptekst lijken (letters en cijfers gevolgd door dubbele punt)
  • BEGIN {$ | = 1} zorgt ervoor dat perl regelbuffer wordt uitgevoerd
  • s /.*? (GET | HTTP / [0-9.] * | POST) / \ n $ 1 / g voegt een nieuwe regel toe vóór het begin van elke nieuwe aanvraag of reactie

79
2017-10-03 22:37



Werkt goed. Kunt u meer details toevoegen over hoe de expressie tcpdump werkt? - Vivek Thomas
het 'ip'-gedeelte in parens wordt hier uitgelegd, bijvoorbeeld: stackoverflow.com/questions/11757477/... - Kibber
Je hebt me zo veel hoofdpijn bespaard. Jammer dat ik alleen +1 kan. - Aaron Dobbing


Je kunt door gebruik iets krijgen dat dicht bij je is -Ab.v.

E....c@.@...
.....Ng.d.P..Ch.).....s.......
.A...u.BHEAD / HTTP/1.1
User-Agent: curl/7.29.0
Host: www.google.com
Accept: */*

Vergeet niet om te gebruiken -s 0 om ervoor te zorgen dat je het hele pakket krijgt.

Als alternatief zou je kunnen gebruiken wireshark om de headers interactief te bekijken.


15
2018-05-02 11:48



beproefd -A en -s 0, kreeg dezelfde output. - Adam Matan
Probeer zonder -X. - Flup
tcpdump -s 0 -A dst port 4080 geeft E..e..@.?.$bb...b....:......w........Q.....G..1.b..HEAD /dapper_serving/AdMonkey?ping=1 HTTP/1.0. - Adam Matan
... wat in de buurt komt van wat je wilt. Lezen van 'HEAD' - dit is de HTTP-payload. Als je het zeker hebt gebruikt -s 0 en er is niets meer aan de hand HTTP/1.0, er zijn geen HTTP-headers in het verzoek. - Flup
bedankt. Is er een manier om alleen de tekstkoppen te printen, zonder de binaire payload? - Adam Matan


Probeer te gebruiken http://justniffer.sourceforge.net/  Het is een betere tool of Wireshark met "Follow TCP Flow" optie, er zijn gewoon veel betere opties dan tcpdump om headers te zien (verzoeken / antwoorden)


-1
2018-05-02 11:51



Voeg misschien ook een voorbeeld toe van hoe dit werkt - vikas027
Misschien kun je een mannenpagina lezen? justniffer.sourceforge.net/#!/man_page - Danila Ladner