Autor Tema: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)  (Leído 16753 veces)

0 Usuarios y 1 Visitante están viendo este tema.

hardwarer

  • Visitante
Hola, he escrito un script para openwrt BB 14.07 que banea  las direcciones IP que fallan la contraseña  Dropbear SSH mas de 2 veces o que intentan conectarse con usuarios no validos.
El script añade la direcion baneada a una cadena de iptables con destino DESCARTAR (DROP).
Las ips baneadas se borran al reiniciar el router, pero quedan grabadas en el archivo de log y se recargan al volver a encender.
Tiempo de baneo 24 horas, modificable dentro del script.
Animo a todos a modificar el script y mejorarlo o lo que sea.

Actualizacion 20.sept.2014

Cambiadas las cadenas de destino de baneo. Ahora el destino es input_wan_rule que es lo recomendado en la documentación de openwrt.

ACTUALIZACION 07 MARZO 2016:

EDITADO 08 marzo : Corregido el nombre del fichero de origen.

Novedades:
Instalacion automatica en /root modificable desde dentro del archivo de instalacion.
Funcionamiento configurable para WAN o LAN o ambas.
Se instala automaticamente en el cron para iniciarse cada 10 minutos.

Instalacion:
Copiar al router los dos archivos instalar.sh y fail2ban.pre a la carpeta /tmp o cualquier otra y ejecutar instalar.sh
# chmod 755 instalar.sh
#./instalar.sh

https://drive.google.com/open?id=0Bw50IJmzFr-FcU9UeHNIMjNneUU
https://drive.google.com/open?id=0Bw50IJmzFr-FLWlsRzRjOEc1UTA


Código: [Seleccionar]
# Directorio de instalacion por defecto "/root"
# Si cambiamos esto debemos cambiarlo tambien en el fichero ejecutable fail2ban.sh.

destino="/root"

touch $destino/fail2ban.sh
touch $destino/logfail2.log
cat fail2ban.pre > $destino/fail2ban.sh
chmod 755 $destino/fail2ban.sh

#Anadimos el script al crontab para que corra cada 10 minutos
sed -i '/'fail2ban'/d' /etc/crontabs/root
echo "# Script fail2ban" >>/etc/crontabs/root
echo "*/10 * * * * $destino/fail2ban.sh" >>/etc/crontabs/root
/etc/init.d/cron restart


Archivo fail2ban.pre (copiar en la misma carpeta que instalar.sh)

Código: [Seleccionar]

# Script que detecta los intentos de conexion fallidos al servidor SSH, ya sea por contrasena erronea
# o por usuario no valido y protege el sistema baneando la IP de origen utilizando el cortafuegos de Linux Iptables.
# Tiempo de baneo configurable y tablas de baneo de IP permanentes al reinicio del sistema.
# Probado en OpenWrt 14.04 Barrier Breaker.

#!/bin/sh
#============================================================================================================
#===========================================OPCIONES=========================================================

# Tiempo de baneo (en segundos). Transcurrido ese tiempo se desactiva el baneo y se quita la IP de la lista.
# Por defecto 24 horas, 86400 segundos.

ban_time=86400

# Directorio de instalacion del script donde estan los ficheros fail2ban.sh y logfail2.log
# Por defecto se instala automaticamente en "/root". Si hemos modificado el archivo de instalacion para instalar en otra carpeta, tambien debemos modificar este.

destino="/root"

# Funcionamiento en internet, red local o ambas. Descomentar la opcion deseada. Por defecto solo internet.
# input_wan_rule= Solo internet (defecto), input_lan_rule= Solo red local, input_rule funcionamiento en ambas redes.
# Si cambiamos este valor debemos reiniciar el router.

alcance="input_wan_rule"
#alcance="input_lan_rule"
#alcance="input_rule"

#=============================================================================================================
#======================================COMPROBACION INICIAL===================================================
#Si es la primera vez que lanzamos el script, debemos crear el fichero donde se guardan
#las ips baneadas.
if [ ! -f $destino/logfail2.log ]

then
touch $destino/logfail2.log
fi
# Comprobamos si acabamos de iniciar el router y en ese caso anadimos las direcciones IP baneadas del log
if [ ! -f /tmp/fail2ban.tmp ]
then
touch /tmp/fail2ban.tmp
for x in `cat $destino/logfail2.log |awk '{print $2}' FS=":"`
do iptables -I $alcance 1 -s $x -j LOG --log-prefix "--ATAQUE--FUERZA--BRUTA--";
iptables -I $alcance 2 -s $x -j DROP;
done
fi

#=============================================================================================
#===============================BANEO INTENTOS USUARIOS VALIDOS===============================

# Comprobamos las conexiones y el numero de veces que el resultado ha sido "Bad password"

