martes, 24 de diciembre de 2013

Qué deberíamos saber sobre Tcpdump (parte I)

En una entrada anterior un lector anónimo comentaba: "Muy interesante sería una entrada para desvelar los misterios de tcpdump. En muchos tutoriales solo se araña la superficie de esta herramienta"... lo intentaremos.


La verdad es muy difícil decir algo de esta herramienta que no esté ya dicho, pero voy a intentar hacer un artículo en varias entregas con lo que creo que se debería saber sobre este magnifico sniffer

En esta serie de entradas (creo que serán unas 3) intentaremos abarcar todos los aspectos de esta herramienta, por favor si me dejo algo decirlo.
 
Para quien no sepa lo que es Tcpdump echaremos mano de Wikipedia... a modo de introducción: Tcpdump es un herramienta en línea de comandos cuya utilidad principal es analizar el tráfico que circula por la red.

Permite al usuario capturar y mostrar a tiempo real los paquetes transmitidos y recibidos en la red a la cual el ordenador está conectado.
Tcpdump funciona en la mayoría de los sistemas operativos UNIX: Linux, Solaris, BSD, Mac OS X, HP-UX y AIX entre otros. En esos sistemas, tcpdump hace uso de la biblioteca libpcap para capturar los paquetes que circulan por la red. 


Existe una adaptación de T
cpdump para los sistemas Windows que se llama WinDump y que hace uso de la biblioteca Winpcap.


Tcpdump fue escrito originalmente en 1987 por Van Jacobson, Craig Leres y Steven McCanne. A día de hoy va por la versión: 4.5.1 / 1.5.2 release date: Nov 20, 2013/Dec 3, 2013.


Utiliza libpcap al igual que wireshark, snort, nmap, kismet, iftop, xplico y un largo etc...t ambién creada por estos tres "elementos", TCPdump puede ser a día de hoy unos de los sniffer mas usado en todo el mundo, por su versatilidad y potencia.

Dicho esto entramos en harina...
 

 
Instalación

Lo podemos descargar de la pagina oficial y compilarlo, aunque sería muy raro que no estuviese en los repositorios como paquete ya
precompilado para cualquier distribución. Debian, Ubuntu y derivadas lo pueden instalar con AptCentos, Redhat con Yum, Opensuse con Yast,etc, etc.


Para mí, la mejor característica que tiene
Tcpdump es que esta diseñado para correr en la linea de comandos, esto nos ofrece posibilidades que otros sniffers igual de potentes no tienen, sacrificamos a priori vistosidad y intuición de manejo por versatilidad...


Tcpdump básico

Antes de comenzar conviene echarle un ojo a las opciones de esta herramienta un poco por encima. Más adelante las iremos viendo todas:
Con esto ya estamos preparados para nuestro primer comando:
  
tcpdump -i wlan0 -n   
 
Lo que le estamos diciendo a tcpdump es que capture el trafico con la tarjeta de red Wlan0 y que no resuelva los nombres de las interfaces de manera que nos saldrían las ip:

   
En realidad de momento esto no tiene ningún misterio: nosotros ordenamos y tcpdump obedece.

Vamos a ver otro ejemplo:
 
tcpdump -i wlan0 -n -c 1 -t -A 
  
En cristiano sería: -i captura el trafico por wlan0, -n no resuelvas los nombres, -c1 cuando hayas capturado 1 paquetes para, -t no muestres la hora, -A muestra los paquetes en ascII:

 
Otras opción que interesa ver sería -s len, donde "len" es la longitud que nos interesa. 

Por defecto Tcpdump sólo captura los primeros 68 bytes, lo cual es útil si lo único que se quiere son las cabeceras IP, TCP o UDP.  Sin embargo, en caso de estar esnifando protocolos como NFS se truncan los datos. En ese caso podemos ajustar la longitud de la captura a la MTU del medio que estamos usando con esta opción. Por ejemplo para capturar toda la trama ethernet podemos usar -s 1500 o -s 0.
  
Filtrado básico

A veces no nos interesa ver todos todos los paquetes que pasan por nuestra red y queremos ver los que salen de una determinada ip, o los de un puerto en concreto, etc.

