Gibt es ein einfaches Kommandozeilen-Tool zum Paket-Sniffing eines einzelnen Befehls unter Linux?


11

Ich würde es lieben, wenn es ein einziges Befehlszeilentool zum Paket-Sniffing eines einzelnen Befehls unter Linux gäbe. So etwas wie sniff dumpfile command, dass Sie einfach den Befehl ausführen können, den Sie im Terminal paketieren möchten, und einen Speicherauszug der Pakete an einer anderen Stelle erhalten möchten.

Ich möchte nur den Netzwerkverkehr des einzelnen Befehls, den ich eingebe, sichern / speichern / sehen, nicht den gesamten TCP-Verkehr auf meiner einzelnen Netzwerkschnittstelle. Wenn ich also an meinem Computer angemeldet war und IRC im Hintergrund ausgeführt wurde und ich dies tat sniff somefile wget http://www.google.com, möchte ich den gesamten Netzwerkverkehr sehen, den der Befehl wget zum Herunterladen von http://www.google.com ausgeführt hat . Ich möchte nicht, dass 'somefile' den IRC-Netzwerkverkehr verwirrt.

Es gibt viele Linux / Unix-Befehle, die einen anderen Befehl akzeptieren und etwas anderes tun. Ändern Sie von sudo(als Superuser ausführen) nicedie nette Stufe trickle(begrenzen Sie die Bandbreite eines Befehls).


1
Was genau möchten Sie tun? Möchten Sie überprüfen, ob ein bestimmter Befehl ausgeführt wird? Möchten Sie den Netzwerkverkehr abhören? Weil die Verwendung des Ausdrucks "Paketschnüffeln eines Befehls" für mich überhaupt keinen Sinn macht ...
wzzrd

wzzrd, siehe erweiterte Frage
Rory

Antworten:


10

Es gibt keine, von denen ich weiß, aber theoretisch sollte es nicht schwer sein, etwas Ähnliches zu bekommen. Strace kann zum Abfangen von Netzwerksystemaufrufen verwendet werden.

# strace -f -e trace=network -s 10000 /usr/bin/command arguments

Dadurch erhalten Sie Informationen zu den Daten, die zwischen dem Kernel und dem Prozess gesendet werden. Die Ausgabe von strace ist nicht genau das, was Sie wollen. Strace verwendet jedoch den ptrace-Systemaufruf, um Systemaufrufe abzufangen. Es könnte möglich sein, ein Programm zu schreiben, um die Daten etwas nützlicher auszugeben.

Alternativ können Sie auch den nützlichen Socket abfangen, Syscalls binden und abhören. Möglicherweise kann ein kleines Programm geschrieben werden, das ptrace für diese Aufrufe und libpcap verwendet, um den Erfassungsfilter bei jedem Öffnen eines neuen Sockets dynamisch zu ändern.


Es wäre großartig, wenn es etwas ausgeben würde, das Wireshark lesen könnte.
Brad Gilbert

Beachten Sie, dass die oben beschriebene Strace für Solaris (und möglicherweise andere kommerzielle Einheiten) korrekt ist. Unter Linux ist strace ein Systemaufruf-Tracer, der in Betrieb und Ausgabe mit Solaris oder Tusc unter HP-UX vergleichbar ist.
James F

1
Ich habe Strace unter Linux beschrieben.
David Pashley

8

Tracedump

Tracedump ist ein IP-Paket-Sniffer für eine einzelne Anwendung, der alle TCP- und UDP-Pakete eines einzelnen Linux-Prozesses erfasst.

Download und Beschreibung hier: http://mutrics.iitis.pl/tracedump


1
Dies sollte jetzt die richtige Antwort sein.
h0tw1r3

4

Versuchen Sie es mit Wireshark - der Befehl lautet tshark

  • Mit tshark können Sie Filter für den von einer Schnittstelle erfassten Datenverkehr auswählen
  • Verwenden Sie andere Dienstprogramme wie das Debian lsof , um die Art der Kommunikation zu ermitteln, die von Ihrer interessierenden Anwendung ausgeführt wird.

Oder wollen Sie wirklich nur LSOF?


Ich glaube nicht, dass es ein Tool gibt, das die gesamte mit einem Prozess verbundene Kommunikation dynamisch filtert. Sie können jedoch versuchen, die Prozesskommunikation mit Tools wie zu verfolgen. lsofWenn Sie einen guten Filter haben, der die Kommunikation dieses Prozesses von allen anderen auf Ihrem System ausgeführten Datenverkehr isoliert, können Sie die richtige Erfassung erhalten.

Beispielsweise unterscheidet sich wgetdie Ziel-IP-Adresse normalerweise von anderem prozessbezogenem Datenverkehr. Selbst wenn Sie so etwas wie skypeden Zielportbereich nehmen, ist dieser normalerweise für eine Instanz festgelegt.


Dies ist ein bisschen wie das Unsicherheitsprinzip. Normalerweise können Sie wissen, was durch eine Reihe von Kommunikationspfaden geht (mit einer Sniffer-Filterung für identifizierte Gruppen von Flüssen) oder wo verschiedene Kommunikationsverbindungen hergestellt werden (mit lsof).

Ich würde wirklich gerne wissen, ob beides für eine Bewerbung möglich ist. Ich denke es sollte machbar sein. Aber ich habe noch kein Tool gesehen, das das macht.


lsof ist großartig, aber ich würde lieber sehen, was es tut / sendet / empfängt.
Rory

4

Erfahren Sie, wie Sie Filterausdrücke verwenden.

Dies führt zwar nicht zu den ausgefallenen Spuren, nach denen Sie fragen.

Damit können Sie fast alle "verwirrenden Dinge wie IRC" aus der Aufnahme entfernen.

