tcpdump: ¿como obtener una salida grepable?

13

Estoy tratando de solucionar un problema donde solo tengo tcpdump disponible en un dispositivo. Quiero usar tcpdump para filtrar el tráfico web y solo mostrar el tráfico que contiene ciertas cadenas.

Hago lo siguiente:

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

La salida es una vista hexadecimal con una línea pr de 16 bytes. No puedo grep estos datos, ya que los datos se presentan en varias líneas.

¿Hay alguna manera para que tcpdump presente los datos capturados en una sola línea? Esto permitiría usar grep para encontrar paquetes interesantes.

Perro come gato mundo
fuente
1
bueno, no puedo probar esto en este momento, pero si tienes varias líneas, podrías hacer | tr -d '\ n' o grep -C 3 para obtener algunas líneas antes y después
barlop
@barlop, grep -C funciona, pero no es confiable, ya que nunca sé cuántas líneas habrá en el encabezado, y no veré las líneas debajo del partido. El comando tr transmite toda la salida a 1 línea, por lo que es demasiado.
Perro come gato mundo
Lo siguiente no sería grep, pero tcpdump puede hacer coincidir cadenas por hexadecimal, que es esencialmente grep sin ninguna expresión regular. Puede especificar un desplazamiento. Lo anoté en un archivo (hecho con windump, pero eso es solo una versión de tcpdump para Windows, así que supongo que tcpdump) tcpdump -nXr zfile "tcp [32: 4] = 0x47455420"
barlop
tcpdump -nei eth0 -X | grep --line-buffered "something interesting"lo haré, por razones que no se distinguen, mi respuesta de trabajo válida fue eliminada.
sjas

Respuestas:

11

Para aquellos como usted que no pueden usar ngrep, he aquí cómo usar awkpara hacer que la tcpdumpsalida del contenido del paquete sea grepable.

Primero, algunos resultados de muestra proporcionados por tcpdump -x, para presentar la tarea por delante:

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

Y este es el script de copiar y pegar en el awkque puede canalizar la salida

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

para obtener la siguiente salida grepable

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

A continuación se muestra una versión comentada del script anterior:

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()
}'
Eugene Beresovsky
fuente
2

Desde la página del tcpdumpmanual:

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

Asegúrese de utilizar también la -s 0opción para asegurarse de que se muestre todo el paquete.

Flup
fuente
Gracias, pero los datos aún se presentan en líneas de multiplicación, siempre que la página web tenga nuevas líneas. Tengo problemas para asociar el encabezado (y el resto de los datos) con la salida grepped.
Perro come gato mundo
Me acabo de dar cuenta de por qué la herramienta se llama awk ward
Dog eat cat world
1

Es posible que desee echar un vistazo al ngrepcomando:

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

Dónde:

  • -W single especifica formato de línea única
  • regex to match significa volcar solo los paquetes que contienen cierta cadena.
  • 'port 80' es un filtro pcap que solo detecta paquetes desde o hacia el puerto 80
LatinSuD
fuente
1
Me gustaría usar ngrep, pero no existe tal herramienta, es un aparato ...
Perro come gato mundo
ngrep es asombroso. Estuve buscando durante horas qué host está generando tráfico HTTP a mi host. Con un solo sudo ngrep "GET .." encontró respuesta en minutos.
Bartosz Bilicki
0

La razón por la cual su salida es hexadecimal es la -Xbandera. Tratar:

tcpdump -ni eth1 | grep something_interesting

Obtendrá una salida legible directamente al cli.

DaveA
fuente
Sí, pero no contendrá el contenido del paquete.
RalfFriedl
0

No pude hacer que el script awk hiciera lo que quería y ngrep no funcionaría en una Ethernet a través de USB, así que escribí un pequeño programa en C para unir las líneas de salida de tcpdump para que sean grepable. Está en https://gitlab.com/dargaud/TcpDumpJoin

Dargaud
fuente