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