Nuevo preprocesador de Snort Passive Port Discovery

(You can find the English version of this post clicking here, or scrolling down some paragraphs)

Desde hace algún tiempo hemos estado trabajando en el desarrollo de un preprocesador para la sonda de detección de intrusos de Snort capaz de aprender de una red el conjunto de activos que la conforman, así como los servicios que estos ofrecen, de una forma totalmente pasiva. Esta aproximación nos otorga la ventaja de poder obtener un mapeo de puertos sin interactuar con las máquinas del entorno. A su vez y dependiendo de la topología de red, esto nos permite obtener información de hosts sobre los que posiblemente no tengamos visión directa sobre ellos, bien porque estén desconectados o bien porque existen reglas de filtrado que no nos permitan llegar a ellos. Este puede ser el caso de una gran red donde gestionamos un Sistema de Detección de Intrusos basado en Snort, capaz de observar todo el tráfico de red, pero donde el segmento del equipo del administrador de seguridad carece de visibilidad sobre ciertas subredes de la organización. Otra de las capacidades es la de observar de forma rápida el conjunto de activos y servicios de nuestra red con tan solo consultar su base de conocimiento. Un ejemplo de la misma se muestra a continuación:

192.168.20.45:1310714459:2869
192.168.20.43:1310649818:22,23,80,81,111,113,139,389,445,901,8010
192.168.20.40:1310645266:22,80,81
192.168.20.38:1310656339:443,3389,139,445
192.168.20.30:1310714459:23,2869
192.168.20.21:1310649818:22,23,80,81,8010
192.168.20.15:1310645266:22,80,81
192.168.20.1:1310656339:443,3389

Si además de su funcionamiento de forma individual se procede a integrarlo con sistemas de correlación, podemos identificar casos donde:

1. Se detecta una alerta de intento de explotar una vulnerabilidad.
2. Se identifica un nuevo puerto abierto.

Este caso podría detectar la ejecución de forma exitosa de un exploit que abre un nuevo puerto bindeado a una Shell, como por ejemplo el típico payload de Metasploit bind_tcp al puerto 4444 o cualquier otro “custom exploit“.

Para llevar a cabo esta tarea de detección, el preprocesador utiliza una base de conocimiento que es alimentada durante los períodos de aprendizaje y alerta. Este primer período se define como el tiempo en el que el preprocesador recolecta la información de un host concreto antes de iniciar el proceso de notificación, de modo que para cada activo descubierto pasado su tiempo de aprendizaje, éste alertará de los nuevos servicios (TCP/UDP) descubiertos. Toda esta información es almacenada en memoria en una estructura de Arbol n-ario donde los nodos hoja son los encargados de almacenar los datos de cada dirección IP.

Por lo tanto el caso general presenta tantos hosts como nodos terminales existen en el árbol, para este ejemplo concreto tenemos 21 direcciones IP descubiertas, tales como 10.2.5.14 o 192.2.8.16, entre otras. Para desplegar el preprocesador se debe configurar el archivo snort.conf con los siguientes parámetros:

  • alert_host [Bool]: parámetro que activa la notificación de nuevos hosts descubiertos, toma valor 1 para activar o valor 0 para desactivar.
  • knowledgebase [archivo]: archivo donde se guardara cada “timing_knowledgebase” el conjunto de la base de conocimiento, es decir las IPs descubiertas y sus puertos.
  • timing_knowledgebase [tiempo]: período de tiempo en segundos por el cual el preprocesador guardará a disco la base de conocimiento.
  • training [tiempo]: valor en segundos del proceso de aprendizaje. Cuando una nueva IP es detectada en la red y pertenece al entorno de protección (típicamente $HOME_NET), se establece una marca de tiempo a partir de la cual comenzara a contar el timer de aprendizaje. Todo nuevo puerto descubierto en ese host no sera notificado (pero si aprendido) hasta que finalice el valor establecido en el parámetro training.
  • proto [TCP,UDP,TCP/UDP]: protocolo sobre el que trabajará el preprocesador, si tan solo se especifica TCP como protocolo entonces solo este tipo de paquetes serán procesados y notificados. Puede tomar los valores especificados entre [].
  • direccionamiento [IP,SUBNET]: listado de direcciones IP o subredes a proteger. Típicamente se utilizará la variable HOME_NET. Es posible especificar direcciones host (ej. 192.168.2.1) o subredes (192.168.2.0/24). El listado a de ser presentado entre [] y separado por comas en caso de no utilizar la variable $HOME_NET.

