Para esnifar tramas de red se necesita inevitablemente estar conectado al mismo segmento de red que la víctima, luego dependiendo de la configuración de la red serán necesarias unas herramientas u otras.
Si el elemento que une todas las máquinas de la subred es un hub, cualquier otro aparato que no separe colisiones de red, o no tenga ningún algoritmo de control de flujo, no tenemos que hacer ningún paso adicional. Si lo que tenemos en medio es un router no hay nada que hacer, ya que un router jamás nos va a enviar tramas que no sean para nosotros (a menos que le saturemos o suplantemos la IP de la puerta de enlace, pero esa ya es otra historia). Si por el contrario tenemos un switch o un bridge, tendremos que hacer unos sencillos pasos previos antes de empezar a capturar el trafico.
Necesitaremos tener instalado primero las utilidades “dsniff” (apt-get install dsniff en sistemas Debian o derivados). Entre todas las utilidades que proporciona este paquete (os aconsejo que las echeis un vistazo) viene la que nos interesa: arpspoof, un envenenador de ARP.
El mecanismo es sencillo, necesitamos hacer creer a la máquina víctima (o a la subred entera) que nosotros somos la puerta de enlace para que nos envíe sus tramas. La manera más sencilla de hacer esto es decirle a nuestra víctima que la dirección MAC de la puerta de enlace es ahora la dirección MAC de nuestra tarjeta de red. Los paquetes IP seguirán intactos y tendrán la misma dirección IP destino (la IP de la puerta de enlace), pero los recibiremos nosotros porque vamos a engañar a el nivel de enlace de la víctima. (Para comprender todo esto hace falta contar con unos conocimientos previos de redes y sus arquitecturas).
Esto lo podemos conseguir enviando respuestas ARP no solicitadas a la dirección de la víctima indicando este cambio en la topología de la red. Por ejemplo, si ejecutamos (como root):
$ arpspoof -t «ip_victima» «ip_puerta_enlace»
empezará a enviar repetidamente respuestas ARP con nuestra MAC a esa dirección. La víctima procesará ese mensaje aunque no haya preguntado por ello, ya que el protocolo IP está diseñado para cambiar la topología de la red al vuelo y puede tratarse de un cambio real del que me conviene ser informado. El envenamiento afortunadamente es temporal (tarde o temprano se dará cuenta del engaño) y además cuando paremos el arpspoof (con CTRL-C), antes de terminar, amablemente enviará unas respuestas ARP con las direcciones correctas para dejar todo como estaba.
A partir de este momento recibiremos todo el tráfico de la máquina de la víctima y podremos capturarlo. Por desgracia, nuestro querido sistema operativo tiene la política por defecto de descartar todos los paquetes que no sean para nosotros (después de capturarlos evidentemente) para evitar ataques de denegación de servicio, y provocaremos a la víctima la sensación de que se ha interrumpido la conexión. Necesitamos entonces que Linux envíe a la puerta de enlace real todos los paquetes ajenos que recibamos. Esto lo conseguimos modificando un parámetro de configuración como root (no vale con sudo):
$ echo “1″ > /proc/sys/net/ipv4/ip_forward
Para dejarlo como estaba simplemente cambiamos el “1″ por un “0″, aunque de todas formas cuando reiniciemos nuestra máquina automáticamente se restablece al valor por defecto.
Una vez salvado este escollo, explico como capturar y analizar las tramas recibidas.
Mi utilidad favorita para capturas y analizar las tramas es Ethereal, con ella se pueden establecer opciones de captura de tráfico y facilita el análisis mediante su interfaz gráfica. Para lanzarlo ejecutamos (como root o con sudo):
$ ethereal
Dentro seleccionamos el menú “Capture” y luego “Options…” (o usamos el atajo de teclado Ctrl+K) . En la pantalla que nos aparece seleccionamos la interfaz de red que queremos usar (eth0 normalmente), nos aseguramos de que esté marcada la opción “Capture packets in promiscuous mode” para que la tarjeta de red no ignore los paquetes que no vayan dirigidos a nuestra máquina, y por último podemos elegir filtros de captura que nos pueden simplificar mucho la vida. Dependiendo del nivel de trafico de la red a la que estemos conectados, puede que lleguemos a capturar hasta 1000 paquetes por segundo, lo que provoca que nos podamos volver locos cuando los analicemos más tarde. Normalmente la mayor parte del trafico no nos interesa, como pueden ser paquetes de ICMP o del algoritmo Spanning Tree que usan los routers Cisco. Si pinchamos en el botón “Capture Filter” tendremos más ayuda sobre como crear filtros que se ajusten a lo que queremos. Por ejemplo, si quisiéramos ver todos los paquetes que envía y recibe la máquina 163.117.11.186 pero que no sean de tipo ARP escribiríamos: “not arp and host 163.117.11.186“, o si queremos capturar solo el trafico HTTP excepto el de esa máquina pondríamos: “tcp port http and not host 163.117.11.186“. Jugando con las opciones de “Display Options“, podemos mostrar directamente los paquetes según se van recibiendo. No suele ser aconsejable porque introduce bastante retraso en el proceso y puede provocar que perdamos algunos paquetes, pero muchas veces es la mejor opción. Marcando “Update list of packets in real time” y “Hide capture info dialog” veremos los paquetes capturados en tiempo real. Es muy importante que al rato o cuando encontremos lo que busquemos seleccionemos “Stop” dentro de “Capture” o pulsemos en el botón adecuado de la barra de herramientas. También podemos poner límites de tiempo o tamaño en la captura cambiando los parámetros en “Stop Capture…“.
Las combinaciones son muy numerosas e incluso podemos utilizar expresiones regulares si solo queremos recibir paquetes que contengan un determinado formato de texto. Es conveniente probar varias combinaciones hasta hacernos con el control de las más importantes.
Una vez hemos terminado de configurar las opciones de captura pulsamos sobre “Start” y comenzará a analizar todos los paquetes que reciba por la interfaz de red. En la nueva ventana que aparece podemos ver la cantidad de paquetes que se han recibido, y que más tarde podremos ver, separados por protocolo. Solo aparecen los que hayan cumplido los filtros de captura que hayamos puesto antes. Más de 1000 paquetes pueden ser demasiados si no se sabe bien lo que estamos buscando.
Cuando lo consideremos oportuno pulsamos en “Detener” (o pare solo al llegar al límite de captura que hayamos puesto) y podremos ver en una lista todos los paquetes que hemos capturado. Por cada paquete aparece en cada columna la IP origen, la IP destino, el protocolo que contiene y una breve descripción de su contenido. Por ejemplo para un paquete HTTP aparecerá la cabecera de petición o de respuesta. Normalmente y a menos que seamos unos hachas o busquemos cosas raras, solo nos interesarán los paquetes asociados a los protocolo de más alto nivel, como HTTP, FTP o MSNMS (Microsoft Messenger). Aquellas comunicaciones que vayan cifradas por SSL (por ejemplo HTTPS) nos estarán directamente vetadas y podemos ignorarlas directamente.
Para los paquetes capturados también podemos aplicar filtros de visualización para únicamente ver los que nos interesan. Por desgracia, los filtros de visualización son radicalmente distintos a los usados para la captura. En el botón “Filter” tenemos algunos predefinidos y si pulsamos en “Expression…” podemos construirnos nuestro propio filtro personalizado seleccionando unas pocas opciones. Por ejemplo, si sólo queremos ver las peticiones POST de HTTP pondríamos “http.request.method contains “POST”“.
Podríamos ahora ir paquete por paquete viendo su contenido en binario o viendo el valor de cada campo de sus cabeceras, pero afortunadamente Ethereal nos proporciona la opción de seguir la pista a una conexión TCP junto con todos los paquetes que hayan intercambiado (gracias a que cada paquete tiene un identificador único para cada conexión y un orden). Si sacamos el menú contextual sobre uno de los paquetes que pertenezcan a la conexión (por ejemplo la petición o la respuesta de un mensaje HTTP) aparecerá la opción “Follow TCP stream…“. De esta forma podremos ver en una nueva ventana todo el texto intercambiado en ambas direcciones (un color por cada dirección), cabeceras, contenido en ASCII, etc.
Recordad siempre darle a “Limpiar” despues de seguir una conexión TCP, ya que Ethereal crea por defecto un filtro de visualización para que solo muestre los paquetes asociados a dicha conexión, y puede dar la sensación de que hemos perdido el resto.
Proximamente como utilizar todo esto para fines “educativos” o “poco éticos” segun se mire.
Posted in Frikadas | 3 Comments »