Análisis de trafico con Netsniff-ng

Publicado el 11 junio 2015 por Debadastra @jdaanial

Netsniff-ng es una de esas herramientas que aunque tiene unas características muy interesantes y es muy potente, es más bien poco conocida. También es una de las tantas herramientas que llevo tiempo con ganas de mencionar aquí, pero por cuestiones de tiempo (y también porque se me olvida) no lo había hecho antes, hoy le ha llegado su turno. Se trata de un sniffer diseñado especialmente para sistemas Linux, muy similar a herramientas como TCPDump o TShark, pero con algunas ventajas adicionales. Una de ellas es su rendimiento, el cual es mucho más óptimo que otros sniffers existentes, ya que los paquetes manejados por Netsniff-ng no son copiados entre el espacio del kernel y el espacio del usuario, algo que es tan común en librerías como libpcap (De hecho, netsniff-ng no requiere de libpcap para su correcto funcionamiento).

Algunos sniffers realizan una serie de invocaciones a las system calls desde el espacio del usuario para realizar el proceso de captura de paquetes, los cuales son procesados en primera instancia por el kernel y almacenados en el kernel space. Este proceso es muy ineficiente, ya que se debe invocar a una (en algunos casos varias) system calls de la API de sockets del sistema operativo. Debido a esto, en las últimas versiones de la rama 2.4 y en prácticamente todas de la rama 2.6 del kernel de Linux se ha introducido PACKET_MMAP, un mecanismo que se encarga de crear un buffer compartido entre el kernel space y el user space para la captura y procesamiento de paquetes de red. Se trata de una característica antigua y que se encuentra integrada en prácticamente todos los sistemas Linux modernos por medio de la opción CONFIG_PACKET_MMAP. No obstante, para el correcto funcionamiento de netsniff-ng también se recomienda utilizar versiones recientes del kernel de Linux (>= 2.6.31) ya que implementan el concepto de “rings” del tipo RX y TX, los cuales permiten un control mucho más eficiente de los buffers utilizados para la recepción y transmisión de paquetes de datos. El tamaño de cada uno de estos rings puede variar dependiendo de las limitaciones físicas de la interfaz de red y típicamente se calcula en base al ancho de banda soportado por la interfaz de red.

INSTALACIÓN

