6 votos

¿Por qué tcpdump no reconoce la entrada canalizada?

  1. He obtenido un archivo de captura de paquetes:

    $ sudo tcpdump -w file.pcap
  2. A continuación, puedo analizar ese archivo:

    $ tcpdump -r file.pcap

    Incluso puedo utilizar la redirección de archivos para leer desde la entrada estándar:

    $ tcpdump -r - < file.pcap
  3. Sin embargo, no puedo utilizar una tubería para leer desde la entrada estándar:

    $ cat file.pcap | tcpdump -r -
    tcpdump: unknown file format

    Este debe trabajo. ¿Qué está pasando?

OS X Yosemite 10.10
tcpdump versión 4.3.0 -- Versión 59 de Apple
libpcap versión 1.5.3 - Versión 47 de Apple


En realidad estoy tratando de sudo tcpdump -w - | tee file.pcap | tcpdump -r - que da lugar al mismo problema, aunque parece surgir con cualquier forma de entrada canalizada.

2 votos

Acabo de encontrarme con esto. Me alegro de que tu Q esté aquí para saber que no estoy loco ... no hay solución todavía. Los mismos comandos funcionan bien en Ubuntu

6voto

micolous Puntos 56

Esto sigue siendo un problema con OS X Mojave 10.14.2 (libpcap 1.0.1 Apple 79.200.4, tcpdump 4.9.2 Apple 83.200.2). En definitiva, se trata de un error en los parches de Apple para libpcap y tcpdump.

Además de utilizar la corriente ascendente tcpdump (que está disponible en Homebrew), también podrías:

  • Utilice tshark (parte de Wireshark), que funciona de forma similar a tcpdump .

  • Escribe los paquetes en un archivo temporal.

  • Prefija el flujo con 4 bytes nulos:

    sudo tcpdump -i en0 -w - | cat <(printf "\0\0\0\0") - | tcpdump -nvr -

Causa (y por qué funciona la inserción de nulos)

Apple ha parcheado su tcpdump de manera que intente leer primero los archivos en formato PCAP-NG:

#else /* __APPLE__ */
        pd = pcap_ng_open_offline(RFileName, ebuf);

También añadieron un -P para emitir paquetes en pcapng formato.

pcap_ng_open_offline termina en pcap_fopen_offline_internal(..., isng=1) . Este flujo llama a pcap_ng_check_header temprano (ver if (isng) en pcap_fopen_offline_internal ), y en caso de fallo, salta al bad: etiqueta.

Que bad: etiqueta intenta fseeko para buscar el archivo hasta el principio:

 bad:
    fseeko(fp, offset, SEEK_SET);
    if (p != NULL)
        free(p);
    return (NULL);

Pero no se puede buscar un FIFO, ¡así que seguimos leyendo desde el mismo punto! fseeko devolvería un error, pero este error se ignora .

En pcap_ng_open_offline que devuelve un error, el parche de Apple llama entonces a pcap_open_offline que sigue un flujo de control similar al del pcap normal. Sin embargo, debido a que el puntero del archivo en el FIFO todavía está adelantado en 4 bytes, el siguiente conjunto de cabeceras tiene la magia del fifo, y así tcpdump se rinde.

Se puede evitar esto insertando 4 unidades adicionales de NULL al principio de la tubería, con un pequeño truco de shell-script:

tcpdump -i en0 -w - | cat <(printf "\0\0\0\0") - | tcpdump -nvr -

Esto significa que cuando fseeko falla, estará en el lugar correcto en el FIFO para la magia "real".

Sin embargo, sigue habiendo algunas limitaciones:

  • tcpdump -P (Específico de Apple pcapng flag) sigue sin funcionar.
  • Estos archivos ya no son válidos pcap archivos. Si quieres leerlo con otra herramienta (o incluso con una herramienta que no sea de Apple tcpdump ), tendrá que tee la salida antes de cat .

Esto también funciona con tshark (que puede emitir pcapng y no funciona como fuente sin esta solución):

tshark -F pcapng -w - | cat <(printf "\0\0\0\0") - | tcpdump -nvr -

Sin embargo, no sugeriría poner esta solución a largo plazo. Se romperá una vez que Apple corrija este error, o si sus usuarios tienen un tcpdump en OSX (como con Homebrew).

1 votos

Detallado y exhaustivo. Increíble. Gracias.

1voto

Judith Cohn Puntos 1

Tengo el mismo problema en Mavericks (10.9.5). Probablemente no es la mejor respuesta pero descargué la versión de código abierto de tcpdump (tcpdump-4.6.2) y la puse en mi ruta antes de la versión del sistema y funciona con tuberías. Por supuesto, pierdes la funcionalidad extra específica de Apple.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X