for i in `logread|grep "Child connection"| awk '{print $11}'|awk '{print $1}' FS=":"`
do brute=`logread|grep 'Bad password'|grep $i |wc -l`;

# Si son mas de dos veces guardamos la IP en la variable "badip"
if [ "$brute" -gt 2 ];
then badip=`logread|grep "Bad password"|grep -m 1 $i| awk '{print $14}'|awk '{print $1}' FS=":"`

# Comprobamos si la direccion IP ya esta en la lista de baneados:
oldban=`cat $destino/logfail2.log |grep $badip|wc -l`;

# Si la IP no aparece en la lista la anadimos a iptables.
if [ "$oldban" -lt 1 ];
then iptables -I $alcance 1 -s $badip -j LOG --log-prefix "--ATAQUE--FUERZA--BRUTA--";
iptables -I $alcance 2 -s $badip -j DROP;

# Por ultimo anadimos la IP al archivo de baneados "$destino/logfail2.log" y la hora a la

# que terminara el baneo de esa IP en formato epoch(segundos desde 01-01-1970)
fecha_actual=`date +%s`
unban_date=`expr $fecha_actual + $ban_time`
echo "$unban_date:$badip" >> $destino/logfail2.log;
fi;
fi;
done;

#================================================================================================
#===============================BANEO INTENTOS USUARIOS NO VALIDOS===============================                

# Comprobamos las conexiones y el numero de veces que el resultado ha sido "invalid shell"                                                                          

for i in `logread |grep "Child connection"|awk '{print $11}'|awk '{print $1}' FS=":"'`
do brute=`logread|grep -A 4 $i |grep "Login attempt for nonexistent"|wc -l`

if [ "$brute" -gt 2 ];                                                                                                                                            
then badip=`logread|grep "Child connection"|grep -m 1 $i| awk '{print $11}'|awk '{print $1}' FS=":"`
# Comprobamos si la direccion IP ya esta en la lista de baneados:                                                                                                
oldban=`cat $destino/logfail2.log |grep $badip|wc -l`;                                                                                                              
                                                                                                                                                                  
# Si la IP no aparece en la lista la anadimos a iptables.                                                                                                        
if [ "$oldban" -lt 1 ];                                                                                                                                          
then iptables -I $alcance 1 -s $badip -j LOG --log-prefix "--ATAQUE--FUERZA--BRUTA--";                                                                      
iptables -I $alcance 2 -s $badip -j DROP;                                                                                                                  
                                                                                                                                                                  
# Por ultimo anadimos la IP al archivo de baneados "$destino/logfail.log" y la hora a la
# que terminara el baneo de esa IP en formato epoch(segundos desde 01-01-1970)
fecha_actual=`date +%s`                                                                              
unban_date=`expr $fecha_actual + $ban_time`                                                                  
echo "$unban_date:$badip" >> $destino/logfail2.log;
fi;                                                                                              
fi;                                                                                              
done;                            


#================================================================================================
#=========================BORRADO DE BANEO TRANSCURRIDO EL TIEMPO ASIGNADO=======================

# Un bucle comprueba si alguno de los registros del fichero logfail2.log tiene una fecha anterior
# a la actual. En caso afirmativo borra las reglas de iptables y los registros del log.

fecha_actual=`date +%s`
for z in `cat $destino/logfail2.log`
do unban_time=`echo $z|awk -F ":" '{print $1}'`
unban_ip=`echo $z|awk -F ":" '{print $2}'`
if [ "$unban_time" -lt "$fecha_actual" ]
then sed -i '/'$unban_ip'/d' $destino/logfail2.log
unban_rule=`iptables -L -n --line-numbers|grep -m 1 $unban_ip|awk '{print $1}'`
iptables -D $alcance $unban_rule
iptables -D $alcance $unban_rule
fi
done



« Última modificación: 08-03-2016, 10:13 (Martes) por hardwarer »

vk496

  • Visitante
Re: Re: Script baneador de direcciones IP SSH para openwrt
« Respuesta #1 en: 13-09-2014, 12:23 (Sábado) »
Muy bueno!

Tengo que probarlo

