domingo, 29 de diciembre de 2013

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 redes. Y 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:


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 ...

View the original article here


This post was made using the Auto Blogging Software from WebMagnates.org This line will not appear when posts are made after activating the software to full version.

No hay comentarios:

Publicar un comentario