Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

miércoles, 2 de septiembre de 2015

Guía básica de tcpdump

Alguna vez ya he hablado sobre la captura de trazas de red con un sniffer, pero hasta ahora siempre he hablado de la misma herramienta, la más famosa de todas que es Wireshark. El motivo es simple: Se trata de la herramienta más usada y la que se puede implementar ya sea en Windows o en Linux; pero en el uso de esta herramienta he dejado de lado a aquellos amantes de la consola de Linux, los cuales no pueden (o no quieren) recurrir a esta herramienta debido a la carencia de interfaz gráfica. Es por ello que este post va dirigido a todos aquellos amantes de la consola que quieren trazar la red desde la consola, los cuales tienen que recurrir a alternativas a esta fantástica herramienta; una de éstas se llama tcpdump, cuya principal ventaja es su "compatibilidad" con wireshark, ya que permite guardar capturas de red que pueden ser interpretadas por el analizador gráfico sin problemas.

Esta herramienta se encuentra instalada por defecto en el sistema con lo que no requiere de instalación alguna, y aunque el uso básico es muy sencillo, el ir un poco más allá no lo es tanto; aunque antes de empezar a analizar la red hay que tener en cuenta lo siguiente: Estamos analizando el tráfico que llega a un servidor o hablamos de un equipo que se quiere "interponer" entre dos puntos? En caso de encontrarnos en la segunda situación, tal vez sea recomendable que leas esto antes de continuar; especialmente aquello referente a la preparación del entorno para analizar la red. Si tenemos todo preparado para realizar nuestro análisis podríamos pasar al uso de la herramienta que nos atañe hoy.

tcpdump
Comencemos con lo más básico de todo, es decir, con el uso a más "bajo" nivel que podemos hacer de esta herramienta... tcpdump de por sí está preparado para escuchar en la primera interfaz de red disponible sin filtro alguno; lo que significa que simplemente mostraría todo el tráfico que le llega. Esto se se puede lograr simplemente escribiendo el comando tcpdump sin parámetro alguno:

  1. tcpdump

