tcpdump: come ottenere un output tangibile?


13

Sto cercando di risolvere un problema in cui ho solo tcpdump disponibile su un dispositivo. Voglio utilizzare tcpdump per filtrare il traffico Web e visualizzare solo il traffico contenente determinate stringhe.

Faccio quanto segue:

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

L'output è una hexview con una riga pr di 16 byte. Non posso grep questi dati, poiché i dati sono presentati su più righe.

C'è un modo per tcpdump di presentare i dati acquisiti su una sola riga? Ciò consentirebbe di utilizzare grep per trovare pacchetti interessanti.


1
bene, non posso provarlo adesso, ma se hai più righe potresti fare | tr -d '\ n' o grep -C 3 per ottenere alcune righe prima e dopo
— barlop

@barlop, grep -C funziona in qualche modo, ma inaffidabile, dato che non so mai quante righe ci saranno nell'intestazione e non vedrò le righe sotto la corrispondenza. Il comando tr trascina tutto l'output su 1 riga, quindi è un po 'troppo.
— cane mangia il mondo dei gatti il

Quanto segue non sarebbe grep, ma tcpdump può abbinare le stringhe per esadecimale che è essenzialmente grep senza alcuna regex. È possibile specificare un offset. L'ho annotato in un file (fatto con windump ma io sono solo una versione di Windows di tcpdump, quindi supponiamo tcpdump) tcpdump -nXr zfile "tcp [32: 4] = 0x47455420"
— barlop

tcpdump -nei eth0 -X | grep --line-buffered "something interesting"lo farò, per motivi indifferenti la mia valida risposta di lavoro è stata cancellata.
— sjas,

Risposte:


11

Per quelli come te che non possono usare ngrep, ecco come utilizzare awkper rendere tcpdumptangibile l' output del contenuto dei pacchetti.

Prima alcuni esempi di output forniti da tcpdump -x, al fine di presentare l'attività in anticipo:

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

E questo è lo script copia e incolla a awkcui puoi convogliare l'output

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

al fine di ottenere il seguente, tangibile output

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...
...

Di seguito è una versione commentata dello script sopra:

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

Dalla tcpdumpmanpage:

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

Assicurati di utilizzare anche l' -s 0opzione per assicurarti che l'intero pacchetto sia visualizzato.


Grazie, ma i dati sono ancora presentati su più righe, ovunque la pagina web contenga nuove righe. Ho problemi ad associare l'intestazione (e il resto dei dati) con output grepped.
— cane mangia il mondo dei gatti il

Ho appena capito perché lo strumento si chiama awk ward
— cane mangia il mondo dei gatti il

1

Puoi dare un'occhiata al ngrepcomando:

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

Dove:

  • -W single specifica la formattazione a riga singola
  • regex to match significa scaricare solo i pacchetti contenenti determinate stringhe.
  • 'port 80' è un filtro pcap per annusare solo i pacchetti da o verso la porta 80

1
Vorrebbe usare ngrep, ma non esiste uno strumento simile - è un apparecchio ...
— cane mangia il mondo dei gatti

ngrep è fantastico. Stavo cercando per ore quale host sta generando traffico HTTP verso il mio host. Con singolo sudo ngrep "GET .." ha trovato la risposta in pochi minuti.
— Bartosz Bilicki,

0

Il motivo per cui l'output è hex è la -Xbandiera. Provare:

tcpdump -ni eth1 | grep something_interesting

Otterrai un output leggibile scaricato direttamente nel cli.


Sì, ma non conterrà il contenuto del pacchetto.
— RalfFriedl,

0

Non sono riuscito a fare in modo che lo script awk facesse quello che volevo e ngrep non avrebbe funzionato su una Ethernet su USB, quindi ho scritto un piccolo programma C per unire le linee emesse da tcpdump in modo che siano comprensibili. È su https://gitlab.com/dargaud/TcpDumpJoin

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.