martes, 5 de agosto de 2008

PortSentry (detecta y bloquea escaneos de puertos)

PortSentry:
-----------

Monitorea escaneos de puertos que hacen hacia nuestras pc.
Incluye barridos ocultos.

Es una aplicacion muy potente, que junto con iptables podria evitar ataques a nuestros servidores.

Cuando escanean los puertos de nuestros servidores no quiere decir que nos esten atacando, simplemente estan investigando que servicios proveen nuestros servers. Pero un escaneo de puertos no es nada bueno.

Utilizamos PortSentry de la siguiente manera:
---------------------------------------------
* Ponemos un puerto a la escucha.
* Monitoreamos ese puerto, esperando que lo escaneen.
* Actuamos sobre la ip que nos escanea.


INSTALACION:
------------

#apt-get install portsentry

CONFIGURACION:
--------------

Trabaja de dos formas --> SIMPLE
\> STHEAL

SIMPLE - pongo puertos a la la escucha, para ver que sean escaneados. No es recomendado poner en escucha puertos que realmente estemos usando.

STHEAL - se especifica un puerto y portsentry pone a la escucha todos los que esten debajo de el especificado, sin tener en cuenta los que se utilizan realmente.

Yo pongo el puerto de sshd en otro puerto que el 22, es una practica comun para evitar generar muchos logs. En mi caso lo pongo en el 2222

#vim /etc/ssh/sshd_config
Reemplazo la linea:
Port 22
por la linea:
Port 2222

#/etc/init.d/ssh restart

Ahora dejamos el 22 libre para ponerlo a la escucha con portsentry para auditar los intentos de logueo.

Editamos el archivo de portsentry:

#cp /etc/portsentry/portsentry.conf /etc/portsentry/portsentry.conf.old
#vim /etc/portsentry/portsentry.conf

#######################
# Port Configurations #
#######################

# Use these for just bare-bones (para banear)
TCP_PORTS="22"


###########################################
# Advanced Stealth Scan Detection Options #
###########################################

ADVANCED_PORTS_TCP=”10244? #<– Monitorizará todos los puertos que no estén en uso, por debajo del 1024. Y, cual es el único puerto que está por debajo del 1024, que no se esté utilizando y que tenga acceso hasta la máquina a traves de la red? solo el 22 :-)
#ADVANCED_PORTS_UDP=”10244? #<– Esto lo tengo comentado, porque el router me para todas las conexiones UDP, es decir, que no llegarán a la máquina.

Dejamos el resto de la sección comentada, no incluimos puertos a ignorar, ya que Portsentry detectará automáticamente cuales están siendo utilizados por servicios legítimos y los obviará.

######################
# Configuration Files#
######################

# Hosts to ignore
IGNORE_FILE=”/etc/portsentry/portsentry.ignore”
# Hosts that have been denied (running history)
HISTORY_FILE=”/var/lib/portsentry/portsentry.history”
# Hosts that have been denied this session only (temporary until next restart)
BLOCKED_FILE=”/var/lib/portsentry/portsentry.blocked”

IGNORE_FILE –> Este fichero es el que utiliza Portsentry para su WhiteList, es decir, las IPs que están legitimadas para escanear puertos sin que tome medidas. Este fichero no se edita, si queremos añadir IPs a la WhiteList, lo hacemos editando el fichero /etc/portsentry/portsentry.ignore.static

HISTORY_FILE –> Aquí es donde Portenstry va guardando la gente que ha detectado escaneando nuestros puertos.

BLOCKED_FILE –> Aquí Portsentry guarda las IPs que han sido bloqueadas.

##############################
# Misc. Configuration Options#
##############################

RESOLVE_HOST = “00? # Esta opción la dejamos a 0. Lo que hace esto es resolver la dirección de las IPs atacantes, no nos interesa por varios motivos. Uno, es que ya hemos dicho que la gente utiliza máquinas que no son suyas, por lo tanto el resolver su dirección no nos va aportar nada y estamos haciendo un gasto de ancho de banda que esta gente no se merece, amén que si estamos siendo víctimas de un DDoS bien distribuido, pues seguramente al final consigamos hacer tanto gasto de ancho de banda resolviendo direcciones que acabaremos tirando nuestra máquina.

##################
# Ignore Options #
##################

BLOCK_UDP=”1"
BLOCK_TCP=”1"

