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

Para terminar esta semana seguiremos por donde lo dejamos en la primera parte de esta serie de artículos sobre Tcpdump. 
  
La captura de paquetes es una de las formas más poderosas y fundamentales para analizar las redesY de la mano viene el filtrado.

Hoy nos ocupa el filtrado de las cabeceras de los  datagramas. Si recordáis, ya vimos un pequeño ejemplo en la entrada anterior, concretamente la manera de hacer filtros para los paquetes por el estado de sus flags...

Filtrado avanzado de encabezado
 
Tal y como os comento, anteriormente vimos como filtrar las banderas en el protocolo tcp según su posición en el octeto correspondiente en la cabecera. 
Como no, hay varias maneras de hacer esto...

Si para filtrar los paquetes con el ACK activo era " tcp[13] & 16 == 16 " , en realidad hay una manera mas fácil de hacer esto y sería: tcpdump-i eth1 'tcp [tcpflags] == tcp-ACK'

De esta misma manera podemos filtrar los paquetes tomando como referencia cualquier parte del Header del paquete y podemos aplicar los siguientes operadores >,<, >= <=, = y !=

 tcpdump "udp[0:2] < 1024"

Examinemos el filtro como antes: le estamos indicando que lea el octeto 0 con :2 y le estamos diciendo que lea dos octeto. En cristiano que lea del octeto 0 al octeto 1, o sea el puerto de origen, y que nos filtre sólo los paquetes cuyo puerto de orígen sea menor a 1024 ...

Si miramos con los ojos y un poco de conocimiento, a simple vista podemos deducir que podríamos filtrar este datagrama de las siguientes formas:

udp[0:2] puerto origen
udp[2:2] puerto destino 
udp[4:2] longitud datagrama 
udp[6:2] Suma de comprobación


Esto mismo lo podemos hacer con el datagrama ICMP

Por ejemplo, si quisiéramos que nos mostrara las solicitud de eco (ECHO REQUEST, solicitud ping)  solamente el filtro quedaría tal que así:

tcpdump -i wlano -n 'icmp[0] = 8'  

 
Otro ejemplo con los Echo reply:
 
tcpdump -i wlan0 -n "icmp [0] = 0"

 
Y por último, para que quede más claro si cabe, vamos a filtrar destination unreachable:
 
tcpdump -i wlan0 -n "icmp [0] = 3"


Como estamos viendo podemos filtrar casi cualquier cosa con Tcpdump, pero sigamos viendo ejemplos...

Miremos el encabezado IP: 
 


Vamos a filtrar los paquetes recogidos por Tcpdump cuyo TTL sea mayor de 6
pues fijándonos en la imagen sabemos que el tiempo de vida del paquete queda recogido en el octeto numero 8, por lo tanto nuestro filtro quedaría así:

tcpdump -i wlan0 -n  "ip[8] > 6"
 
A Tcpdump también le podemos decir que compare el paquete con una cadena en hexadecimal de manera que podríamos decirle que filtrara los datagramas IP cuyo IP de origen sea 0xC0A8040F o 192.168.4.15:
 
tcpdump -i wlan0 -n "ip[12:4] = 0xC0A8040F"

Con esto le decimos que lea 4 octetos a partir del octeto 12 (ip origen) y lo compare con nuestro valor hexadecimal.
 
Algo que también podemos hacer a la hora de hacer filtros Tcpdump es agrupar con paréntesis:
 
tcpdump -i wlan0 -vvv -s 1500 '((port 67 or port 68) and (udp[38:4] = 0x3e0ccf08))'

Como veis podemos filtrar todo, solo tenemos como limite nuestra ocurrencia.

Tcpdump no tiene una opción de ensamblar las sesiones TCP directamente desde los paquetes, pero puede ser "simularlo" mediante el uso del comando strings

tcpdump -l -s0 -w - tcp dst port 80 | strings 


La opción -l anterior activa un buffer de línea, lo que hace que los datos se muestren en pantalla de inmediato.

Lo que sucede es que Tcpdump imprime los datos binarios sin formato en la pantalla. Esto da un giro con la opción -w donde el nombre de archivo especial - escribe a STDOUT en lugar de a un archivo. Normalmente, al hacer esto se mostraría todo tipo de basura, pero ahí es donde viene a cuento el comando strings que solo permite que se impriman en pantalla los datos reconocidos como texto.

Análisis HTTP

Usando el truco de strings podemos capturar datos HTTP, aunque Tcpdump en realidad no entienda nada al respecto. Luego de capturados, podemos analizarlos de varias maneras. 

Si queremos ver todos los sitios web accedidos por 192.168.1.190 en tiempo real, por ejemplo, sería algo así:

tcpdump -i eth1 -l -s0 -w - host 192.168.1.190 and port 80 \ | strings | grep 'GET\|Host' 


En este ejemplo, estoy usando un comando grep para mostrar sólo las líneas con GET o Host. Estas cadenas se muestran en las peticiones HTTP y en conjunto muestran las direcciones URL a las que se accede.

Bueno espero no haber sido muy espeso :D , os emplazo a la tercera y última entrega ...

Serie de artículos: Qué deberíamos saber sobre Tcpdump (parte 1, parte 2, parte 3). 

6 comentarios :

  1. Muy buena entrada! Gracias por la info!
    Un saludo

    ResponderEliminar
  2. muchas gracias de nuevo, esta vez estuvo mas complejo

    ResponderEliminar
    Respuestas
    1. dnd pablo...es que si no se aburre el personal Xd

      Eliminar
  3. Interesantísimo... pero para preparar filtros finos,finos desde por ejemplo, el prisma de una auditoria ¿que tipo de paquetes serían los "Most Wanted"?..xD
    Gracias por tan buen trabajo.

    ResponderEliminar
  4. Dusculpa amigo estoy empezando a leer sobre tcpdump y me parece muy interesante, pero tengo una duda, nose si puedes ayudarme a resolverla, mira te explico, supuestamente nosotros instalamos el tcpdump en un servidor en una parte de nuestra red, no es asi, ya pero ahora si yo quiero monitorear el trafico que circula por mi red, no podria no es asi, ya que el tcpdump solo analiza el trafico que atraviesa por alguna interfaz del servidor, pero si por ejemplo yo quisiera saber el trafico que atraviese por otra pc con otra pc de nuestra red, no podria no es asi? espero haber dejado comprender mi duda y gracias por la respuesta.

    ResponderEliminar
    Respuestas
    1. no te dejas entender... culero :/

      Eliminar