Para esto Tcpdump viene bien armado, los modificadores básicos son 3:

Tipo:

Puede ser host, net o port, portrange indican respectivamente una máquina, por ejemplo host 192.168.1.1, una red completa, por ejemplo net 192.168,  un puerto concreto o un rango de puertos.

Veamos unos ejemplos:
 
Captura el tráfico que entre o salga del host 192.168.1.1 por el puerto 22:

tcpdump -i wlan0 host 192.168.1.11 port 22

Captura el tráfico con destino 192.168.1.11 por el rango de puertos del 22 al 25 pero no el 23:

tcpdump -i wlan0 host 192.168.1.11 and  portrange 22-25 and not 23
 
Dirección:

Especifica desde o hacia donde se va a mirar el flujo de datos. Tenemos src  (source) o dst (destination) y podemos combinarlos con or, and y not. Para el caso de de protocolos punto a punto podemos sustituir por inbound o outbound.

Más ejemplos:

Captura los paquetes que vienen de 192.168.1.11:

tcpdump -i wlan0 src 192.168.1.11 

Captura los paquetes que van hacia 192.168.1.11:

tcpdump -i wlano dst 192.168.1.11

Captura los paquetes con el origen 192.168.1.11 y destinado a 192.168.1.35:
 
tcpdump -i wlan0  src 192.168.1.11 and dst 192.168.1.35  
 
Por supuesto se pueden combinar con los modificadores anteriores:

tcpdump -i wlan0 -n -S src 192.168.1.11 and dst 192.168.1.35 and dst  port 25
  
Captura los paquetes de origen 192.168.1.11 con destino 192.168.1.35 con el puerto de destino 25.

Proto:

En este caso es el protocolo que queremos capturar: tcp, udpicmp, rarp, ip, ip6, igrp, icmp6, igmp, etc, etc...

tcpdump -i wlan0 icmp and host 192.168.1.1
   
Seguro que me dejo infinidad de expresiones y combinaciones, todo lo anterior lo podemos escribir tanto con nombres de servidor, direcciones ip o direcciones mac... Como veis cuando hablé de versatilidad iba en serio.

Siguiendo con el tema del filtrado ....todavía podemos filtrar aun más y ser mucho mas quirúrgicos...

Filtrado (no tan básico) de FLAGS 
 
Imaginemos que queremos filtrar todos los paquetes que lleguen de una máquina a otra por un puerto determinado, que tengan el flag activo ACK (así dicho tan en frío casi suena a rollazo pero en el próximo tutorial veremos un par de ejemplos muy divertidos). 

Esto lo podríamos filtrar del siguiente modo (es un poco largo pero luego veremos como abreviarlo todo):

tcpdump -i wlan0  src host 192.168.1.10 and dst host 192.168.1.30 and port 22 and  -S -n  " tcp[13] & 16 == 16 "

Fijémonos ahora en la parte resaltada del filtro y veamos de dónde sale y qué significa.

Para ello debemos ver como es una cabecera tcp y dónde se sitúa la bandera ACK (esto mismo se puede hacer con otros protocolos como icmp, luego veremos cuanto puede dar de sí ésto...)


 
 
Como podemos ver, la bandera ACK está situada en el octeto número 13. De ahí sale el principio del filtro tcp[13].

Ahora miremos más de cerca... el octeto sería 0001000 si tuviese el flag ACK activo. Si pasamos esa situación de binario a decimal nos da 16 con lo cual podemos decirle a tcpdump que mire en la cabecera en el octeto 13 y si es igual a dieciséis que nos muestre esos paquetes ..." tcp[13] & 16 == 16 " 

¿Sencillo no?, imaginad... ¿qué no podéis filtrar con tcpdump?, ¿se puede ser mas quirúrgico?...

Otro ejemplo. Si queremos visualizar los paquetes  con  el syn ack activo el estado del octeto 13 sería 00010010 = 18 con lo cual el filtro es " tcp[13] & 18 == 18.

Bueno por hoy lo dejamos aquí, espero no haber aburrido y hasta la segunda entrada sobre Tcpdump...




Fuente

No hay comentarios:

Publicar un comentario