Frage Vom Menschen lesbares Format für HTTP-Header mit tcpdump


Ich möchte die HTTP-Header sehen, die von Apache (Überwachung von Port 80) zu Tomcat (Port 4080) auf einem Linux-Rechner gesendet werden.

Gemäß Wikipedia,

Header-Felder sind Doppelpunkt-getrennte Name-Wert-Paare im Klartext-String-Format.

Ich habe einige Variationen des Folgenden ausprobiert tcpdump Befehl:

$ 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?

Das Ergebnis war immer das gleiche - eine seltsame Mischung aus Kauderwelsch und englischen Wörtern (z.B. HEAD).

Wie kann ich die Header in einem für Menschen lesbaren Format anzeigen?


55
2018-05-02 11:41


Ursprung


Tcpdump zeigt das gesamte Paket an. Dies umfasst die IP- und TCP-Header. AFAIK, Sie können nicht nur die TCP-Payload anzeigen. - Zoredache


Antworten:


Hier ist ein One-Liner, den ich für die Anzeige von Anfrage- und Antwort-HTTP-Headern mit verwendet habe tcpdump (was auch für Ihren Fall funktionieren sollte):

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'

Sie begrenzt das Paket bei 10Kb und kennt nur GET-, POST- und HEAD-Befehle, aber das sollte in den meisten Fällen ausreichen.

BEARBEITEN: Modifiziert, um die Puffer bei jedem Schritt loszuwerden, um sie reaktionsfähiger zu machen. Benötigt nun Perl und stdbuf, also benutze die Originalversion, wenn du diese nicht hast: BEARBEITEN: Skriptport-Ziele von 80 auf 4080 geändert, um tatsächlich auf Datenverkehr zu warten, der bereits durch Apache gegangen ist, anstatt direkten externen Datenverkehr, der an Port 80 ankommt:

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 }'

Einige Erklärungen:

  • sudo stdbuf -oL -eL  bewirkt, dass tcpdump liniengepuffert ausgeführt wird
  • Der tcpdump Magic Filter wird hier im Detail erklärt: https://stackoverflow.com/questions/11757477/understanding-tcpdump-filter-bit-masking
  • grep sucht nach allen Zeilen mit GET, HTTP / oder POST; oder irgendwelche Zeilen, die wie eine Kopfzeile aussehen (Buchstaben und Zahlen gefolgt von Doppelpunkt)
  • BEGIN {$ | = 1} bewirkt, dass perl linepuffered läuft
  • s /.*? (GET | HTTP / [0-9.] * | POST) / \ n $ 1 / g fügt vor jeder neuen Anfrage oder Antwort eine neue Zeile hinzu

79
2017-10-03 22:37



Funktioniert super. Könnten Sie bitte weitere Details zur Funktionsweise dieses tcpdump-Ausdrucks hinzufügen? - Vivek Thomas
Der 'ip' Teil in Parens wird hier erklärt, zum Beispiel: stackoverflow.com/questions/11757477/... - Kibber
Du hast mir gerade so viele Kopfschmerzen erspart. Schande, ich kann nur +1. - Aaron Dobbing


Sie können etwas erreichen, was Sie wollen, indem Sie es verwenden -A, z.B.

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

Denken Sie daran zu verwenden -s 0 um sicherzustellen, dass Sie das ganze Paket bekommen.

Alternativ könnten Sie verwenden wireshark um die Header interaktiv anzuzeigen.


15
2018-05-02 11:48



Versucht -A und -s 0, hat die gleiche Ausgabe. - Adam Matan
Versuche ohne -X. - Flup
tcpdump -s 0 -A dst port 4080 gibt E..e..@.?.$bb...b....:......w........Q.....G..1.b..HEAD /dapper_serving/AdMonkey?ping=1 HTTP/1.0. - Adam Matan
... was etwas ist, was du willst. Lesen Sie von "HEAD" - das ist die HTTP-Nutzlast. Wenn du es definitiv benutzt hast -s 0 und es gibt nichts danach HTTP/1.0, in der Anfrage gibt es keine HTTP-Header. - Flup
Vielen Dank. Gibt es eine Möglichkeit, nur die Textheader zu drucken, ohne die binäre Nutzlast? - Adam Matan


Versuchen zu benutzen http://justniffer.sourceforge.net/  Es ist besser Werkzeug oder Wireshark mit "Follow TCP Flow" -Option, es gibt nur viele bessere Optionen als tcpdump Header (Anfragen / Antworten) zu sehen


-1
2018-05-02 11:51



Vielleicht fügen Sie auch ein Beispiel hinzu, wie man das funktioniert - vikas027
Vielleicht kannst du eine Manpage lesen? justniffer.sourceforge.net/#!/man_page - Danila Ladner