En este tutorial vamos a ver cómo trabajar con tcpdump. Es una herramienta opensource para línea de comandos, sirve para monitorizar la red, podemos entenderlo como un analizador de paquetes que pasan por la red donde ejecutas el programa. Es utilizado en entornos Unix, aunque existe una variante para Windows llamada WinDump. Puede ser de vuestro interés un tutorial sobre EtherApe, que es una herramienta para ver el estado de nuestra red de manera gráfica.
En el tutorial se trabajará desde Linux, concretamente en Ubuntu 16.04, para que funcione la herramienta necesitamos ejecutarla con altos privilegios, salvo para ciertas opciones, que hará falta.
Podemos utilizar tcpdump para diversas tareas, tales como depurar nuestras aplicaciones de red, leer los datos que se envían entre usuarios por la red en la que nos encontramos, etc. Vamos a poner a continuación cómo es su sintaxis:
tcpdump [-aAbdDefhHIJKlLnNOpqRStuUvxX#] [ -B size ] [ -c count ] [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ] [ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ] [ -Q in|out|inout ] [ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ] [ --immediate-mode ] [ -T type ] [ --version ] [ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z command ] [ -Z user ] [ expression ]Esta herramienta cuenta con un gran número de parámetros que podemos utilizar, aquí veremos algunos.
- -A: Imprime los paquetes en código ASCII.
- -x: Imprime los paquetes en hexadecimal.
- -D: Muestra las interfaces disponibles.
- -c número: Cerrará el programa cuando se hayan capturado el número de paquetes indicado.
- -i interface: El programa escucha en la interface indicada.
- -I: Pone la interface en modo monitor.
- -p: No pone la interface en modo promiscuo.
- -f fichero: La salida se almacena en el fichero que le indiquemos.
- -h: Muestra ayuda para su uso.
Si queremos ver todos los parámetros disponibles, en Linux usamos:
man tcpdumpUsar este comando es más completo que la ayuda que nos ofrece el parámetro -h o --help, que solo nos mostraría lo siguiente:
Vamos a ver 10 ejemplos para iniciarnos en esta potente herramienta.
CTRL + C
El ejemplo más sencillo usando el parámetro -A. Para ello ejecutamos:
tcpdump -A
Vamos a ver algún ejemplo con algo más de contenido.
Ahora vamos a filtrar por host, y añadimos el modo verbose con el parámetro –v:
sudo tcpdump host 192.168.66.130 -vA continuación se muestra una imagen en la que se utiliza el comando anterior:
Para la imagen he realizado un ping desde otra máquina, por eso podemos ver ICMP. Pasemos al tercer ejemplo.
En este ejemplo vamos a mirar los paquetes del mismo host, solo que esta vez los paquetes que tengan que ver con el puerto 80:
sudo tcpdump host 192.168.66.130 and port 80 -vSi miramos la captura veremos algo parecido a lo siguiente:
Se puede ver lo fácil que es manejar esta herramienta, prosigamos.
Vamos a usar el ejemplo 3 y le vamos a modificar, queremos filtrar los paquetes con origen 192.168.66.130 que lleven destino al puerto 80:
sudo tcpdump src host 192.168.66.130 and dst port 80 -vVemos que hemos usado el condicional and, para que se cumplan las dos condiciones, también podemos usar or, si queremos que solo se cumpla una de ellas. Si miramos en las capturas vemos una petición POST.
Pasamos al quinto ejemplo.
Vamos a capturar paquetes indicando una interface:
sudo tcpdump -i ens33
A continuación podéis ver una imagen de la captura.
Vamos a por el siguiente.
En este ejemplo lo único que vamos a hacer es mostrar las interfaces disponibles, para ello ejecutamos:
tcpdump -DPara este caso no es necesario ser root.
Continuemos.
Queremos capturar 3 paquetes que se dirijan con destino al puerto 1987 y cuando esto se produzca se detenga el programa:
sudo tcpdump -c 3 dst port 1987Podemos apreciar en la siguiente imagen que solo se capturan 3 paquetes:
Vamos a ver otros pocos ejemplos.
Cuando nos interese obtener todos los paquetes de tráfico tcp que no se dirijan a un determinado puerto, por ejemplo el puerto 80 ejecutaremos lo siguiente:
sudo tcpdump not port 80 and tcpLa salida es parecida, por lo que en este ejemplo no se pone captura. Vamos a por el penúltimo ejemplo.
Vamos a capturar 2 paquetes de una interface determinada, y los mostraremos en formato hexadecimal, para ello debemos ejecutar:
sudo tcpdump -i ens33 -x -c 2A continuación se puede ver la salida:
Bien vamos a pasar al último ejemplo del tutorial.
En este ejemplo vamos a guardar la captura en un fichero para ojearla más tarde. Se limita la captura a 3 paquetes y se especifica una interface, así que ejecutaremos:
sudo tcpdump -w test.pcap -i ens33 -c 3Veamos una captura de pantalla:
Si queremos leer ahora ese fichero, tenemos que ejecutar:
tcpdump -r test.pcapPodemos apreciarlo en la siguiente imagen:
Hasta aquí ha llegado el tutorial sobre tcpdump, tiene muchas posibilidades y muchas opciones, así que para aprender a manejar bien está herramienta lo mejor es practicar y descubrir todas sus características poco a poco. Es posible que también te interese leer algo sobre la herramienta netcat, así que a continuación se deja un enlace a un tutorial con ejemplos: