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.