Un ejemplo de configuración podría ser el siguiente:

preprocessor pasive_port_discover: alert_host 1 \
                                    knowledgebase  /snort/etc/knowledgebase.txt \
                                    timing_knowledgebase 25200 \
                                    training 172800 \
                                    proto TCP \
                                    subnets $HOME_NET

Cualquier duda, comentario o sugerencia es bienvenida.


(English version follows)

We are working on a snort preprocessor with passive port discovery capabilities, able to learn the hosts and services from a network. This approach gives us a good way to construct a host-port map without interaction with the assets. Depending on the network topology this preprocessor will allow us to obtain host information that may not be directly visible, either because they are disconnected or because there are filtering rules that don’t allow us to reach them.

This may be the case in a large network where we manage an Intrusion Detection System based on Snort, which can observe all network traffic, but where the segment of the security administrator’s computer lacks visibility of certain subnets in the organization. Another capability is to look quickly at the set of assets and services of our network just checking their knowledge base. An example of the knowledge base is shown below:

192.168.20.45:1310714459:2869
192.168.20.43:1310649818:22,23,80,81,111,113,139,389,445,901,8010
192.168.20.40:1310645266:22,80,81
192.168.20.38:1310656339:443,3389,139,445
192.168.20.30:1310714459:23,2869
192.168.20.21:1310649818:22,23,80,81,8010
192.168.20.15:1310645266:22,80,81
192.168.20.1:1310656339:443,3389

In addition to their individual performance, we can to proceed to integrate it with correlation systems, identifying two facts:

1. An alert produced by an attempt to exploit a generic vulnerability.
2. The system Identifies a new open port.

The successfully execution of an exploit which opens a new port binded to a Shell, such as the typical Metasploit payload to port 4444 bind_tcp or any other custom exploit could be detected.
In order to perform this detection task, the preprocessor uses a knowledge base that is fed during periods of learning and notification. This first period is defined as the time during which the preprocessor collects information from a particular host before starting the notification process. Thus, when the learning period is finished for a given host, the preprocessor will report new services (TCP / UDP) discovered. All this information is stored in memory in a structure of n-ary tree where leaf nodes are responsible for storing data for each IP address.

Therefore the general case has as many hosts as there are terminal nodes in the tree, in this particular example we have 21 IP addresses discovered, such as 10.2.5.14 or 192.2.8.16, among others.
In order to deploy the preprocessor we must to configure the snort.conf file with the following parameters :

  • alert_host [Bool]: parameter that triggers notification of newly discovered hosts. Value 1 to enable or to 0 to disable.
  • knowledgebase [file]: The file where we will save each “timing_knowledgebase” the entire knowledge base.
  • timing_knowledgebase [time]: time interval in seconds between writes of the knowledge base to disk.
  • training [time]: seconds value for the learning process. When a new IP is detected on the network and it belongs to the protective environment (typically $ HOME_NET) the ip is stamped with the time stamp when the host was discovered. New ports discovered on that host will not be reported until the end of the value set in parameter training.
  • proto [TCP, UDP, TCP / UDP]: protocol on which the preprocessor will work, if only TCP is specified then only such packets will be processed and reported. Takes one of the values in [].
  • address [IP, SUBNET]: list of IP addresses or subnets to protect. Typically use the HOME_NET variable. You can specify host addresses (eg 192.168.2.1) or subnet (192.168.2.0/24). The list must be presented between [] and separated by commas if you do not use the variable $HOME_NET.

An example configuration file is as follows:

preprocessor passive_port_discover: alert_host 1 \
                                    knowledgebase  /snort/etc/knowledgebase.txt \
                                    timing_knowledgebase 25200 \
                                    training 172800 \
                                    proto TCP \
                                    subnets $HOME_NET

Opinions, doubts and comments are wellcomed.

Comments

  1. Me recuerda mucho al PADS (http://passive.sourceforge.net/). Aunque este proyecto está muerto del todo, según parece.

Trackbacks

  1. […] Nuevo preprocesador de Snort Passive Port DiscoveryDesde hace algún tiempo hemos estado trabajando en el desarrollo de un preprocesador para la sonda de detección de intrusos de Snort capaz de aprender de una red el conjunto de activos que la conforman, así como los servicios que estos ofrecen, de una forma totalmente pasiva. […]

  2. […] Preprocesador para Snort: Passive Port Discovery: Es posible desarrollar un preprocesador para un IDS basado en Snort que nos permita alertarnos de nuevos equipos y nuevos servicios, tras analizar el tráfico de una red previamente conocida. […]