tcpdump: wie bekomme ich eine grepable Ausgabe?


13

Ich versuche, ein Problem zu beheben, bei dem auf einer Appliance nur tcpdump verfügbar ist. Ich möchte tcpdump verwenden, um den Webdatenverkehr zu filtern und nur den Datenverkehr anzuzeigen, der bestimmte Zeichenfolgen enthält.

Ich mache folgendes:

tcpdump -nei eth0 -X | grep "something interesting"

Die Ausgabe ist ein Hexview mit 16 Bytes pro Zeile. Ich kann diese Daten nicht erfassen, da die Daten in mehreren Zeilen dargestellt werden.

Gibt es eine Möglichkeit für tcpdump, die erfassten Daten in einer einzelnen Zeile darzustellen? Dies würde es möglich machen, grep zu verwenden, um interessante Pakete zu finden.


1
Nun, ich kann dies momentan nicht testen, aber wenn Sie mehrere Zeilen haben, können Sie dies tun tr -d '\ n' oder grep -C 3, um einige Zeilen vor und nach
barlop am

@barlop, grep -C funktioniert, ist aber unzuverlässig, da ich nie weiß, wie viele Zeilen der Header enthalten wird und die Zeilen unter dem Treffer nicht angezeigt werden. Der Befehl tr setzt die gesamte Ausgabe auf 1 Zeile um, daher ist es etwas zu viel.
Hund essen Katzenwelt

Das Folgende wäre nicht grep, aber tcpdump kann Zeichenfolgen nach Hex abgleichen, was im Wesentlichen grep ohne Regex ist. Sie können einen Versatz angeben. Ich habe dies in einer Datei notiert (mit windump getan , aber ich das ist nur eine Windows - Version von tcpdump so nehmen tcpdump) tcpdump -nXr zfile "tcp [32: 4] = 0x47455420"
barlop

tcpdump -nei eth0 -X | grep --line-buffered "something interesting"wird aus unbekannten Gründen tun, meine gültige Arbeitsantwort wurde gelöscht.
Sjas

Verwandte Themen
Bain

Antworten:


11

Für diejenigen wie Sie, die dies nicht können ngrep, ist hier beschrieben, wie awkdie tcpdumpAusgabe von Paketinhalten grepable gemacht wird.

Zuerst einige Beispielausgaben von tcpdump -x, um die bevorstehende Aufgabe zu präsentieren:

$ tcpdump -xr dump.pcap 2>/dev/null
12:04:59.590664 IP 10.17.14.93.51009 > 239.194.1.9.51009: UDP, length 370
        0x0000:  4500 018e 0000 4000 fa11 7625 0a11 0e5d
        0x0010:  efc2 0109 c741 c741 017a 6f28 1120 2020
        0x0020:  3337 3030 3039 3031 3835 3635 3430 3130
...

Und dies ist das kopier- und einfügbare awkSkript, an das Sie die Ausgabe weiterleiten können

awk '{ if (match($0, /^[0-9]/, _)) { printf (NR == 1 ? "%s " : "\n%s "), $0; fflush() } else { sub(/^\s+0x[0-9a-z]+:\s+/, " "); gsub(" ", ""); printf "%s", $0 } } END { print ""; fflush() }'

Um die folgende, grepable Ausgabe zu erhalten

12:04:59.590664 IP 10.17.14.93.51009 > 239.194.1.9.51009: UDP, length 370 4500018e00004000fa1176250a...
12:04:59.590798 IP 10.17.14.113.51011 > 239.194.1.11.51011: UDP, length 370 4500018e00004000fa11760f...
...

Unten ist eine kommentierte Version des obigen Skripts:

awk '
{
    # if this is a header line
    if (match($0, /^[0-9]/, _)) 
    {
        # print the header, but:

        # except for the first line,
        # we need to insert a newline,
        # as the preceding data lines
        # have been stripped of theirs

        # we also append a space to
        # separate header info from the
        # data that will get appended
        printf (NR == 1 ? "%s " : "\n%s "), $0
        # enforce line-buffering
        fflush()
    }
    # otherwise it is a data line
    else 
    {
        # remove the data address
        sub(/^\s+0x[0-9a-z]+:\s+/, " ");
        # remove all spaces
        gsub(" ", "");
        # print w/o newline
        printf "%s", $0 
    }
}
END
{
    # print final newline, as
    # the preceding data lines
    # have been stripped of theirs
    print ""
    # enforce line-buffering
    fflush()
}'

2

Aus der tcpdumpManpage:

-A      Print each packet (minus its link level header) in ASCII.  Handy
        for capturing web pages.

Stellen Sie sicher, dass Sie auch die -s 0Option verwenden, um sicherzustellen, dass das gesamte Paket angezeigt wird.


Vielen Dank, aber die Daten werden weiterhin in Mehrfachzeilen dargestellt - überall dort, wo die Webseite Zeilenumbrüche enthält. Ich habe Probleme, den Header (und den Rest der Daten) mit der Grepped-Ausgabe zu verknüpfen.
Hund essen Katzenwelt

Mir ist gerade aufgefallen, warum das Tool awk ward heißt
Dog eat cat world

1

Vielleicht möchten Sie einen Blick auf ngrepBefehl werfen :

ngrep -W single -d eth0 'regex to match' 'port 80'

Wo:

  • -W single Gibt die Formatierung einzelner Zeilen an
  • regex to match bedeutet, dass nur Pakete ausgegeben werden, die eine bestimmte Zeichenfolge enthalten.
  • 'port 80' ist ein pcap-Filter, mit dem nur Pakete von oder nach Port 80 abgehört werden können

1
Würde gerne ngrep verwenden, aber es gibt kein solches Tool - es ist ein Gerät ...
Hund frisst Katzenwelt

ngrep ist großartig. Ich habe stundenlang gesucht, welcher Host HTTP-Datenverkehr zu meinem Host generiert. Mit einem einzigen sudo ngrep "GET .." Antwort in Minute gefunden.
Bartosz Bilicki

0

Der Grund, warum Ihre Ausgabe hex ist, ist das -XFlag. Versuchen:

tcpdump -ni eth1 | grep something_interesting

Sie erhalten eine lesbare Ausgabe direkt auf das CLI.


Ja, aber es wird nicht den Inhalt des Pakets enthalten.
RalfFriedl

0

Ich konnte das awk-Skript nicht dazu bringen, das zu tun, was ich wollte, und ngrep funktionierte auf einem Ethernet über USB nicht. Deshalb schrieb ich ein kleines C-Programm, um die von tcpdump ausgegebenen Zeilen zu verbinden, damit sie grepable sind. Es ist unter https://gitlab.com/dargaud/TcpDumpJoin

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.