2009-08-13 22:44:50 +0000 2009-08-13 22:44:50 +0000
82
82

¿Cuál es la forma más fácil de husmear datos de tráfico TCP en Linux?

Quiero una forma sencilla de mostrar todos los datos TCP (no las cabeceras TCP ni nada parecido) que pasan por cualquier interfaz de mi caja Linux.

Por ejemplo, quiero un comando mágico que si hago

magic_commmand_I_want port=1234

entonces si hubiera un servidor escuchando en el puerto 1234 en mi máquina, y alguien hiciera

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a host/port

Entonces el comando mágico sólo imprimiría

hello

He probado con “tcpdump”, “ethereal”, “tethereal”, “tshark”, y otros, pero no es obvio cómo se consiguen:

  • no muestren las direcciones IP u otros metadatos
  • sólo muestren los “datos” que se envían, no los paquetes individuales y sus cabeceras
  • impriman los datos tal cual, no en hexadecimal, y no con marcadores de desplazamiento de paquetes
  • olfateen todo el tráfico de red (ya sea en eth0 o eth1 o lo, etc.. ..)

Sí, probablemente podrías encadenar un conjunto de comandos unix para hacer esto, pero eso no es muy fácil de recordar para la próxima vez :)

Si tienes un ejemplo sencillo de una línea de comandos exacta que haga esto, eso es lo que me gustaría.

Respuestas (7)

109
109
109
2009-08-14 17:05:54 +0000

Actualización:

Como señala Michal en los comentarios: A partir de la versión 1.3 de tcpflow se utiliza la opción -e para especificar el nombre del escáner. Por lo que se imprime el error “Nombre de escáner inválido ‘8983’”. El comando correcto es

sudo tcpflow -i any -C -J port 1234

(también -J ha sido cambiado a -g en la última versión)

  • *

Gracias a yves por indicarme tcpflow “. Aquí está la línea de comandos:

tcpflow -i any -C -e port 1234 # as root, or with sudo

Esto hace todo lo que quiero

  • muestra los datos byte a byte tal y como entran
  • no muestra ningún otro metadato
  • escucha en todas las interfaces (por lo que captura los datos que vienen de dentro y fuera de la máquina)

El ”-C“ le dice que vuelque a la consola en lugar de a un archivo. El ”-e“ habilita los colores para que cliente->servidor y servidor->cliente sean visualmente distintos.

He instalado tcpflow simplemente haciendo

sudo apt-get install tcpflow
30
30
30
2009-08-13 22:48:27 +0000

socat es la herramienta que usted pide. Puede actuar como un proxy:

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

entonces su aplicación debe conectarse al puerto 4444 en lugar de conectarse directamente al 1234

La opción -v es para que socat imprima todo lo que recibe en el error estándar (stderr).

Actualización:

Si socat no está disponible en su máquina, aún puede emularlo así con netcat:

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

advertencias: esta opción es unidireccional. la segunda instancia de netcat imprimirá cualquier respuesta de su servidor a la salida estándar. Puede seguir haciéndolo entonces:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
20
20
20
2009-08-13 22:47:06 +0000

Pruebe Wireshark . Es un excelente analizador de protocolos dirigido tanto a Linux como a Windows.

13
13
13
2009-08-14 15:04:28 +0000

tcpflow es lo que quieres. Extraído de la página man:

DESCRIPCIÓN tcpflow es un programa que captura los datos transmitidos como parte de las conexiones TCP (flujos), y almacena los datos de forma conveniente para el análisis o depuración del protocolo. Un programa como tcpdump(4) muestra un resumen de los paquetes vistos en el cable, pero normalmente no almacena los datos que realmente se están transmitiendo. Por el contrario, tcpflow reconstruye los flujos de datos reales y almacena cada flujo en un archivo separado para su posterior análisis. tcpflow entiende los números de secuencia TCP y reconstruirá correctamente los flujos de datos independientemente de las retransmisiones o de la entrega fuera de orden.

tcpflow almacena todos los datos capturados en archivos que tienen nombres de la forma

192.168.101.102.02345-010.011.012.013.45103

donde el contenido del archivo anterior serían los datos transmitidos desde el host 192.168.101.102 puerto 2345, al host 10.11.12.13 puerto 45103.

Establezca una conexión desde su aplicación al servidor. Cuando la conexión está en marcha, tcpflow es capaz de capturar los datos de la misma Por ejemplo:

$ sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

Todos los datos se almacenarán en un archivo llamado 127.000.000.001.48842-127.000.000.001.05555.

Todavía puede redirigir esto en la salida estándar con la opción -Cs . Lea la página del manual para jugar con la expresión para afinar los paquets que quiere que tcpflow capture.

2
2
2
2009-08-13 23:15:48 +0000

ngrep es muy bueno para esto. Toma una cadena BPF y una cadena opcional para buscar dentro de los paquetes, y luego vuelca el contenido del paquete a la pantalla en un formato bastante útil. Opcionalmente también vuelca a un archivo pcap_dump que puedes examinar más de cerca en Wireshark más tarde.

0
0
0
2009-08-13 23:08:00 +0000

Echa un vistazo a Chaosreader . Aunque hace un poco más de lo que pides y de forma ligeramente diferente, probablemente podrías modificar el código del mismo para hacer lo que quieres.

-1
-1
-1
2009-08-13 22:47:31 +0000

Tal vez puedas escribir un wrapper para tcpdump, por ejemplo, que elimine toda la información redundante