Darüber hinaus ist es sehr nützlich, die Filtersyntax zu kennen, um in Zukunft schnell nachschlagen zu können.


2

Speziell für einen Webbrowser / eine Webseite enthält das Firebug-Plug-In für Firefox möglicherweise einige der gesuchten Informationen: http://getfirebug.com/net.html

Für allgemeinere Anwendungen müssen Sie möglicherweise netstat verwenden, um die von der Anwendung verwendeten Ports zu identifizieren, und dann Wireshark / tshark / dtrace mit einem Filter, um genau diesen Datenverkehr zu erfassen. Nicht die einzeilige Antwort, nach der Sie gesucht haben ...


1

Eine Idee, versuchen Sie VMWare

-setup a vm
-configure, dass vm eine bestimmte Schnittstelle verwenden
-sniff auf dieser Schnittstelle vom Host aus (es ist wie ein Mann in der Mitte Angriff)

Wenn Sie isolieren, welche Netzwerkanwendungen auf dieser VM ausgeführt werden, haben Sie möglicherweise Ihre Antwort

Ich nehme an, eine idealere Lösung besteht darin, das zu tun, was VMWare in Bezug darauf tut, wie es eine Schnittstelle für die Kommunikation auswählt. Ich denke, seine Magie kommt von den Kernelmodulen, die es verwendet, in diesem Fall wahrscheinlich vmnet Kernelmodul.

Meines Wissens wissen Anwendungen nicht, über welche Schnittstelle sie sprechen, und ich glaube, dass dies beabsichtigt ist. Sie sollten sich über solche Dinge keine Sorgen machen müssen.

Außerdem existiert
vielleicht schon ein Programm, ich weiß es nicht. Aber wenn einer geschrieben wurde, könnte man ihn (zum Beispiel) nettrace nennen und die Verwendung könnte so sein

Nettrace-Programmschnittstelle

Schnüffeln Sie dann an der verwendeten Schnittstelle und fügen Sie Ihrer realen Schnittstelle Routen hinzu (möglicherweise automatisch)


ja das wäre möglich Es wäre jedoch großartig, wenn es ein einfaches und schnelles Werkzeug dafür gäbe.
Rory

Vielleicht ist es Zeit für dieses einfache Werkzeug? Ich frage mich, ob es so schwierig wäre, wahrscheinlich könnte vmnet mod ein guter Ausgangspunkt sein (obwohl ich nicht weiß, ob es Lizenzprobleme geben würde). Vielleicht (ein Hack) benutze einfach vmnet mod. Ich weiß, dass ich mich oft für solche Fragen interessiere.
Rev.

1

Angenommen, Sie sind die einzige Person auf der Box, die zu diesem Zeitpunkt versucht, eine Verbindung zu Google herzustellen, würde ich denken, dass so etwas den Trick machen sollte:

tcpdump -w <outfile> -i <interface> tcp dst host www.google.com and dst port 80

Wenn Sie nicht die einzige Verbindung sind, die versucht, eine Verbindung zu Google auf der Box herzustellen, können Sie auch den src-Port / die src-IP angeben, wenn Sie die IP / den Port identifizieren, von dem aus Sie eine Verbindung herstellen.

Das Identifizieren des src-Ports kann ein Problem sein, es sei denn, Sie können ihn auf dem von Ihnen verwendeten Client angeben. Ich bin mir nicht sicher, ob du mit wget kannst.

Ich vermute sehr, dass Sie sowohl src- als auch dst-Ports mit angeben können. netcatWenn es also wirklich Google war, an dem Sie interessiert waren, können Sie Ihr GET (manuell) über netcat durchführen.

Natürlich gibt Ihnen die Manpage Einzelheiten


1

Die tcpdump-Manpage und viele Websites enthalten ausführliche Beispiele für Filter, und es gibt sogar einige Online-Repositorys für tcpdump-Filterausdrücke. Es sollte in der Lage sein, fast alles zu tun, wovon Sie träumen können, vorausgesetzt, Sie wissen etwas über den Netzwerkverkehr (Quelle, Ziel, Ports, Protokolle usw.), das über das Programm hinausgeht, das ihn generiert.

Wenn Sie an einem Server oder einer Headless-Box arbeiten, können Sie tcpdump jederzeit eine Dump-Datei schreiben lassen und diese dann in Wireshark auf Ihrer Workstation öffnen, um erweiterte Filterung und eine grafische Oberfläche zu erhalten.


Ähm, welcher Wechsel zum Befehl tcpdump würde ihn auf eine einzelne Anwendung beschränken, die den Datenverkehr generiert?
Milan Babuškov

1

Vielleicht macht dieses Skript mit den entsprechenden Änderungen am Befehl tshark das, was Sie wollen:

#!/bin/bash

# Start tshark in the background before we run the commsnd to be sniffed.
# Add more options to tshark, as appropriate to your command....
setsid tshark  -w dump -i eth0 tcp port 8080 >/dev/null 2>&1  &

sleep 2

wget www.google.com

# tshark keeps running if you don't kill it. 
# This kills all other tsharks that may be running.
pkill -9 tshark

Lesen Sie die Dump-Datei später:

tshark -r dump

Sie erfassen Port 8080, generieren jedoch Datenverkehr auf Port 80. Dies wird nicht ganz das tun, was Sie beabsichtigen.
James F

James: Mein Proxy stellt eine Verbindung zu 8080 her. So habe ich das Skript ausgeführt. Ich hätte es 80 für den Zweck dieses Beitrags ändern sollen.
Nicht jetzt

0

Dtrace sollte dies zulassen, obwohl ich nicht weiß, ob es noch ganz in Linux geschafft ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.