2009-08-13 22:44:50 +0000 2009-08-13 22:44:50 +0000
82
82

Was ist der einfachste Weg, um TCP-Verkehrsdaten unter Linux zu schnüffeln?

Ich möchte eine einfache Möglichkeit, alle TCP-Daten (nicht die TCP-Header oder irgendetwas anderes) anzuzeigen, die über eine beliebige Schnittstelle auf meiner Linux-Box gehen.

Ich möchte zum Beispiel einen magischen Befehl, der, wenn ich:

magic_commmand_I_want port=1234

dann, wenn es einen Server gibt, der auf Port 1234 auf meinem Rechner lauscht, und jemand hat:

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a host/port

Dann würde der magische Befehl einfach ausdrucken:

hello

Ich habe “tcpdump”, “ethereal”, “tethereal”, “tshark” und andere ausprobiert, aber es ist nicht offensichtlich, wie man sie dazu bringt:

  • keine IP-Adressen oder andere Metadaten anzeigen
  • nur die “Daten” anzeigen, die gesendet werden, nicht einzelne Pakete und deren Header
  • die Daten so ausgeben, wie sie sind, nicht in Hex und nicht mit Paket-Offset-Markierungen
  • allen Netzwerkverkehr abhören (egal, ob er auf eth0 oder eth1 oder lo, etc. ..)

Ja, Sie könnten wahrscheinlich eine Reihe von Unix-Befehlen aneinanderreihen, um dies zu tun, aber das ist nicht sehr einfach, sich für das nächste Mal zu merken :)

Wenn Sie ein einfaches Beispiel für eine exakte Befehlszeile haben, die dies tut, würde mich das interessieren.

Antworten (7)

109
109
109
2009-08-14 17:05:54 +0000

Update:

Wie von Michal in den Kommentaren angemerkt: Ab tcpflow Version 1.3 wird die Option -e zur Angabe des Scannernamens verwendet. Dadurch wird der Fehler “Ungültiger Scannername ‘8983’” ausgegeben. Der korrekte Befehl lautet

sudo tcpflow -i any -C -J port 1234

(auch -J wurde in der neuesten Version zu -g geändert)


Danke an yves für den Hinweis auf tcpflow “. Hier ist die Kommandozeile:

tcpflow -i any -C -e port 1234 # as root, or with sudo

Das macht alles, was ich will

  • zeigt die Daten Byte für Byte an, so wie sie reinkommen
  • zeigt keine anderen Metadaten an
  • lauscht an allen Schnittstellen (also erfasst es Daten, die von innerhalb und außerhalb des Rechners kommen)

Das ”-C“ sagt ihm, dass er in die Konsole statt in eine Datei ausgeben soll. Das ”-e“ aktiviert Farben, so dass Client->Server und Server->Client visuell unterscheidbar sind.

Ich habe tcpflow installiert, indem ich einfach

sudo apt-get install tcpflow
``` eingegeben habe.
30
30
30
2009-08-13 22:48:27 +0000

socat ist das Tool, nach dem Sie fragen. Es kann als Proxy fungieren:

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

Dann muss sich Ihre Anwendung mit Port 4444 verbinden, statt direkt mit 1234

Die Option -v bewirkt, dass socat alles, was es empfängt, auf dem Standardfehler (stderr) ausgibt.

Update:

Wenn socat auf Ihrem Rechner nicht verfügbar ist, können Sie es trotzdem auf diese Weise mit netcat emulieren:

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

caveats: diese Option ist unidirektional. die zweite netcat-Instanz wird jede Antwort von Ihrem Server auf die Standardausgabe drucken. Das können Sie dann immer noch tun:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
20
20
20
2009-08-13 22:47:06 +0000

Versuchen Sie Wireshark . Es ist ein hervorragender Protokollanalysator, der sowohl für Linux als auch für Windows geeignet ist.

13
13
13
2009-08-14 15:04:28 +0000

tcpflow ist das, was Sie wollen. Auszug aus der Manpage:

BESCHREIBUNG tcpflow ist ein Programm, das Daten erfasst, die als Teil von TCP-Verbindungen (Flows) übertragen werden, und die Daten auf eine Weise speichert, die für die Protokollanalyse oder Fehlersuche geeignet ist. Ein Programm wie tcpdump(4) zeigt eine Zusammenfassung der Pakete, die auf der Leitung gesehen werden, speichert aber normalerweise nicht die Daten, die tatsächlich übertragen werden. Im Gegensatz dazu rekonstruiert tcpflow die tatsächlichen Datenströme und speichert jeden Fluss in einer separaten Datei für die spätere Analyse. tcpflow versteht die TCP-Sequenznummern und rekonstruiert die Datenströme korrekt, unabhängig von erneuten Übertragungen oder außerplanmäßiger Zustellung.

tcpflow speichert alle erfassten Daten in Dateien mit Namen der Form

192.168.101.102.02345-010.011.012.013.45103

wobei der Inhalt der obigen Datei die vom Host 192.168.101.102 Port 2345 an den Host 10.11.12.13 Port 45103 übertragenen Daten wäre.

Richten Sie eine Verbindung von Ihrer Anwendungs-App zu Ihrem Server ein. Wenn die Verbindung aufgebaut ist, kann tcpflow immer noch Daten von ihr erfassen Beispiel:

$ sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

Alle Daten werden in einer Datei namens 127.000.000.001.48842-127.000.000.001.05555 gespeichert.

Sie können dies noch mit der Option -Cs auf die Standardausgabe umleiten. Lesen Sie die Handbuchseite, um mit Expression zu spielen, um die Paquets, die tcpflow erfassen soll, einzustellen.

2
2
2
2009-08-13 23:15:48 +0000

ngrep ist dafür sehr gut geeignet. Es nimmt eine BPF-Zeichenkette und eine optionale Zeichenkette, nach der in den Paketen gesucht werden soll, und gibt dann den Paketinhalt in einem ziemlich nützlichen Format auf dem Bildschirm aus. Optional wird auch eine pcap_dump-Datei ausgegeben, die Sie später in Wireshark genauer untersuchen können.

0
0
0
2009-08-13 23:08:00 +0000

Werfen Sie einen Blick auf Chaosreader . Obwohl er ein bisschen mehr tut, als Sie verlangen, und etwas anders, könnten Sie wahrscheinlich den Code davon modifizieren, um das zu tun, was Sie wollen.

-1
-1
-1
2009-08-13 22:47:31 +0000

Vielleicht können Sie z.B. einen Wrapper für tcpdump schreiben, der alle redundanten Informationen entfernt