Kann ich tcpdump verwenden, um HTTP-Anforderungen, Antwortheader und Antworttext abzurufen?

78

Ich verwende tcpdump, um HTTP-Daten abzurufen, indem ich den folgenden Befehl ausführe:

sudo tcpdump -A -s 1492 dst port 80

Das Ergebnis des obigen Befehls:

  1. Header, ich denke Anfrage- und Antwortheader.
  2. Unlesbare Daten.
  3. Die URL GET /modules/mod_news_pro_gk1/cache/stories.ilbalad.ajayeb.strange-tractor.jpg.

Ich benötige ein klareres Ergebnis, z. B. lesbare Anfrage> Antwortheader> Antworttext usw. Wie kann ich meine Ergebnisse filtern?

Kimo
quelle
3
HTTP-Antworten können komprimiert oder aufgeteilt werden, und das Abrufen des Rohtextes kann möglicherweise nicht das tun, was Sie benötigen ("unlesbare Daten"). Sie müssen wahrscheinlich genauer erklären, was Sie tun möchten und was Ihre Umgebung zulässt (z. B. können Sie nicht einfach einen HTTP-Proxy wie Charles oder Fiddler verwenden)?
EricLaw
Wie bist du tcpdumpauf Android OS gelaufen ? Betten Sie den Befehl irgendwie in Ihre App ein oder führen Sie ihn auf einem PC aus, der mit dem Android-Telefon verbunden ist?
Faizal
1
@faizal - Sie sollten die tcpdump-Binärdatei auf dem Gerät installieren, dann können Sie sie vom Gerät selbst ausführen. Verwenden Sie diesen Link, um tcpdump auf einem Android-Gerät zu installieren: gadgetcat.wordpress.com/2011/09/11/tcpdump -on-android
Kimo

Antworten:

203

Es gibt tcpdump-Filter für HTTP GET & HTTP POST (oder für beide plus Nachrichtentext):

  • Führen man tcpdump | less -Ip examplesSie einige Beispiele aus

  • Hier ist ein tcpdump Filter für HTTP GET ( GET= 0x47, 0x45, 0x54, 0x20):

    sudo tcpdump -s 0 -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
    
  • Hier ist ein tcpdump Filter für HTTP POST ( POST= 0x50, 0x4f, 0x53, 0x54):

    sudo tcpdump -s 0 -A 'tcp dst port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
    
  • Überwachen Sie den HTTP-Verkehr einschließlich der Anforderungs- und Antwortheader und des Nachrichtentexts ( Quelle ):

    tcpdump -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
    tcpdump -X -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
    

Weitere Informationen zum Bit-Twiddling im TCP-Header finden Sie unter: String-Matching Capture Filter Generator (Link zur Erklärung von Sake Blok).

paulz
quelle
13
Ich wusste nicht less -Ip- was für eine Zeitersparnis
n611x007
11
Ich würde gerne eine Erklärung dieser tcpdump-Aufrufe sehen
tmc
1
Ist es möglich, einen Filter für HTTP GET und POST zusammen zu haben?
Jim Ho
4
Das ist Zauberei. Jemand erklärt bitte, wie es funktioniert.
SDKKS
34

Ich würde die Verwendung von Wireshark empfehlen , das über die Option "TCP-Stream folgen" verfügt, mit der die vollständigen Anforderungen und Antworten für eine bestimmte TCP-Verbindung sehr einfach angezeigt werden können. Wenn Sie lieber die Befehlszeile verwenden möchten , können Sie tcpflow ausprobieren , ein Tool zum Erfassen und Rekonstruieren des Inhalts von TCP-Streams.

Andere Optionen wären die Verwendung eines HTTP-Debugging-Proxys wie Charles oder Fiddler, wie EricLaw vorschlägt. Diese haben den Vorteil, dass sie HTTP speziell unterstützen, um die Verarbeitung verschiedener Arten von Codierungen zu vereinfachen, sowie andere Funktionen wie das Speichern von Anforderungen zur Wiedergabe oder das Bearbeiten von Anforderungen.

Sie können auch ein Tool wie Firebug (Firefox), Web Inspector (Safari, Chrome und andere WebKit-basierte Browser) oder Opera Dragonfly verwenden , die alle die Möglichkeit bieten, die Header und Textkörper für Anforderungen und Antworten anzuzeigen (obwohl die meisten davon) Mit ihnen können Sie nicht den genauen Byte-Stream sehen, sondern wie die Browser die Anforderungen analysiert haben.

Und schließlich kann man immer Anfragen konstruiert von Hand, so etwas wie telnet, netcat oder socat auf Port 80 und geben Sie den Wunsch manuell, oder ein Werkzeug wie eine Verbindung HTTY zu Hilfe einfach eine Anfrage konstruieren und die Antwort überprüfen.

Brian Campbell
quelle
2
Vielen Dank für Ihre Antwort Brain. Ich benutze tcpdump in Android OS :) daher bin ich durch die Verwendung von tcpdump eingeschränkt, sicher kann ich die Header und auch die Link-Anfrage bekommen, ich brauche auch den Körper, irgendeine Hilfe, irgendein Perl-Konvertierungsskript oder so etwas?
Kimo
11
@kimo In diesem Fall würde ich empfehlen tcpdump -w outfile ..., die Rohpakete in eine Datei zu kopieren, sie dann auf Ihren Computer zu kopieren und sie mit Wireshark zu analysieren. Wireshark kann einen Paketspeicherauszug öffnen, den TCP-Stream dekodieren und den HTTP-Inhalt dekomprimieren (ich gehe davon aus, dass der Grund dafür, dass er nicht lesbar ist, in der Komprimierung liegt).
Brian Campbell
Danke Brian, ich werde versuchen, diese Lösung zu implementieren. Trotzdem ist es besser, die Datei auf den PC zu verschieben, da ich die Daten filtern sollte, um die gewünschten Anforderungen zu erhalten, und es auf einem Android-System nicht einfach ist.
Kimo
Brian Ich denke, was wir hier sagen wollen, ist. Wie können wir das mit Busy Box tun? Ich habe die gleichen Einschränkungen auch auf Android-Geräten.
James
1
@JamesAndino Ja, auf einem Android-Gerät würde ich empfehlen, diese zu verwenden tcpdump -w outfileund dann auf einen Computer mit Wireshark zu kopieren und Wireshark zum Anzeigen des Speicherauszugs zu verwenden.
Brian Campbell
6

Hier ist eine andere Wahl: Chaosreader

Ich muss also eine Anwendung debuggen, die XML an eine Drittanbieteranwendung sendet. Ich habe ein brillantes kleines Perl-Skript gefunden, das die ganze harte Arbeit erledigt - Sie werfen es einfach in eine tcpdump-Ausgabedatei, und es erledigt alle Manipulationen und gibt alles aus, was Sie brauchen ...

Das Skript heißt Chaosreader0.94. Siehe http://www.darknet.org.uk/2007/11/chaosreader-trace-tcpudp-sessions-from-tcpdump/

Es hat wie ein Vergnügen funktioniert, ich habe folgendes getan:

tcpdump host www.blah.com -s 9000 -w outputfile; perl chaosreader0.94 outputfile
thinker007
quelle