Este sería el comando más básico de todos, y aunque de por sí es válido, nos muestra mucha información de golpe, siendo dificultoso encontrar la información deseada... Esto es algo común que ocurre con cualquier sniffer, es por ello que necesitaremos ayuda de los llamados filtros. Un filtro no es ni más ni menos que un recurso que nos ayuda a descartar todo el tráfico que no nos interese ver en estos momentos y puede ser usado para conseguir determinados resultados; es por ello que esta herramienta rara vez es usada "a pelo" y suele ir acompañada siempre de diferentes recursos y/o parámetros. A continuación mostraré los que yo considero más útiles, si bien podéis lograr más información mediante man.

  • -p: Probablemente el parámetro más usado de todos ya que sirve para filtrar el tráfico y mostrar únicamente el protocolo especificado. Lo malo que tiene esto es que no es un filtro demasiado preciso ya que únicamente filtra tcp y udp. Aún así es un parámetro que puede sernos de gran utilidad en entornos en los que sepamos que por ejemplo solo puede haber tráfico udp.
  • -i: Por defecto el sniffer analizará el tráfico que fluya por la interfaz eth0, pero no siempre desearemos eso; es por ello que en ocasiones nos veremos en la situación de especificar la interfaz concreta en la que deseamos "escuchar". Ejemplo: tcpdump  -i eth0.
  • -n: Otro gran recurso que yo personalmente siempre uso cada vez que quiero hacer una captura de red. Este parámetro previene que se realice una resolución de nombres; ¿Esto qué significa? Que si por ejemplo nos dirigiésemos a una página con un nombre de dominio asignado como por ejemplo www.prueba.com; gracias al parámetro en cuestión nos aseguraríamos de que siempre veríamos la ip y no el nombre; cosa muy útil para obtener la información más precisa posible.
  • -s: Uno de los problemas que tiene por defecto tcpdump, es que tiene establecido por defecto un tamaño de paquetes máximo... Por ejemplo si capturásemos un paquete de red muy grande, tcpdump no sería capaz de procesarlo adecuadamente y solo guardaría el tamaño máximo que por defecto es capaz de procesar; lo cual es realmente engorroso y puede ser un problema a la hora de analizar los paquetes. Para solventar esa limitación se usa el parámetro -s, en el cual se puede establecer el tamaño que podemos procesar como máximo; en caso de querer hacer una captura sin límites (suele ser lo más común) habría que establecer que tuviese un tamaño máximo de 0.
  • -v: Esto haría referencia al verbose o grado de detalle con el que queremos ver la captura. -v sería poco detallado mientras que -vv sería muy detallado; Por lo general suele ser usado -vv si bien no se trata de un parámetro obligatorio.
  • port: Uno de mis favoritos. Este parámetro seguido del número de puerto, especifica el puerto al que queremos prestar atención, lo cual viene increíblemente bien cuando se quiere analizar el comportamiento de un servicio en concreto y no queremos ser "molestados" por el tráfico generado por el resto. Un gran parámetro que personalmente recomiendo usar. Ejemplo: tcpdump port 80.
  • -w: Imaginemos que queremos capturar el tráfico de red y almacenarlo dentro de un archivo que más tarde querremos analizar. Este parámetro nos permite lograrlo y es importante que la información se almacene en un fichero con extensión .cap. Este fichero tiene la gran ventaja de que puede ser leído más adelante, ya sea por tcpdump o por Wireshark. Muy útil. Ejemplo: tcpdump  -w /tmp/captura.cap
  • -r: Este parámetro, a diferencia del resto que pueden ser combinados entre sí, funciona en solitario; es decir que si usamos este parámetro ninguno más puede ser usado ya que sirve para leer un fichero .cap. Ejemplo: tcpdump  -r /tmp/captura.cap.
  • -c: Por último no me gustaría olvidar al parámetro -c, el cual establece el número de paquetes que va a leer nuestra herramienta. Tcpdump está diseñado para analizar un número infinito de paquetes y no parar hasta que nosotros se lo indiquemos expresamente. Mediante este parámetro podemos especificar que la herramienta se pare tras capturar un número determinado de paquetes. Esto viene bien en caso de que uno quiera dejar la herramienta en marcha durante mucho tiempo y quiera que esta se pare automáticamente al capturar X paquetes. Ejemplo: tcpdump -c 10.

Basándonos en lo que hemos visto hasta ahora podemos realizar una serie de capturas combinando los conceptos adquiridos. 

Por ejemplo:

Para capturar el tráfico que fluya por eth1, referente al puerto 22, siguiendo el protocolo tcp y con un límite de 1000 bytes por paquete habría que escribir:

  1. tcpdump -i eth1 -p tcp port 22 -s 1000

En caso de querer capturar únicamente los paquetes del protocolo udp que pasen por la interfaz eth0 y sin limitación de tamaño alguna, habría que escribir:

  1. tcpdump -i eth0 -p udp -s 0

Ahora imaginemos que queremos capturar el tráfico de eth1 forma de forma detallada; pero no solo eso, sino que queremos únicamente los primeros 1000 paquetes que nos lleguen sin tener en cuenta su tamaño. Además al ser tantos paquetes queremos guardarlos en un fichero que llamaremos llamado test.cap almacenado en /usr/src:

  1. tcpdump -i eth1 -vv -c 1000 -s 0 -w /usr/src/test.cap

Pasan los días y queremos leer la captura almacenada con tcpdump. Esto sería tan sencillo como hacer:

  1. tcpdump -r /usr/src/test.cap


Obviamente esta herramienta ofrece muchas más posibilidades, pero me he centrado en aquellas que en mi opinión son las más útiles y usadas... De todas formas con esto ya seríamos capaces de capturar de forma relativamente precisa todo el tráfico que pase por nuestro equipo.

Espero que os ha resultado útil.

Saludos.

No hay comentarios :

Publicar un comentario