Salu2

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 1940
Re: Script baneador de direcciones IP SSH para openwrt
« Respuesta #2 en: 13-09-2014, 13:33 (Sábado) »
Muy buena idea...  >:( >:( >:(
No habrás entendido algo, hasta que seas capaz de explicárselo a tu abuela...
Hacemos pantallas con píxeles casi invisibles, para luego ampliar la letra porque no la vemos... Bonita paradoja...
Creamos analfabetos tecnológicos con una velocidad pasmosa. Todo el mundo "maneja" tecnología, casi nadie sabe lo que tiene entre las manos, pero todo el mundo opina.
El analfabetismo, antes, pasaba desapercibido. Ahora, se transmite por Internet y las redes sociales.
Solo a un mandril epiléptico se le podría haber ocurrido diseñar la cinta de menú de M$.

hardwarer

  • Visitante
Re: Script baneador de direcciones IP SSH para openwrt
« Respuesta #3 en: 13-09-2014, 15:11 (Sábado) »
Me alegra que os guste el script, mas adelante me gustaria añadirle algunas funciones automaticas mas como por ejemplo:

Volver a banear automaticamente las IP al encender el router, en vez de tener que hacerlo uno mismo.
Establecer un tiempo de baneo configurable por el usuario.
Creo que con eso ya sería suficiente para enfrentarse a los robot SSH que circulan por la red, que no son pocos  :P

Si alguien necesita ayuda para hacerlo funcionar o para configurarlo en otro sistema que me lo diga y lo miro.

SALU2

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 1940
Re: Script baneador de direcciones IP SSH para openwrt
« Respuesta #4 en: 13-09-2014, 17:41 (Sábado) »
Me alegra que os guste el script, mas adelante me gustaria añadirle algunas funciones automaticas mas como por ejemplo:

Volver a banear automaticamente las IP al encender el router, en vez de tener que hacerlo uno mismo.
Establecer un tiempo de baneo configurable por el usuario.
Creo que con eso ya sería suficiente para enfrentarse a los robot SSH que circulan por la red, que no son pocos  :P

Eso sí que sería un buen aporte...  ;D
No habrás entendido algo, hasta que seas capaz de explicárselo a tu abuela...
Hacemos pantallas con píxeles casi invisibles, para luego ampliar la letra porque no la vemos... Bonita paradoja...
Creamos analfabetos tecnológicos con una velocidad pasmosa. Todo el mundo "maneja" tecnología, casi nadie sabe lo que tiene entre las manos, pero todo el mundo opina.
El analfabetismo, antes, pasaba desapercibido. Ahora, se transmite por Internet y las redes sociales.
Solo a un mandril epiléptico se le podría haber ocurrido diseñar la cinta de menú de M$.

hardwarer

  • Visitante
Re: Script baneador de direcciones IP SSH para openwrt
« Respuesta #5 en: 14-09-2014, 10:08 (Domingo) »
Estoy intentando modificar el script para que banee una IP durante X tiempo y luego sea desbaneado (Creo que es mas util contra los bots asi), pero no me furula la cabeza bien a estas horas. Dejo aquí el invento para no perderlo y lo acabo otro dia.
Salu2

Añadido al script:

Baneo automatico de las IPs en la primera ejecucion del script despues de reiniciar el router.
Opcion para configurar el tiempo de baneo (default 86400 segundos= 24 horas)
Desbaneo automatico de las IPs despues del tiempo de baneo.
Deteccion de intentos de conexion con usuarios no validos.
« Última modificación: 20-09-2014, 10:21 (Sábado) por hardwarer »

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 1940
@hardwarer : Estás hecho un "mostruo"...  >:( >:( >:(
No habrás entendido algo, hasta que seas capaz de explicárselo a tu abuela...
Hacemos pantallas con píxeles casi invisibles, para luego ampliar la letra porque no la vemos... Bonita paradoja...
Creamos analfabetos tecnológicos con una velocidad pasmosa. Todo el mundo "maneja" tecnología, casi nadie sabe lo que tiene entre las manos, pero todo el mundo opina.
El analfabetismo, antes, pasaba desapercibido. Ahora, se transmite por Internet y las redes sociales.
Solo a un mandril epiléptico se le podría haber ocurrido diseñar la cinta de menú de M$.

vk496

  • Visitante
Buha, que buena XD

Pido que se borre el comentario mio (#6), el cabroncete no ha tenido piedad, lo ha hecho el solito.


Solo una cosa que comentar:

zone_wan_input no me funciona en OpenWRT. A mi me va con: INPUT

Salu2

hardwarer

  • Visitante
Buha, que buena XD

Pido que se borre el comentario mio (#6), el cabroncete no ha tenido piedad, lo ha hecho el solito.


Solo una cosa que comentar:

zone_wan_input no me funciona en OpenWRT. A mi me va con: INPUT

Salu2

 ;D siempre me pasa igual cuando me pongo con un script, empiezo a pensar, oye estaría bien que hiciera esto y lo otro y tambien aquello... y no paro hasta que funciona y si hace falta ni duermo  ;D ;D

Por cierto si que es verdad, usar las cadenas "reservadas" como zone_wan_input puede dar problemas, y ya lo advierten en la documentacion y no recomiendan usarlas para añadir cadenas personalizadas, por eso han puesto las cadenas de usuario "input_wan_rule, input_lan_rule etc... pero como a mi me funcionaba mientras lo probaba pues lo he dejado así, pero otro día lo cambio para que sea 100% compatible usando la cadena input_wan_rule que sería lo recomendable
salu2

Desconectado jar229

  • Moderador
  • *
  • Mensajes: 4582
Le pongo chincheta unas semanitas y lo añado al [Índice] Hilos relevantes de OpenWrt
Valoraciones positivas en compra/venta:
121 en Htcmania
147 en Har2mano
19 en elchapuzasinformatico
10 en gsmspain
 ....
 
Mis equipos en venta: https://drive.google.com/open?id=1MTlgSAbTP08EL7ujiamnJVy31be9LogZ

Pteridium

  • Visitante
Re:
« Respuesta #10 en: 19-09-2014, 10:54 (Viernes) »
Yo tenía el mismo problema y lo solucioné cambiando el puerto SSH, pero esta solución mola más.

hardwarer

  • Visitante
Re:
« Respuesta #11 en: 19-09-2014, 17:25 (Viernes) »
Yo tenía el mismo problema y lo solucioné cambiando el puerto SSH, pero esta solución mola más.


Yo también lo solucioné cambiando el puerto a uno muy superior pero.....despues de unos días encontraron el servicio en ese otro puerto también!! (y eso que es un puerto por encima de 1024, los famosos well known)
Supngo que es cuestión de tiempo, primero unos robots escanean todos los puertos y luego en función de la respuesta ya saben que servicio está corriendo y al ataque otra vez... y como tengo la máquina funcionando 24/7 al final te encuentran...

Pteridium

  • Visitante
Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linu
« Respuesta #12 en: 19-09-2014, 17:56 (Viernes) »
Yo tenía el mismo problema y lo solucioné cambiando el puerto SSH, pero esta solución mola más.


Yo también lo solucioné cambiando el puerto a uno muy superior pero.....despues de unos días encontraron el servicio en ese otro puerto también!! (y eso que es un puerto por encima de 1024, los famosos well known)
Supngo que es cuestión de tiempo, primero unos robots escanean todos los puertos y luego en función de la respuesta ya saben que servicio está corriendo y al ataque otra vez... y como tengo la máquina funcionando 24/7 al final te encuentran...
Yo le puse el puerto 24 y hasta el día de hoy... También hay que decir que sólo está el 24 abierto al exterior y luego hay tres más redirigidos.  ^-^

vk496

  • Visitante
Yo os puedo pasar mi IP con el puerto...  Y ya os podéis tirar toda la vida probando, que nunca lo adivinareis XD

Salu2

mirasu

  • Visitante
Yo estoy buscando algo asi para mi ordenador. Puedo usar este script? o que podria hacer para hacerlo con todos los puertos importantes?


hardwarer

  • Visitante
Yo os puedo pasar mi IP con el puerto...  Y ya os podéis tirar toda la vida probando, que nunca lo adivinareis XD

Salu2
A mi tampoco me van a sacar la contraseña por fuerza bruta por mucho que lo intenten, al menos las 64^9 primeras veces.... ;D
El problema no es solo ese, sino el hecho de que si un robot está lanzando intentos de autenticacion como un loco te va a llenar los archivos de log de "basura" y te está consumiendo ancho de banda, ademas si tienes priorizado con qos ese puerto como es mi caso pues la cosa se pone peor todavía... Personalmente me he encontrado los log con miles de intentos en una sola noche.

hardwarer

  • Visitante
Yo estoy buscando algo asi para mi ordenador. Puedo usar este script? o que podria hacer para hacerlo con todos los puertos importantes?


Para Linux tienes fail2ban, un script escrito con Python que se puede configurar para cualquier puerto o aplicacion.
No tengo ni idea si existe algo así para windows.

mirasu

  • Visitante
Re:
« Respuesta #17 en: 20-09-2014, 10:31 (Sábado) »
Muchas gracias hardwrer

arfonzo

  • Visitante
Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
« Respuesta #18 en: 01-10-2014, 19:10 (Miércoles) »
Una pregunta de novato total, ¿cómo se ejecuta un script?
¿Se crea el archivo en formato.sh y se ejecuta como el de la configuración de Movistar de Noltari?

arfonzo

  • Visitante
Una pregunta de novato total, ¿cómo se ejecuta un script?
¿Se crea el archivo en formato.sh y se ejecuta como el de la configuración de Movistar de Noltari?
Vale, creo que me voy aclarando un poco.
No se hace como lo de movistar, estoy casi seguro.
¿Donde se añade?, ¿desde luci o modificando algún archivo con vi?