Aquí indicamos las medidas a tomar con los atacantes.
0 –> No hace nada, solo lo notifica (en /var/log/syslog)
1 –> Bloquea las conexiones (verificar route -n)
2 –> Ejecuta un comando externo a Portsentry, por ejemplo, podemos utilizar esto para añadir una regla a iptables dropando todas las conexiones de la IP agresora.

###################
# Dropping Routes:#
###################

KILL_ROUTE=”/sbin/route add -host $TARGET$ reject”

Aqui, lo que hacemos es añadir la IP atacante a la tabla route de nuestra máquina, denegando todas sus conexiones, es tremendamente eficaz.
Podemos ver las reglas route de nuestra máquina ejecutando route -n
Si por error, haciendo pruebas, nos incluye una dirección IP que no queremos que esté ahí, para quitarla se hace

#route del -host reject

###############
# TCP Wrappers#
###############
###################
# External Command#
###################

Aquí es donde metemos los comandos que ejecutaremos externos a Porsentry si elegimos la opción 2 en las ignore Options. Por ejemplo, si tenemos soporte para iptables en nuestra máquina, añadimos una regla para que el firewall pare todas las conexiones del cabroncete.

KILL_RUN_CMD=”/sbin/iptables -A INPUT -s $TARGET -j DROP”
KILL_HOSTS_DENY=”ALL: $TARGET$ : DENY”

Aquí, añadimos la IP agresora a nuestro /etc/hosts.deny … una barrera más

###################
# External Command#
###################

Aquí es donde metemos los comandos que ejecutaremos externos a Porsentry si elegimos la opción 2 en las ignore Options. Por ejemplo, si tenemos soporte para iptables en nuestra máquina, añadimos una regla para que el firewall pare todas las conexiones del cabroncete.

KILL_RUN_CMD=”/sbin/iptables -A INPUT -s $TARGET -j DROP”

#####################
# Scan trigger value#
#####################

SCAN_TRIGGER=”00?

Aquí indicamos el número de puertos que han de ser escaneados para que el Portsentry actue contra el agresor. Es cojonudo dejarlo en 0, con que toque un puerto nos sobra, no somos personas generosas, estamos intentando proteger nuestro sistema y ya con que nos toquen el puerto 22 indica que a priori, no está pensando nada bueno.

######################
# Port Banner Section#
######################

Esto es una lamerada que solo funciona si se está ejecutando el modo normal, en teoria es un mensajito que saldrá a la persona que está violentando el puerto que tenemos a la escucha, yo paso de poner nada.

Por último, modificamos el fichero /etc/defaults/portsentry indicando al demonio el modo en el que debe iniciar.

TCP_MODE=”atcp”
#UDP_MODE=”udp”

Comentamos la parte udp, pq ya dije que en mi caso, lo para todo el router y le decimos mediante el parametro atcp que se inicie en modo avanzado y monitorizando las conexiones tcp.

Reiniciamos el servicio

#/etc/init.d/portsentry restart

Y ya está todo corriendo correctamente, Portsentry nos enviará alertas cuando nos ataquen a /var/log/syslog y mantendrá actualizada su lista de gente bloqueada y el historial en los ficheros que indicamos en esta configuración.

En la pc que tenemos corriendo portsentry ejecutamos:
#tail -f /var/log/syslog

Para ver los logs simplemente ejecutamos:

#nmap host-con-portsentry-instalado
Y veremos en el tail los logueos del nmap con la etiqueta "attackalert"


PARA CREAR REGLA DE IPTABLES:
-----------------------------
##################
# Ignore Options #
##################
# 0 = Do not block UDP/TCP scans.
# 1 = Block UDP/TCP scans.
# 2 = Run external command only (KILL_RUN_CMD)BLOCK_UDP="1"
BLOCK_UDP="1"
BLOCK_TCP="1"

###################
# Dropping Routes:#
###################
KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"
#No se puede combinar con otro, por ejemplo elijo el anterior o este:
#KILL_ROUTE="/sbin/route add -host $TARGET$ reject"
#nunca ambos

y cada vez que se escanea de la otra ip se crea un log en /etc/portsentry/portsentry.history <-- borrarla y reiniciar el demonio:
#/etc/init.d/portsentry

Hacer el escaneo desde el host remoto:
#nmap -sT 192.168.1.105

Verificar que se creo una regla de iptables en el server de portsentry:
#iptables -L

Para borrar la regla:
#iptables -D INPUT 1

Fuentes y Bibliografia:
-----------------------
* http://gnu4all.wordpress.com
* http://www.securityfocus.com/infocus/1580
* http://www.gwolf.org/seguridad/portsentry/node2.html

No hay comentarios: