Thursday, November 02, 2006

IDS qué se sabe? Portsentry como NIDS

En este post vamos a ver cómo usar Porsentry (un excelente NIDS o IPS como quieran calificarlo, desarrollado por la empresa Psionic desde octubre del 2002 propiedad de Cisco), en su configuración básica, dejando a gusto del consumidor los aderezos.

Vamos a usar un 2.6.17-gentoo-r7, con iptables 1.3.5-r4 y portsentry 1.2

A lo nuestro:

~# emerge iptables

~# emerge portsentry


Ahora tenemos que configurar portsentry para ello vamos a hacer una copia del file de ejemplo

~# cp /etc/portsentry/portsentry.conf.sample /etc/portsentry/portsentry.conf

y luego lo editamos:

~# vi /etc/portsentry/portsentry.conf


En la sección Port Configurations vamos a usar la siguiente configuración de puertos TCP y UDP que queremos scannear:

# Un-comment these if you are really anal:

TCP_PORTS="1,7,9,11,15,70,79,80,109,110,111,119,138,139,143,512,

513,514,515,540,635,1080,1524,2000,2001,4000,4001,5742,6000,

6001,6667,12345,12346,20034,27665,30303,32771,32772,32773,

32774,31337,40421,40425,49724,54320"

UDP_PORTS="1,7,9,66,67,68,69,111,137,138,161,162,474,513,517,

518,635,640,641,666,700,2049,31335,27444,34555,32770,32771,

32772,32773,32774,31337,54321"

NOTA: Ojo acá los que usan Xserver por el puerto 6000.

y comentamos las demás.


En la sección Advanced Stealth Scan Detection Options decomentamos las líneas:

ADVANCED_PORTS_TCP="1024"

ADVANCED_PORTS_UDP="1024"

para decirle a portsentry, que en modo avanzado, solamente monitoree por debajo de éstos.


Además vamos a decomentar:

# Default TCP ident and NetBIOS service

ADVANCED_EXCLUDE_TCP="113,139"

# Default UDP route (RIP), NetBIOS, bootp broadcasts.

ADVANCED_EXCLUDE_UDP="520,138,137,67"

lo cual nos servirá para evitar falsos positivos si es que estamos por ej. en un entorno WIN donde NetBIOS hace uso de TCP 113 auth para autenticar y 139 netbios-ssn para gestionar la sesión. Y los puertos UDP 520 para efs y ruteo local, 138 netbios-dgm, 137 netbios-ns y 67 bootps.


En la sección Configuration Files debemos especificar una serie de variables necesarias para el buen funcionamiento:

IGNORE_FILE="/etc/portsentry/portsentry.ignore"

La variable IGNORE_FILE guarda el path de un file llamado portsentry.ignore que será el lugar donde debemos agregar los hosts o redes que NO QUEREMOS scannear. Por lo general los hosts / redes de confianza irían aquí.



HISTORY_FILE="/etc/portsentry/portsentry.history"

La variable HISTORY_FILE guarda el path de un file llamado portsentry.history donde se almacenarán todos hosts que fueron denegados desde la instalación del servicio y


BLOCKED_FILE="/etc/portsentry/portsentry.blocked"

La variable BLOCKED_FILE guarda el path de un file llamado portsentry.blocked similar a la anterior sólo que ésta guarda los hosts denegados en la sesión actual o hasta el siguiente reinicio.



En la sección Misc. Configuration Options, vamos a decomentar:

RESOLVE_HOST = "1"

lo cual permitirá realizar el giro de las solicitudes de búsqueda DNS de los host atacantes.


En la sección Ignore Options, vamos a incluir:

BLOCK_UDP="1"

BLOCK_TCP="1"

estas variables van a indicarle a portsentry que en caso de detección de un ataque, bloque los puertos TCP y UDP para el target en cuestión. Podemos elegir que hacer 0: no bloquear, 1 bloquear y 2 correr comandos externos que bien podría ser generar alguna alerta a los administradores, a través del envio de mails por ej.