El proceso de instalación es muy simple, basta con descargar la última versión estable desde el sitio web oficial (http://pub.netsniff-ng.org/netsniff-ng/) y descomprimir en cualquier directorio del sistema. También es posible instalar la versión de desarrollo que se encuentra en su repositorio GitHub (https://github.com/netsniff-ng/netsniff-ng.git) pero pueden haber errores y problemas a la hora de instalar, así que se recomienda tirar de la última versión estable.

>./configure

>make

>sudo make install

Con las instrucciones anteriores es suficiente para tener netsniff-ng instalado en el sistema local. A continuación, se puede ejecutar el comando “netsniff-ng” especificando la interfaz de red que será utilizada para el proceso de captura.

>sudo netsniff-ng -i eth0

Para ver todas las opciones de configuración disponibles en la herramienta, basta con ejecutar el comando con la opción “-h”

>sudo netsniff-ng -h

Esta herramienta tiene varias dependencias a librerías que se tienen que encontrar instaladas en el sistema, dichas dependencias se pueden ver en el fichero INSTALL (https://github.com/netsniff-ng/netsniff-ng/blob/master/INSTALL).

Uso básico y análisis de trafico con Netsniff-ng

La herramienta permite la captura de paquetes desde un dispositivo o un fichero de capturas (típicamente formato PCAP) y dicha información también puede ser inyectada/redireccionada a un dispositivo de red o un fichero de capturas. Un ejemplo muy sencillo seria el siguiente:

>netsniff-ng –in eth0 –out /home/adastra/Escritorio/dump.pcap -s icmp

En este caso se van a capturar todos los paquetes que utilicen el protocolo ICMP y que se transfieran por medio de la interfaz de red “eth0”. Con la opción “–out” se indica el destino al que deben redirigirse dichos paquetes, los cuales en este caso concreto, serán almacenados en un fichero PCAP. En el caso de que se indicase, por ejemplo, una interfaz de red, dichos paquetes serían inyectados a dicha interfaz de red. Finalmente, con la opción “-s” la información correspondientes a los paquetes capturados ya no serán enseñados por pantalla.

Hay que tener en cuenta que además de las opciones estándar que admite la herramienta, también es posible aplicar filtros sobre los paquetes capturados, como en este caso concreto en el que se han capturado todos los paquetes que utilicen protocolo ICMP. Estos filtros deben seguir las normas definidas en el estándar BPF (Berkeley Packet Filters) algo que es tan común en este tipo de herramientas (véase por ejemplo TCPDump o Wireshark). No obstante, por línea de comandos no es la única forma de especificar este tipo de filtros, también existe la posibilidad de crear ficheros con los filtros que se desea aplicar y pasarlos a la herramienta por medio de la opción “-f”. Existen algunos de estos ficheros que vienen con la herramienta y que permiten aplicar filtros que son bastante comunes cuando se trabaja con redes.

>netsniff-ng –in eth0 -f /etc/netsniff-ng/rules/icmp.bpf

Además de los filtros BPF, también soporta filtros especiales sobre el tipo de trafico a capturar aplicando el interruptor “-t”. Los posibles valores que puede asumir “-t” son los siguientes:

broadcast: Permite filtrar solamente el trafico broadcast.
multicast: Permite filtrar solamente el trafico multicast.
host: Permite filtrar solamente los paquetes cuyo destino es la máquina desde donde se ejecuta la herramienta.
others: Permite filtrar los paquetes cuyo origen o destino es distinto de la máquina desde donde se ejecuta la herramienta.
outgoing: Permite filtrar solamente los paquetes cuyo origen es la máquina desde donde se ejecuta la herramienta.

>netsniff-ng –in eth0 -t others -s

Por otro lado, tal como mencionaba anteriormente, también es posible la reinyección de trafico utilizando esta herramienta, para ello se puede utilizar un fichero PCAP o una interfaz de red que contendrá/capturará los paquetes de datos que serán reinyectados en una interfaz de red determinada. Para ello, se debe utilizar también el interruptor “–mmap” tal como se enseña en el siguiente comando

>netsniff-ng –in /home/adastra/Escritorio/dump.pcap –mmap –out eth0 -k1000 –silent

De esta forma, la herramienta leerá los paquetes de datos incluidos en el fichero PCAP especificado con la opción “–in” y dichos paquetes serán inyectados a la interfaz de red especificada con el interruptor “–out”. Esto evidentemente sirve para generar trafico en el segmento de red y posiblemente, generar estímulos sobre un objetivo determinado. Todo depende de los contenidos del fichero PCAP, pero desde luego es una opción bastante interesante si se desea producir algún tipo de respuesta por parte de un objetivo determinado en el segmento de red.
Existen algunas otras opciones en el comando netsniff-ng, sin embargo no es la única herramienta que incluye el paquete Netsniff-ng, existen otras herramientas que son igualmente interesantes y que merece la pena conocer.

Ifpps

Se trata de una herramienta que permite generar estadísticas en tiempo real sobre los “rings” TX y RX del sistema operativo. Permite la visualización de datos directamente desde la consola o exportar dicha información a ficheros CVS o GNUPlot. Además, como prácticamente todas las herramientas incluidas en Netsniff-ng, permite utilizar varias CPUs para un mejor desempeño.

>ifpps -d eth0 –promisc

>ifpps -d eth0 –promisc -c

Astraceroute

Funciona como traceroute para tracear los sistemas por los que pasa un paquete antes de llegar a su destino, el beneficio adicional de esta herramienta es que permite resolver el AS (Sistema Autónomo) de origen y utiliza la librería GeoIP para intentar obtener las referencias geográficas de cada AS encontrado.
Antes de poder utilizar esta herramienta, es necesario actualizar la base de datos de georeferencias con el siguiente comando.

>sudo astraceroute -i eth0 –update

Después de actualizar la base de datos, se puede utilizar el comando astraceroute con las opciones de configuración admitidas.

>astraceroute -i eth0 -N -F -L -H netsniff-ng.org

En este caso, se han utilizando las opciones -N y -F para ejecutar una resolución DNS inversa y enviando paquetes con la flag FIN habilitada respectivamente, luego -L y H permiten pintar las referencias geográficas encontradas (latitud y longitud) así como especificar el objetivo del análisis.
Espero que os haya gustado y que juguéis con esta estupenda herramienta.

Saludos y Happy Hack!
Adastra.