La sección Dropping Routes está dedicada a limitar / restringir rutas o host a través de reglas en las tablas locales. Por ej: podríamos incluir la siguiente:

KILL_ROUTE="/sbin/route add -host $TARGET$ gw 333.444.555.666"

la cual agregaría una entrada a nuestra tabla de ruteo local, indicándole al SO que cualquier tráfico proveniente de la IP contenida en $TARGET$ (la cual sería de nuestro atacante) sea enviada a un gateway inexistente. *IMPORTANTE* sólo una de éstas reglas pueden estar activas a la vez.


Si bien lo anterior podría servirnos en ataques no muy elevados, lo que se recomiendo es usar algún tipo de firewall para añadir más seguridad. Para ello podemos agregar reglas de firewall como por ej. la siguiente:

KILL_ROUTE="/usr/local/bin/iptables -I INPUT -s $TARGET$ -j DROP"

la cual impediría el tráfico de entrada proveniente de nuestro posible atacante.

NOTA: existen varias implementaciones de firewalls soportadas en distintas plataformas, iptables es sólo un ej.


Casi finalizando, contamos con la sección TCP Wrappers de la cual vamos a decomentar la opción:

KILL_HOSTS_DENY="ALL: $TARGET$"

la cual incluirá la IP de nuestro atacante en el file /etc/hosts.deny (una medida más de seguridad) independiente del packet filter que usemos.


Por el momento no vamos a incluir nada en la sección External Command, pero si mencionaremos que es posible accionar un comando tanto antes como después la aplicación de una regla.

NOTA: No se recomienda realizar contra ataques al origen como medida de defensa, está comprobado estadísticamente que es peor que la enfermedad.


Para finalizar la sección Scan trigger value, nos servirá para decirle a portsentry con qué rapidez actuar en caso de detección de tráfico anómalo, si especificamos esta variable en 0, le estaremos diciendo al mismo que reaccione inmediatamente. Lo anterior es lo que vamos a hacer:

SCAN_TRIGGER="0"

Podríamos establecerlo en valores como 1 o 2 para dar un aviso primero y luego aplicar reglas, etc.


No soy partidario de utilizar mensajes de banneo, pero cabe aclarar que esta posibilidad está abierta si alguien lo desea en la sección Port Banner Section.


Lo que nos queda:

Verificar que nuestro iptables esté funcionando correctamente para lo cual vamos a ejecutar:

~# /etc/init.d/iptables status

* status: stopped

y si está parado como en nuestro caso vamos a iniciarlo.

~# /etc/init.d/iptables start

  • Loading iptables state and starting firewall ... [ ok ]


Antes de iniciar a portsentry vamos a editar dos files:

El primero:

~# vi /etc/conf.d/portsentry


#PORTSENTRY_MODES="udp tcp"

#PORTSENTRY_MODES="stcp sudp"

PORTSENTRY_MODES="atcp audp"

donde vamos a seleccionar el modo de scanneo del mismo.


El segundo Y NO SE OLVIDEN a menos que quieran ser vaneados uds mismos:

~# vi /etc/portsentry/portsentry.ignore

#Para evitar bannear el uso de loopback

127.0.0.1/32

#Para evitar bannear nuestro host ej.

172.16.0.178

#Podríamos incluir redes completas como el caso de

172.16.0.0/24


Ahora si a iniciar portsentry:

~# /etc/init.d/portsentry start

  • Starting portsentry ... [ ok ]


Listo ahora los logs pueden verse en el messages, ya que portsentry trabaja con syslog y es ahí donde los almacena.

Por ej podríamos verlo con:

~# tail -F /var/log/messages | grep portsentry


Por el momento eso es todo.

Categoría and Technorati tags: catNetworking

1 comment:

Dario Quintana said...

Buen post señor Matías.
Interesante blog ;)

Saludos