Seguridad Wireless - Wifi

Equipos y materiales => Puntos de acceso, routers, switchs y bridges => Openwrt & LEDE => Mensaje iniciado por: hardwarer en 13-09-2014, 12:06 (Sábado)

Título: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: hardwarer en 13-09-2014, 12:06 (Sábado)
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

Título: Re: Re: Script baneador de direcciones IP SSH para openwrt
Publicado por: vk496 en 13-09-2014, 12:23 (Sábado)
Muy bueno!

Tengo que probarlo

Salu2
Título: Re: Script baneador de direcciones IP SSH para openwrt
Publicado por: Tki2000 en 13-09-2014, 13:33 (Sábado)
Muy buena idea...  >:( >:( >:(
Título: Re: Script baneador de direcciones IP SSH para openwrt
Publicado por: hardwarer 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
Título: Re: Script baneador de direcciones IP SSH para openwrt
Publicado por: Tki2000 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
Título: Re: Script baneador de direcciones IP SSH para openwrt
Publicado por: hardwarer 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.
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: Tki2000 en 14-09-2014, 13:13 (Domingo)
@hardwarer : Estás hecho un "mostruo"...  >:( >:( >:(
Título: Re: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: vk496 en 14-09-2014, 23:35 (Domingo)
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
Título: Re: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: hardwarer en 15-09-2014, 00:00 (Lunes)
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
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: jar229 en 15-09-2014, 11:16 (Lunes)
Le pongo chincheta unas semanitas y lo añado al [Índice] Hilos relevantes de OpenWrt (https://foro.seguridadwireless.net/openwrt/(indice)-hilos-relevantes-de-openwrt/)
Título: Re:
Publicado por: Pteridium 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.
Título: Re:
Publicado por: hardwarer 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...
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linu
Publicado por: Pteridium 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.  ^-^
Título: Re: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: vk496 en 19-09-2014, 20:09 (Viernes)
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
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: mirasu en 19-09-2014, 20:48 (Viernes)
Yo estoy buscando algo asi para mi ordenador. Puedo usar este script? o que podria hacer para hacerlo con todos los puertos importantes?

Título: Re: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: hardwarer en 20-09-2014, 10:13 (Sábado)
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.
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: hardwarer en 20-09-2014, 10:16 (Sábado)
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.
Título: Re:
Publicado por: mirasu en 20-09-2014, 10:31 (Sábado)
Muchas gracias hardwrer
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: arfonzo 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?
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: arfonzo en 02-10-2014, 12:32 (Jueves)
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?
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: arfonzo en 02-10-2014, 16:36 (Jueves)
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?
Y sigo investigando:
¿Se mete en el apartado de reglas propias del cortafuegos?
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: Tki2000 en 03-10-2014, 10:09 (Viernes)
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?

Crea un fichero con vi y copia el contenido dentro.
Graba el fichero y házlo ejecutable con
Código: [Seleccionar]
chmod +x miscript.shEjecútalo con ./miscript.sh &

Mi consejo sería ponerlo para ejecutarse en /etc/rc.local antes del exit 0 para que se ejecute inmediatamente al reiniciar el router.

Código: [Seleccionar]
/lugardondeesteelscript/miscript.sh &

exit 0

Y después hacer que se ejecute cada cierto tiempo mediante cron:

Nos vamos a System -> Scheduled Tasks y agregamos lo siguiente:

Código: [Seleccionar]
*/5 * * * * /lugardondeesteelscript/miscript.sh
Si quieres editarlo manualmente, el fichero está en /etc/contabs/root
Con lo anterior ejecutamos el script cada 5 minutos.

Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: arfonzo en 03-10-2014, 10:58 (Viernes)
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?

Crea un fichero con vi y copia el contenido dentro.
Graba el fichero y házlo ejecutable con
Código: [Seleccionar]
chmod +x miscript.shEjecútalo con ./miscript.sh &

Mi consejo sería ponerlo para ejecutarse en /etc/rc.local antes del exit 0 para que se ejecute inmediatamente al reiniciar el router.

Código: [Seleccionar]
/lugardondeesteelscript/miscript.sh &

exit 0

Y después hacer que se ejecute cada cierto tiempo mediante cron:

Nos vamos a System -> Scheduled Tasks y agregamos lo siguiente:

Código: [Seleccionar]
*/5 * * * * /lugardondeesteelscript/miscript.sh
Si quieres editarlo manualmente, el fichero está en /etc/contabs/root
Con lo anterior ejecutamos el script cada 5 minutos.



Ok, mil gracias, en cuanto llegue a casa lo pruebo.
Así da gusto hasta para un novato...

Edito, que a veces corro mucho y así tardo más.
¿cuando dices que lo grabe y luego te refieres a "/lugardondeesteelscript/", lo puedo grabar en /root/ o en algun otro sitio?
Cuando hice el escript de Noltari para imagenio copie directamente el "movistar.sh" ahí con el programa winSCP, imagino que así también valdra.
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: arfonzo en 03-10-2014, 11:26 (Viernes)
Vale, sigo intentando aprender, a ver si es algo así lo que tengo que hacer:

Abro la terminal por Putty
escribo "vi scriptbaneo.sh"
copio el contenido dentro: selecciono todo, Control+C, voy a Putty y pincho con botón derecho del raton.
escribo ":wq"

escribo "chmod +x scriptbaneo.sh
escribo "./scriptbaneo.sh

abro /etc/rc.local con el winSCP (seguro que hay otra manera, pero soy muyyy novato)
edito con winSCP es fichero añadiendo: "/lugardondeesteelscript/scriptbaneo.sh &" antes de la linea "exit 0"

¿lo he entendido bien?
Ahora solo me falta saber donde puedo colocar el script, es decir saber "/lugardondeesteelscript/", que es lo que preguntaba antes si puede ser en "/root/" o es mejor en otro sitio.

Gracias y disculpad la ignorancia.
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: Tki2000 en 03-10-2014, 12:16 (Viernes)
Vale, sigo intentando aprender, a ver si es algo así lo que tengo que hacer:

Abro la terminal por Putty
escribo "vi scriptbaneo.sh"
copio el contenido dentro: selecciono todo, Control+C, voy a Putty y pincho con botón derecho del raton.
escribo ":wq"

escribo "chmod +x scriptbaneo.sh
escribo "./scriptbaneo.sh

abro /etc/rc.local con el winSCP (seguro que hay otra manera, pero soy muyyy novato)
edito con winSCP es fichero añadiendo: "/lugardondeesteelscript/scriptbaneo.sh &" antes de la linea "exit 0"

¿lo he entendido bien?
Ahora solo me falta saber donde puedo colocar el script, es decir saber "/lugardondeesteelscript/", que es lo que preguntaba antes si puede ser en "/root/" o es mejor en otro sitio.

Gracias y disculpad la ignorancia.

Si quieres meterlo en /root/ está bien. Yo todas las configuraciones las meto en /etc/, pero cada uno tiene su sistema...
Ya que has usado el vi en el caso anterior, ¿no es casi mejor hacer vi /etc/rc.local desde la propia consola, en lugar de acceder al fichero en remoto con SCP?  ^-^
En vi, si quieres "escribir y salir", puedes poner ":x" en lugar de ":wq".
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: arfonzo en 03-10-2014, 12:50 (Viernes)
Ok, pues probaré que tal.
entiendo entonces que antes de escribir "vi scriptbaneo.sh", tengo que entrar en /etc/ de este modo "cd/etc/", ¿no?
Y luego para editar desde vi, dentro de /etc/, escribo "vi rc.local", voy hasta la linea de antes de "exit 0" y pulso "a", añado "/etc/scriptbaneo.sh &" y luego despues de la linea "exto 0" pulso "enter" y escribo ":x" y ¿ya esta
lo de hacerlo desde winSCP es porque no he utilizado el vi en mi vida y no lo tenia muy claro, pero así aperndo.
Gracias majete.

Disculpa que te esté cosiendo a preguntas, pero es que en mi vida habia cacharreado con la informática más allá de rootear un android para mi hija (y para eso hay tutoriales hasta para torpes como yo) e instalar alguna cosa en windows.
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: Tki2000 en 03-10-2014, 13:26 (Viernes)
Ok, pues probaré que tal.
entiendo entonces que antes de escribir "vi scriptbaneo.sh", tengo que entrar en /etc/ de este modo "cd/etc/", ¿no?
Y luego para editar desde vi, dentro de /etc/, escribo "vi rc.local", voy hasta la linea de antes de "exit 0" y pulso "a", añado "/etc/scriptbaneo.sh &" y luego despues de la linea "exto 0" pulso "enter" y escribo ":x" y ¿ya esta
lo de hacerlo desde winSCP es porque no he utilizado el vi en mi vida y no lo tenia muy claro, pero así aperndo.
Gracias majete.

Disculpa que te esté cosiendo a preguntas, pero es que en mi vida habia cacharreado con la informática más allá de rootear un android para mi hija (y para eso hay tutoriales hasta para torpes como yo) e instalar alguna cosa en windows.

En realidad en vi yo no utilizo la "a" de añadir, sino la "i" de insertar... las dos hacen lo mismo...  ;D
También puedes hacer vi /etc/scriptbaneo.sh y te ahorras el cambiar de directorio...
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: arfonzo en 03-10-2014, 13:39 (Viernes)
Ok, pues probaré que tal.
entiendo entonces que antes de escribir "vi scriptbaneo.sh", tengo que entrar en /etc/ de este modo "cd/etc/", ¿no?
Y luego para editar desde vi, dentro de /etc/, escribo "vi rc.local", voy hasta la linea de antes de "exit 0" y pulso "a", añado "/etc/scriptbaneo.sh &" y luego despues de la linea "exto 0" pulso "enter" y escribo ":x" y ¿ya esta
lo de hacerlo desde winSCP es porque no he utilizado el vi en mi vida y no lo tenia muy claro, pero así aperndo.
Gracias majete.

Disculpa que te esté cosiendo a preguntas, pero es que en mi vida habia cacharreado con la informática más allá de rootear un android para mi hija (y para eso hay tutoriales hasta para torpes como yo) e instalar alguna cosa en windows.

En realidad en vi yo no utilizo la "a" de añadir, sino la "i" de insertar... las dos hacen lo mismo...  ;D
También puedes hacer vi /etc/scriptbaneo.sh y te ahorras el cambiar de directorio...

Estoy buscando un emoticono de esos que hacen reverencias, pero no lo encuento, te pongo el de los aplausos:

 >:(

Mil gracias y ya posteraré como acaba el tema (si con las indicaciones que me estas dando no soy capaz, entonces habra que colgarme de las orejas en la plaza del pueblo como escarmiento)
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: arfonzo en 03-10-2014, 15:23 (Viernes)
Ejecútalo con ./miscript.sh &


Cuando hago esto, Putty me contesta:
"root@OpenWrt:/etc# cat: can't open '/root/logfail2.log': No such file or directory
cat: can't open '/root/logfail2.log': No such file or directory"

Edito: ¿tengo qué crear primero el fichero logfail2.log?
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: Tki2000 en 03-10-2014, 16:26 (Viernes)
Ejecútalo con ./miscript.sh &


Cuando hago esto, Putty me contesta:
"root@OpenWrt:/etc# cat: can't open '/root/logfail2.log': No such file or directory
cat: can't open '/root/logfail2.log': No such file or directory"

Edito: ¿tengo qué crear primero el fichero logfail2.log?

Pues eso parece.
Pon esto para crear el fichero vacío:
Código: [Seleccionar]
touch /root/logfail2.log
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: arfonzo en 03-10-2014, 16:36 (Viernes)
Hecho.
Ahora ejecuto no contesta nada, sigo adelante...
Mil gracias.
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: arfonzo en 03-10-2014, 16:45 (Viernes)
 >:( pues parece que ya esta hecho...
Menos mal que Tki2000 ha estado al quite para evitar que hubiese metido la pata hasta el cuello, te debo una (o más).
Ahora ya tengo otras cosas en la cabeza para hacerle al router, pero primero leeré y después intentaré preguntar lo mínimo posible en el hilo que toque.

p.D. ¿Hay manera de comprobar que he hecho todo bien?
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: Tki2000 en 03-10-2014, 21:35 (Viernes)
>:( pues parece que ya esta hecho...
Menos mal que Tki2000 ha estado al quite para evitar que hubiese metido la pata hasta el cuello, te debo una (o más).
Ahora ya tengo otras cosas en la cabeza para hacerle al router, pero primero leeré y después intentaré preguntar lo mínimo posible en el hilo que toque.

p.D. ¿Hay manera de comprobar que he hecho todo bien?

La prueba rápida está en intentar hacer una sesión SSH y poner mal el password por lo menos dos veces. En cuanto se ejecute el script te prohibirá el acceso. Lo malo de eso es que no podrás mirar lo que ha pasado porque ya no te dejará entrar por SSH, a no ser que le cambies la IP al PC con el que intentas entrar al router...  ^-^
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: arfonzo en 03-10-2014, 22:30 (Viernes)
Pues mañana pruebo cambiándole al portátil la ip a una estática sin usar y metiendo la pata dos veces y posteo el resultado.
De nuevo mil gracias (te estas inflando a ellas)
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: faio86 en 04-10-2015, 16:26 (Domingo)
Hola
nuestro Openwrt
1.¿seria sensible a un ataque con hydra ssh desde el exterior?  :( :( :( :(
2.¿O solo si lo configuramos abriendo puertos y tal para el exterior?
3.¿La configuración por defecto lo permite o no?
Espero que la respuesta sea que no. :-X :-X

Saludos.
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: mkfs en 09-01-2016, 19:14 (Sábado)
vuenas cuando pruebo el script me da esto
cat: read error: Is a directory
lo tengo en la ruta /etc guardado cual es mi error
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: hardwarer en 07-03-2016, 13:49 (Lunes)
Hola
nuestro Openwrt
1.¿seria sensible a un ataque con hydra ssh desde el exterior?  :( :( :( :(
2.¿O solo si lo configuramos abriendo puertos y tal para el exterior?
3.¿La configuración por defecto lo permite o no?
Espero que la respuesta sea que no. :-X :-X

Saludos.

Es sensible a hydra, banea la IP de la máquina que tenga hydra. Le da 2 intentos, al tercero, adios amigo.


ACTUALIZACION 07 MARZO 2016:

ACTUALIZACION 07 MARZO 2016:

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.pre y script fail2ban.sh a la carpeta /tmp o cualquier otra y ejecutar instalar.sh
# chmod 755 instalar.sh
#./instalar.sh
Título: Re: Script Banear direcciones IP contra ataques SSH (Para Openwrt, Unix, Linux etc.)
Publicado por: hardwarer en 07-03-2016, 14:54 (Lunes)
vuenas cuando pruebo el script me da esto
cat: read error: Is a directory
lo tengo en la ruta /etc guardado cual es mi error


Descarga la nueva version y editas los archivos instalar.sh y fail2ban.pre para que lo instale en /etc (si no lo instala en /root por defecto)

Archivos instalar.sh y fail2ban.pre:

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


Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: Tki2000 en 30-05-2017, 18:57 (Martes)
Ya que últimamente yo también he estado recibiendo ataques, a una de las redes que tengo por ahí perdida, y cumpliendo los deseos de hardwarer,
Animo a todos a modificar el script y mejorarlo o lo que sea.
Me he decidido a meterle mano a este script, que llevo usando desde hace tiempo, y no sé si lo habré mejorado o no, pero a mi me está sirviendo para parar muchos ataques.

He modificado el lugar del fichero de baneos, para no machacar la flash del router, y le he añadido la opción de almacenar el fichero de baneos en flash, para continuar por donde íbamos, y un fichero de IPs manuales, para poner a mano las que queramos banear indefinidamente.

No he elaborado el fichero de instalación, como hizo hardwarer. Es simplemente el script a pelo, en el que podemos definir las rutas de los distintos ficheros que vamos a usar.
En mi caso lo he instalado todo en /etc/fail2ban, ya que de esa forma lo guardo automáticamente cuando un backup de la configuración del router. Pero podéis grabarlo donde gustéis, siempre y cuando, cambiéis las rutas de los ficheros en el script.

El código es éste:

Código: [Seleccionar]
#!/bin/sh
#============================================================================================================
# SCRIPT
#============================================================================================================

# Script realizado por hardwarer, para el foro de seguridadwireless.net
# Este script detecta los intentos de conexion fallidos al servidor SSH, ya sea por contraseña 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.

# Modificaciones Tki2000 (2017-05-15)
#
# 1.- El fichero de baneos se escribe en memoria RAM para no machacar la flash del router
# 2.- Si grabamos previamente un fichero de baneos, de la RAM a la flash, lo usará al inicio.
# 3.- Posibilidad de banear manualmente ips, además de las detectadas en el script, durante un tiempo indefinido.
# 4.- Las IPs repetidas, entre ficheros, no se tienen en cuenta nada más que una vez al banear. (2017-05-30)
#
# El fichero de baneos en la RAM, se encuentra por defecto en /tmp/banned.ips
# El fichero de baneos en la flash, se encuentra por defecto en /etc/fail2ban/banned.ips
# El fichero de baneos manual, se encuentra por defecto en /etc/fail2ban/banned_static.ips
# El formato del fichero de baneos manual, es de una IP por línea.
#
#============================================================================================================
#========================================== OPCIONES ========================================================

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

#ban_time=86400
# 86400 * 14 = 1209600
ban_time=1209600

# Definición de las rutas de los ficheros que se usan en el script.
# El fichero de banfile es el fichero de baneos y se maneja en memoria, para no machacar la flash del router.
# El fichero de banfile_stored es el fichero que podemos dejar grabado en la flash del router, para volver
#    a comenzar los baneos, por donde los dejamos. Previamente, antes de reiniciar el router debemos
#    grabar el fichero de la memoria, a la flash, claro.
# El fichero de banned_static, es un fichero para añadir manualmente ips que queramos desde el principio,
#    para banearlos de manera indefinida. El formato es de una IP por línea.

banfile="/tmp/banned.ips"
banfile_stored="/etc/fail2ban/banned.ips"
banfile_static="/etc/fail2ban/banned_static.ips"
fail2ban_running="/tmp/fail2ban.run"

# 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 ==================================================

# Comprobamos si acabamos de iniciar el router y en ese caso preelaboramos el fichero de baneos
# Modificación : Si tenemos un fichero grabado previo, lo usamos.
# Modificación : Si tenemos un fichero de ips para banear estático, preelaboramos el fichero de baneos.

if [ ! -f $fail2ban_running ]
then
   touch $fail2ban_running
  
   if [ -f $banfile_static ]
   then
      if [ -f $banfile ]
      then
         rm $banfile
      fi
      for x in `cat $banfile_static | awk '{print $1}' FS=":"`
      do
         echo 2100000000:$x >> $banfile
      done
   fi
  
   if [ -f $banfile_stored ]
   then
      for l in `cat $banfile_stored | awk '{print $2}' FS=":"`
      do
         exists=`cat $banfile | grep $l | wc -l`
         if [ "$exists" -lt 1 ]
         then
            fecha_actual=`date +%s`
            unban_date=`expr $fecha_actual + $ban_time`
            echo "$unban_date:$l" >> $banfile
         fi
      done
   fi

   # Si es la primera vez que lanzamos el script, debemos crear el fichero donde se guardan
   # las ips baneadas, si no lo hemos creado ya, en los procedimientos anteriores
   if [ ! -f $banfile ]
   then
      touch $banfile
   fi
  
   for x in `cat $banfile | 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 Y MAL PASSWORD =======================

# 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 tres veces guardamos la IP en la variable "badip"
   if [ "$brute" -gt 3 ];
   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 $banfile | 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 "$banfile" 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" >> $banfile;
      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 3 ];
   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 $banfile | 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" >> $banfile;
      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 $banfile`
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' $banfile
      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

Como siempre, usad estos datos, bajo vuestra propia responsabilidad.
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: eduperez en 31-05-2017, 08:00 (Miércoles)
Dos sugerencias de mejoras:


A ver si encuentro un rato, y me pongo con esto...
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: Tki2000 en 31-05-2017, 09:51 (Miércoles)
Dos sugerencias de mejoras:

  • A medida que se van añadiendo direcciones bloqueadas, la lista se puede hacer muy larga, y eso puede afectar al rendimiento; iptables no trabaja muy bien con grandes cantidades de reglas. Sería interesante reconvertir el script para usar ipsets (https://wiki.openwrt.org/doc/uci/firewall#ip_sets); es una manera de crear una regla "genérica" y después añadirle direcciones, y tiene mejor rendimiento con listas largas. Además, gestiona de manera automática la caducidad del bloqueo.
  • Yo también recibo ataques, y normalmente me llegan varios intentos seguidos desde una misma dirección, y después ya no me vuelve a aparecer esa dirección en los logs. Revisar los mensajes cada 5 minutos tiene el problema de que bloqueas el ataque cuando ya a acabado. Otra mejora que se podría hacer al script es recoger la salida de logread en vivo mediante una pipe, de manera que se bloqueasen las direcciones de manera inmediata.

A ver si encuentro un rato, y me pongo con esto...

No veo claro que con lo de ipsets vaya a haber menos procesamiento. Da lo mismo, ya que todas las reglas que haya en el ipset se deben recorrer, para saber el destino del paquete.
Los ataques los veo repetidos, ya que la siguiente vez, no aparece en los logs como intento de conexión, sino como "Ataque de fuerza bruta", así que las IPs sí se repiten.
Hasta por lo menos 600 reglas, me las está gestionando bien, en un período de 14 días. (CPU buena con 128MB de RAM).
El intervalo de ejecución lo tengo en 10 minutos. En ese intervalo, una IP realiza un ataque de digamos 10 intentos por SSH (distintos passwords dentro de la misma conexión), pero no vuelve a intentarlo hasta pasado más de ese intervalo, y después da igual, porque ya la he cazado...
Lo suyo sería hacer lo del pipe en directo, pero el procesamiento de eso en directo, puede disparar la CPU del router, hasta límites bastante altos.
A ese ritmo, desde luego no averiguan el password ni en varios cientos de lustros. Lo que me preocupa más, es que encuentren algún exploit directo.
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: xcl2000 en 09-06-2017, 14:37 (Viernes)
El scrip original instalado en Exroot Pulpstone v3.1 OpenWrt Chaos Calmer 15.05.1 r49389....funcionando

(https://preview.ibb.co/iFRO7a/ataque.png) (https://ibb.co/i00SYF)
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: eduperez en 07-07-2017, 23:58 (Viernes)
Que no se diga que soy de los que tiran la piedra y esconden la mano...


Y para muestra, un prototipo de lo que estoy desarrollando.

En "/etc/config/firewall" se definen las siguientes entradas (que deben colocarse antes de todos los "option rule" que abren puertos):
Código: [Seleccionar]
config ipset
option name 'banscan'
option storage 'hash'
option match 'src_ip'
option timeout '86400'

config rule
option name 'banscan'
option src 'wan'
option family 'ipv4'
option ipset 'banscan'
option target 'DROP'

Con esto ya tenemos definido un ipset, donde podremos añadir direcciones IP, y una regla que bloqueará todo el tráfico proveniente de las direcciones que estén en ese ipset; para bloquear una dirección, hay que ejecutar simplemente "ipset add banscan aaa.bbb.ccc.ddd", y le cerraremos todos los puertos durante 24 horas.

Y la manera de revisar los logs de manera continua es mediante el comando "logread -f" y procesando la salida mediante pipes; por ejemplo, estos dos comandos (ninguno de los dos acaba, hay que cortarlos con CTRL+C) espera a la llegada de los dos mensajes más típicos:
Código: [Seleccionar]
logread -f | fgrep "Login attempt for nonexistent user from" | awk '{ print $14 }' | awk '{ print $1 }' FS=":" | xargs -n 1 ipset add banscan
logread -f | fgrep "Max auth tries reached" | awk '{ print $23 }' | awk '{ print $1 }' FS=":" | xargs -n 1 ipset add banscan

Ahora sólo me queda montar un script de arranque y parada, que pueda dejar en "/etc/init.d", que procese otros ataques, que muestre mensajes de depuración, ... en la próxima entrega.
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: Tki2000 en 08-07-2017, 15:50 (Sábado)
Que no se diga que soy de los que tiran la piedra y esconden la mano...

  • La ventaja de usar IPSET es que sólo hay que definir una regla, a la que después se van añadiendo direcciones IP. Con eso se consigue que la evaluación de las reglas sea mucho más rápida, y puede tener un efecto significativo en dispositivos con CPU lenta o cuando el número de direcciones crece mucho. Otra de las ventajas de las IPSET es que las direcciones asociadas a una regla caducan de forma automática.
  • Si se hace correctamente, se pueden bloquear los ataques en tiempo real, sin tener que consumir CPU en exceso; es más, se consumirá menos CPU que con el sistema de revisar los logs periódicamente.

Y para muestra, un prototipo de lo que estoy desarrollando.

En "/etc/config/firewall" se definen las siguientes entradas (que deben colocarse antes de todos los "option rule" que abren puertos):
Código: [Seleccionar]
config ipset
option name 'banscan'
option storage 'hash'
option match 'src_ip'
option timeout '86400'

config rule
option name 'banscan'
option src 'wan'
option family 'ipv4'
option ipset 'banscan'
option target 'DROP'

Con esto ya tenemos definido un ipset, donde podremos añadir direcciones IP, y una regla que bloqueará todo el tráfico proveniente de las direcciones que estén en ese ipset; para bloquear una dirección, hay que ejecutar simplemente "ipset add banscan aaa.bbb.ccc.ddd", y le cerraremos todos los puertos durante 24 horas.

Y la manera de revisar los logs de manera continua es mediante el comando "logread -f" y procesando la salida mediante pipes; por ejemplo, estos dos comandos (ninguno de los dos acaba, hay que cortarlos con CTRL+C) espera a la llegada de los dos mensajes más típicos:
Código: [Seleccionar]
logread -f | fgrep "Login attempt for nonexistent user from" | awk '{ print $14 }' | awk '{ print $1 }' FS=":" | xargs -n 1 ipset add banscan
logread -f | fgrep "Max auth tries reached" | awk '{ print $23 }' | awk '{ print $1 }' FS=":" | xargs -n 1 ipset add banscan

Ahora sólo me queda montar un script de arranque y parada, que pueda dejar en "/etc/init.d", que procese otros ataques, que muestre mensajes de depuración, ... en la próxima entrega.

Interesante lo que cuentas, sin duda.
Pero ten en cuenta, que si te equivocas al hacer login a la primera, estarás baneado 24h. Lo suyo sería dejar/contar un número de intentos, antes del baneo.
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: eduperez en 08-07-2017, 16:37 (Sábado)
Interesante lo que cuentas, sin duda.
Pero ten en cuenta, que si te equivocas al hacer login a la primera, estarás baneado 24h. Lo suyo sería dejar/contar un número de intentos, antes del baneo.

Pero yo nunca me equivoco! (de contraseña, al entrar por WAN, porque no permito acceso por contraseña, sólo por clave)  :D
Bromas aparte... sí, bloquear al primer intento es bastante radical, sólo lo haría después de haber configurado y probado bien el cliente, y cuando tenga muy claro que no voy a tener el problema que comentas.
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: xcl2000 en 18-07-2017, 20:26 (Martes)
Yo he instalado el script en LEDE

(https://thumb.ibb.co/ghpJua/lede2.png) (https://ibb.co/ghpJua)



y funciona...

(https://thumb.ibb.co/gBzq7v/lede.png) (https://ibb.co/gBzq7v)

Saludos  >:(
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: Tki2000 en 19-07-2017, 18:15 (Miércoles)
Yo he instalado el script en LEDE

(https://thumb.ibb.co/ghpJua/lede2.png) (https://ibb.co/ghpJua)



y funciona...

(https://thumb.ibb.co/gBzq7v/lede.png) (https://ibb.co/gBzq7v)

Saludos  >:(

Me alegra oir que funciona en otros sistemas.
Yo a estas alturas, puedo decir que funciona completamente estable, con un uptime de 60 días, y una media de baneos cada 14 días, de entre 500 y 600. Con un fichero inicial, funciona perfectamente con más de 1000.
Si alguien más quiere ir poniendo su experiencia, es bienvenido.
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: anonimoD en 20-09-2017, 16:51 (Miércoles)
He retocado el script unificando las dos búsquedas de fallos de contraseña y usuario haciéndolo además algo más corto. También he incoporporado la búsqueda hacia atrás de un inicio correcto de dicha ip para en ese caso no banear y un listado de lista blanca para omitir baneo. El script tiene algunos casos no controlados que comento en los comentarios y ya venían de base, pero que en vuestro caso que tenéis publicado el puerto ssh publicado con muchos intentos no os afectara, solo a aquellos que tengan pocos accesos y por desconocimiento si hay o no rotado de log.  He eliminado las reglas de log para evitar carga innecesaria y añadido un comentario para que al eliminar la regla nos aseguremos que se elimina una entrada añadida por el script y no otra.

Código: [Seleccionar]
#!/bin/sh
#============================================================================================================
# Descargado de: https://foro.seguridadwireless.net/openwrt/script-baneador-de-direcciones-ip-ssh-para-openwrt/
# Descargado de: https://foro.seguridadwireless.net/openwrt/script-baneador-de-direcciones-ip-ssh-para-openwrt/20/

# Script realizado inicialmente por hardwarer para el foro de seguridadwireless.net
# Este script extrae del log los fallos de autentificacion al servidor SSH (por usuario o contraseña erronea)
# Si los fallos exceden de cierta cantidad banea su IP de origen utilizando el cortafuegos Iptables.
# Tiempo de baneo configurable y tablas de baneo de IP permanentes al reinicio del sistema.
# Probado en OpenWrt 15.05.1 Chaos Chalmer (El original se probo en Openwrt 14.04 Barrier Breaker)

# Modificaciones Tki2000 (2017-05-15)
# Modificaciones David   (2017-09-20)
#
# 1.- El fichero de baneos se escribe /tmp/, del que OpenWRT carga en RAM y asi no machaca la flash del router
# 2.- Si grabamos previamente el fichero de baneos, de la RAM a la flash, lo usará al inicio.
# 3.- Posibilidad de banear manualmente ips, además de las detectadas en el script, durante un tiempo indefinido.
# 4.- Las IPs repetidas, entre ficheros, no se tienen en cuenta nada más que una vez al banear. (2017-05-30)
# 5.- Puede leer el log n lineas hacia atras para ver si esa ip ha tenido un acceso correcto para omitir baneo
# 6.- Se puede anadir ips a una lista blanca para omitir baneo en caso de que tengas dedazos gordos...
# 7.- Se pueden anadir DNS a la lista blanca para omitir baneo (Requiere paquete hostip para resolver los dns)
# 8.- A la hora de quitar los baneos revisa que tenga el comentario para evitar eliminar una regla que no toca
#
#    ======= Por revisar =========
# Revisar si hay rotado de logs y cada cuanto se lanza
# Ojo, puede estar anadiendo y quitando constantemente un baneo si el log no rota, tiene pocas entradas o el tiempo de baneo es corto
# Si cambiamos la cadena de alcance y todavía quedan reglas no seran eliminadas, aunque pase el tiempo de unbaneo. Borrar a mano o reiniciar
# Puede que no te banee por tener un acceso reciente pero que pasadas las lineas de busqueda seleccionadas ya
#  no lea tu acceso y no omita el baneo. Deberia resetear y no buscar fallos hacia atras de un acceso correcto
#
#============================================================================================================
#========================================== OPCIONES ========================================================

# Tiempo de baneo (en segundos). Transcurrido ese tiempo se desactiva el baneo y se quita la IP de la lista.
#ban_time=86400     # Un dia: 24 horas = 86400 segundos
#ban_time=1209600   # Dos semanas: 86400 * 14 = 1209600
ban_time=36000      # 10h por defecto para pruebas

# Definición de las rutas de los ficheros que se usan en el script.
fail2ban_running="/tmp/fail2ban.run"             # Para saber que si ha ejecutado al menos una vez (para carga inicial)
banfile="/tmp/banned.ips"                        # Fichero de baneos. Almacezar siempre en /tmp/ para asegurar que se escribe en RAM
banfile_stored="/etc/fail2ban/banned.ips"        # Fichero que podemos dejar grabado en la flash para volver a comenzar los baneos donde los dejamos.
                                                 # Previamente, antes de reiniciar el router debemos grabar el fichero de la memoria, a la flash.
banfile_static="/etc/fail2ban/banned_static.ips" # Para añadir manualmente ips que queramos banear desde el principio y de manera indefinida. El formato es de una IP por línea.

# Whitelist a omitir en el baneo
MyIPs=$(ifconfig | grep "inet addr" | awk '{ print $2}' | cut -d ":" -f 2 | xargs)     # Todas las ips locales del router (LAN,WAN,local y VPN levantadas)
WhitelistIPs="192.168.1.100"                                                           # Ips que omitiran al baneo. Para mas de una anadir con un espacio
WhitelistDNS="tralala.ddns.algo tarari.no-ip.org"                                      # DNS que omitiran al baneo. Requiere hostip para resolver los DNS
WhitelistIPs="$MyIPs $WhitelistIPs $(for DNS in $WhitelistDNS; do hostip $DNS; done | xargs)" # Suma todas las ips de lista blanca e ips de DNS

TriggerBan=5            # Cuantos fallos de contrasena o usuario inexistente  ha de encontrar en el log para banear a la ip
LinesToFindAcces=1000   # Cuantos eventos revisa atras en el log para ver si hay un acceso correcto de esa ip. Si lo hay no la baneara. 0 para infinito
Comentario="BRUTEBAN"   # Comentario que ira asociado a la regla para distinguirla

# Funcionamiento en internet, red local o ambas. Descomentar la opcion deseada.
#alcance="input_rule"        # Ambas redes
#alcance="input_lan_rule"    # Solo red local
alcance="input_wan_rule"     # Solo internet    # Por defecto y para hacer pruebas con mejor seguridad desde lan

#=============================================================================================================
#======================================    CRONIFICAR    =====================================================
# Copiar en /etc/fail2ban/fail2ban_openwrt.sh y dar permisos d ejecución: chmod +x /etc/fail2ban/fail2ban_openwrt.sh
# */10 * * * *  /etc/fail2ban/fail2ban_openwrt.sh


#=============================================================================================================
#===================================== COMPROBACION INICIAL ==================================================

# Comprobamos si acabamos de iniciar el router y en ese caso preelaboramos el fichero de baneos
# Modificación : Si tenemos un fichero grabado previo, lo usamos.
# Modificación : Si tenemos un fichero de ips para banear estático, preelaboramos el fichero de baneos.

if [ ! -f $fail2ban_running ]; then
   touch $fail2ban_running
  
   if [ -f $banfile_static ]; then
      [ -f $banfile ] && rm $banfile

      for x in `cat $banfile_static | awk '{print $1}' FS=":"`; do
         echo 2100000000:$x >> $banfile
      done
   fi
  
   if [ -f $banfile_stored ]; then
      for l in `cat $banfile_stored | awk '{print $2}' FS=":"`; do
         exists=`cat $banfile | grep $l | wc -l`
         if [ "$exists" -lt 1 ]; then
            fecha_actual=`date +%s`
            unban_date=`expr $fecha_actual + $ban_time`
            echo "$unban_date:$l" >> $banfile
         fi
      done
   fi

   # Si es la primera vez que lanzamos el script, debemos crear el fichero donde se guardan
   # las ips baneadas, si no lo hemos creado ya, en los procedimientos anteriores
   [ ! -f $banfile ] && touch $banfile
  
   for x in `cat $banfile | awk '{print $2}' FS=":"`; do
        echo "Anade Baneo:   iptables -I $alcance 1 -s $x -j DROP -m comment --comment "${Comentario}"
        #iptables -I $alcance 1 -s $x -j DROP -m comment --comment "${Comentario}" #:${fecha_actual}:${unban_date}"
   done
fi

#================================================================================================
#====================== BANEO INTENTOS USUARIOS NO VALIDOS Y MAL PASSWORD =======================

fecha_actual=`date +%s`
unban_date=`expr $fecha_actual + $ban_time`

# Entraran al for aquellas ips que hayan excedido mas del numero $Trigger los fallos de contrasena y usuario"
for badip in `logread | grep -e 'Login attempt for nonexistent user' -e 'Bad password' | cut -d':' -f 4 | cut -d ' ' -f 8 | uniq -c -f 7 | awk '{ if ( $1 > $TriggerBan ) print $2}'`; do
    # Si la direccion IP no esta en la lista de baneados, ni en la de recientes accesos correctos ni en la lista blanca, la anadimos a iptables
    if ! [ "$(grep $badip $banfile)" ] && ! [ "$(logread -l $LinesToFindAcces -e 'Password auth succeeded' | cut -d ':' -f 4 | cut -d ' ' -f 8 | grep $badip )" ] && ! [[ "$WhitelistIPs" == *"$badip"* ]] ; then
        iptables -I $alcance 1 -s $badip -j DROP -m comment --comment "${Comentario}" #:${fecha_actual}:${unban_date}"

        # Anadimos la IP al archivo de baneados "$banfile" y la hora a la que terminara el baneo de esa IP en formato epoch (segundos desde 01-01-1970)
        echo "$unban_date:$badip" >> $banfile;
   fi
done

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

# Comprueba si alguno de los registros del fichero $banfile 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 $banfile`; 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' $banfile
      unban_rule=`iptables -L $alcance -n --line-numbers | grep "${Comentario}" | grep -m 1 $unban_ip|awk '{print $1}'`
      iptables -D $alcance $unban_rule -m comment --comment "${Comentario}"
   fi
done


Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: anonimoD en 21-09-2017, 20:06 (Jueves)
Todos los que utilicen estos scripts basándose en logread deben tener en cuenta que logd no registra excesivas lineas. Por lo que si los fallos de acceso están un poco separados en el tiempo, no los detectara. También he visto que se comporta mal cuando se llena el buffer, no registrando nuevos eventos. La información del comportamiento del log es algo escasa y la he sacado de aquí: https://wiki.openwrt.org/doc/howto/log.essentials  ¿Alguien darme alguna referencia con info más detallada?

Esto deben tenerlo presente aquellos que tengan excesivos intentos de acceso, ya que probablemente el log no los esté registrando todos y por ende no estarán baneando a ips que estarán muy activas intentando "juanquearles"...  

Se pueden ampliar el buffer del sistema de log en la sección "config system" del fichero /etc/config/system. Por ejemplo:  option log_buffer_size 1024  
Con esto el log me permite unas 4500 lineas y me ocupa en memoria algo menos de 2MB
Se puede hacer que el log sea mayor o que escriba un fichero (En RAM de /tmp/ o en un disco externo, revisar wiki)

A tener en cuenta que un log muy grande de muchos Megas, hará que recorrer el log sea costoso y por ende lanzar el script también lo será.

Edito: No entiendo, he probado con 512 y me ocupa unos Ks menos en memoria a la vez que me están entrando unas 10800 de lineas ¿?
          Quizá una explicación es que el máximo son 999 y al poner 4 cifras no funcione del todo bien.
          Por defecto si no pones nada se carga con 16 y ocupa menos de 1MB (el demonio + registros)
          Con 256 y 512 parece rotan bien ante nuevos eventos cuando están llenos. Entran unas 5000 lineas con 256 y 10000 con 512.
          La diferencia de memoria entre 256 y 512 es mínima.
        
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: jaraneda en 22-09-2017, 21:58 (Viernes)
instalado en un TP-Link TL-WR1043N/ND v2 con LEDE Reboot 17.01.1 y funcionando
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: anonimoD en 23-09-2017, 18:08 (Sábado)
instalado en un TP-Link TL-WR1043N/ND v2 con LEDE Reboot 17.01.1 y funcionando

Es que es bastante standard, no debería dar problemas. Gracias por confirmarlo. Ten presente lo que comento del log, por defecto no se cuantas lineas registra LEDE. Puedes verlo con: ps | grep logd   Si ves que después de -S tiene menos de 128, yo ampliaría el tamaño del buffer a 256 o 512. Apenas aumenta medio MB de RAM así que no es problema.  Para hacerlo ve a /etc/config/system y dentro del tabulado config system añade: option log_buffer_size 512

Estoy pensando en añadir una opción para que registre en el log cuando banea o desbanea una ip. Es muy sencillo, de hecho, mientras hago la comida lo hago y lo subo.

Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: anonimoD en 23-09-2017, 18:44 (Sábado)
Actualizado. Revisad las opciones que os deja escoger (limite de baneos, log, whitelist, etc...) y sobretodo aumentad el tamaño del buffer del log, esta comentado en el script.

Código: [Seleccionar]
#!/bin/sh
#============================================================================================================
# Descargado de: https://foro.seguridadwireless.net/openwrt/script-baneador-de-direcciones-ip-ssh-para-openwrt/
# Descargado de: https://foro.seguridadwireless.net/openwrt/script-baneador-de-direcciones-ip-ssh-para-openwrt/20/
# Descargado de: https://foro.seguridadwireless.net/openwrt/script-baneador-de-direcciones-ip-ssh-para-openwrt/40/

# Script realizado inicialmente por hardwarer para el foro de seguridadwireless.net
# Este script lee del log los fallos de autentificacion SSH (por usuario o contraseña erronea)
# Si los fallos exceden de cierta cantidad, banea su IP de origen utilizando iptables
# Tiempo de baneo configurable y tablas de baneo de IP permanentes al reinicio del sistema.
# Probado en OpenWrt 15.05.1 Chaos Chalmer y LEDE 17.01 (El original se probo en Openwrt 14.04 Barrier Breaker)

# Modificaciones Tki2000 (2017-05-15)
# Modificaciones David   (2017-09-20) (Retocadas las funciones originales + puntos 5, 6, 7 y 8)
# Modificaciones David   (2017-09-23) (9)
# Modificaciones David   (2017-09-30) (10 + correccion de errores + cambio nombres de variables para legibilidad y asemeje a fail2ban original
#
# 1.-  El fichero de baneos se escribe /tmp/, del que OpenWRT carga en RAM y asi no machaca la flash del router
# 2.-  Si grabamos previamente el fichero de baneos, de la RAM a la flash, lo usará al inicio.
# 3.-  Posibilidad de banear manualmente ips, además de las detectadas en el script, durante un tiempo indefinido.
# 4.-  Las IPs repetidas, entre ficheros, no se tienen en cuenta nada más que una vez al banear. (2017-05-30)
# 5.-  Puede leer el log n lineas hacia atras para ver si esa ip ha tenido un acceso correcto y omitir su baneo
# 6.-  Se puede anadir ips a una lista blanca para omitir baneo en caso de que tengas dedazos gordos.
# 7.-  Se pueden anadir DNS a la lista blanca para omitir baneo (Requiere paquete hostip para resolver los dns)
# 8.-  A la hora de quitar los baneos, revisa que tenga el comentario para evitar eliminar una regla que no toca
# 9.-  Opcion a registrar en el log los baneos y unbaneos
# 10.- Modo Debug en el que no aplica las reglas del firewall, en su lugar imprime lo que haria (tampoco escribira la accion en el log)
#
#    ======= A tener en cuenta =========
# Puede estar anadiendo y quitando constantemente un baneo si el log no rota, tiene un buffer pequeno o el tiempo de baneo es corto (amplia buffer, abajo detallo)
# Por defecto el log registra solo unas 340 lineas y perderias accesos no autorizados al rotar el log. Anade en la seccion "config system" del fichero /etc/config/system
#  option log_buffer_size 256  # Por defecto toma 16 y con 256 amplia a unas 5000 lineas y 512 unas 10.000 (no poner mas de 999 ya que se comporta erroneo)
# Si cambiamos el ambito de bloqueo(chain) y todavía quedan reglas andidas, no seran eliminadas, aunque pase el tiempo de unbaneo. Borrar a mano o reiniciar
# Puede que no te banee por tener un acceso reciente pero que pasadas las lineas de busqueda seleccionadas ya no lea tu acceso y no omita el baneo.
#    Lo ideal seria resetear y no buscar fallos hacia atras después de un acceso correcto de esa ip (pendiente por hacer, pero asi ya me funciona bien)
#
#============================================================================================================
#========================================== OPCIONES ========================================================

# Tiempo de baneo (en segundos). Transcurrido ese tiempo se desactiva el baneo y se quita la IP de la lista.
ban_time=36000      # 36000 = 10h, por defecto para pruebas       # 86400 = Un dia = 24 horas    # Dos semanas = 86400 * 14 = 1209600

# Definicion de las rutas de los ficheros que se usan en el script.
file_running="/tmp/fail2ban.run"                 # Para saber si se ha ejecutado al menos una vez (para carga inicial). Almacenar en /tmp/
file_banapplied="/tmp/banned.ips"                # Fichero de baneos. Almacezar siempre en /tmp/ para asegurar que se escribe en RAM
file_banstored="/etc/fail2ban/banned.ips"        # Es el fichero banapplied que podemos guardar a flash antes de reiniciar para volver a comenzar los baneos donde los dejamos
file_banstatic="/etc/fail2ban/banned_static.ips" # Para anadir manualmente ips que queramos banear desde el principio y de manera indefinida (Una IP o CIDR por línea)

# Whitelist de ips a omitir en el baneo
MyIPs=$(ifconfig | grep "inet addr" | awk '{ print $2}' | cut -d ":" -f 2 | xargs)     # Tomara todas las ips locales del router (LAN,WAN,local y VPN levantadas)
WhitelistIPs="192.168.1.111 192.168.1.111"                                             # Anade Ips que omitira al baneo. Para mas de una, anadir con un espacio
WhitelistDNS="oficina1.tudnsdeofi.com myhomeip.tudnsdcasa.com"                         # Anade DNS que omitira al baneo. Requiere hostip para resolver los DNS
WhitelistIPs="$MyIPs $WhitelistIPs $(for DNS in $WhitelistDNS; do hostip $DNS; done | xargs)" # Sumara todas las ips de lista blanca e ips de DNS de arriba

maxtretry=4              # Cuantos fallos de contrasena o usuario inexistente ha de encontrar en el log para banear a la ip
LinesToFindAcces=2000    # Cuantos eventos revisa atras en el log para ver si hay un acceso correcto de esa ip. Si lo hay, no la baneara. 0 para infinito
Comentario="BRUTEBAN"    # Comentario que ira asociado a la regla anadida a iptables para distinguirla
WriteLogWithAction=1     # 1 para escribir en el log cuando banea o unbanea una ip. Cualquier otra cosa para omitir. (Con Debug activo no escribira en log)
WriteLogTag="f2b_action" # Tag al escriir en log el baneo o unbaneo (si lo has activado con WriteLogWithAction=1)
Debug="False" # Con "True" no aplica ni quita las reglas en iptables. En su lugar imprime lo que haria sin aplicarlas en el sistema. Cualquier otra cosa para normal

# Ambito/cadena de iptables donde se aplicaran los baneos.  Local="input_lan_rule"  internet="input_wan_rule"  Ambas="input_rule"
chain="input_wan_rule"   # Local="input_lan_rule"  internet="input_wan_rule"  Ambas="input_rule"  # Por defecto deja "input_wan_rule" para hacer pruebas con seguridad desde lan

#=============================================================================================================
#======================================    CRONIFICAR    =====================================================
# Copiar en /etc/fail2ban/fail2ban_openwrt.sh y dar permisos d ejecución: chmod +x /etc/fail2ban/fail2ban_openwrt.sh
# Para que se lance cada 10 minutos copia la tercera linea de abano editando con "crontab -e" o en luci "Sheluded Tasks"
# */10 * * * *  /etc/fail2ban/fail2ban_openwrt.sh >> /dev/null 2>&1

#=============================================================================================================
#=====================================    Codigo generico   ==================================================
fecha_actual=`date +%s`
unban_date=`expr $fecha_actual + $ban_time`

#=============================================================================================================
#===================================== COMPROBACION INICIAL ==================================================

# Comprobamos si acabamos de iniciar el router y en ese caso preelaboramos el fichero de baneos
# Modificación : Si tenemos un fichero grabado previo, lo usamos.
# Modificación : Si tenemos un fichero de ips para banear estático, preelaboramos el fichero de baneos.

if [ ! -f $file_running ]; then
   touch $file_running
  
   if [ -f $file_banstatic ]; then
      [ -f $file_banapplied ] && rm $file_banapplied

      for x in `cat $file_banstatic | awk '{print $1}' FS=":"`; do
         echo 2100000000:$x >> $file_banapplied
      done
   fi
  
   if [ -f $file_banstored ]; then
      for l in `cat $file_banstored | awk '{print $2}' FS=":"`; do
         exists=`cat $banfile | grep $l | wc -l`
         if [ "$exists" -lt 1 ]; then
            echo "$unban_date:$l" >> $file_banapplied
         fi
      done
   fi

   # Si es la primera vez que lanzamos el script, debemos crear el fichero donde se guardan
   # las ips baneadas, si no lo hemos creado ya, en los procedimientos anteriores
   [ ! -f $file_banapplied ] && touch $file_banapplied
  
   for x in `cat $file_banapplied | awk '{print $2}' FS=":"`; do
if [ "$Debug" == "True" ];then
echo "Anade Baneo:   iptables -I $chain 1 -s $x -j DROP -m comment --comment \"${Comentario}\""
        else
iptables -I $chain 1 -s $x -j DROP -m comment --comment "${Comentario}" #:${fecha_actual}:${unban_date}"
[[ "$WriteLogWithAction" == "1" ]] && logger -t tag "$WriteLogTag" "Recuperado baneo en inicio a ip ${x}"
fi
   done
fi

#================================================================================================
#====================== BANEO INTENTOS USUARIOS NO VALIDOS Y MAL PASSWORD =======================

# Entraran al for aquellas ips que hayan excedido mas del numero $Trigger los fallos de contrasena y usuario"
for badip in `logread | grep -e 'Login attempt for nonexistent user' -e 'Bad password' | cut -d':' -f 4 | cut -d ' ' -f 8 | uniq -c -f 7 | awk '{ if ( $1 > '$maxtretry' ) print $2}'`; do
    # Si la direccion IP no esta en la lista de baneados, ni en la de recientes accesos correctos ni en la lista blanca, la anadimos a iptables
    # if ! [ "$(grep $badip $file_banapplied)" ] && ! [ "$(logread -l $LinesToFindAcces -e 'Password auth succeeded' | cut -d ':' -f 4 | cut -d ' ' -f 8 | grep $badip)" ] && ! [[ "$WhitelistIPs" == *"$badip"* ]] ; then      # La consola de openwrt es ash y no soporta el like con [[ "algo" == *"algo"* ]] cambiada por linea de abajo
    if ! [ "$(grep $badip $file_banapplied)" ] && ! [ "$(logread -l $LinesToFindAcces -e 'Password auth succeeded' | cut -d ':' -f 4 | cut -d ' ' -f 8 | grep $badip)" ] && ! $(echo "$WhitelistIPs" | grep -q "badip") ; then
        if [ "$Debug" == "True" ];then
echo "Anade Baneo:   iptables -I $chain 1 -s $badip -j DROP -m comment --comment \"${Comentario}\""
        else
iptables -I $chain 1 -s $badip -j DROP -m comment --comment "${Comentario}" #:${fecha_actual}:${unban_date}"
[[ "$WriteLogWithAction" == "1" ]] && logger -t tag "$WriteLogTag" "Baneo a ip ${badip}"

# Anadimos la IP al archivo de baneados "$file_banapplied" y la hora a la que terminara el baneo de esa IP en formato epoch (segundos desde 01-01-1970)
echo "$unban_date:$badip" >> $file_banapplied;
fi
   fi
done

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

# Comprueba si alguno de los registros del fichero $file_banapplied tiene una fecha anterior a la actual. En caso afirmativo borra las reglas de iptables
for z in `cat $file_banapplied`; 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' $file_banapplied
unban_rule=`iptables -L $chain -n --line-numbers | grep "${Comentario}" | grep -m 1 $unban_ip|awk '{print $1}'`
      
if [ "$Debug" == "True" ];then
echo "Anade Baneo:  iptables -D $chain $unban_rule -m comment --comment \"${Comentario}\""
else
iptables -D $chain $unban_rule -m comment --comment "${Comentario}"
[[ "$WriteLogWithAction" == "1" ]] && logger -t tag "$WriteLogTag" "Unbaneo a ip ${z}"
fi
fi
done
Título: Re: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: jaraneda en 23-09-2017, 22:00 (Sábado)
Actualizado. Revisad las opciones que os deja escoger (limite de baneos, log, whitelist, etc...) y sobretodo aumentad el tamaño del buffer del log, esta comentado en el script.

Código: [Seleccionar]
#!/bin/sh
# Descargado de https://foro.seguridadwireless.net/openwrt/script-baneador-de-direcciones-ip-ssh-para-openwrt/msg359325/#msg359325

# Script realizado inicialmente por hardwarer para el foro de seguridadwireless.net
# Este script extrae del log los fallos de autentificacion al servidor SSH (por usuario o contraseña erronea)
# Si los fallos exceden de cierta cantidad banea su IP de origen utilizando el cortafuegos Iptables.
# Tiempo de baneo configurable y tablas de baneo de IP permanentes al reinicio del sistema.
# Probado en OpenWrt 15.05.1 Chaos Chalmer y LEDE 17.01 (El original se probo en Openwrt 14.04 Barrier Breaker)

# Modificaciones Tki2000 (2017-05-15)
# Modificaciones David   (2017-09-20)
# Modificaciones David   (2017-09-23)
#
# 1.- El fichero de baneos se escribe /tmp/, del que OpenWRT carga en RAM y asi no machaca la flash del router
# 2.- Si grabamos previamente el fichero de baneos, de la RAM a la flash, lo usará al inicio.
# 3.- Posibilidad de banear manualmente ips, además de las detectadas en el script, durante un tiempo indefinido.
# 4.- Las IPs repetidas, entre ficheros, no se tienen en cuenta nada más que una vez al banear. (2017-05-30)
# 5.- Puede leer el log n lineas hacia atras para ver si esa ip ha tenido un acceso correcto para omitir baneo
# 6.- Se puede anadir ips a una lista blanca para omitir baneo en caso de que tengas dedazos gordos...
# 7.- Se pueden anadir DNS a la lista blanca para omitir baneo (Requiere paquete hostip para resolver los dns)
# 8.- A la hora de quitar los baneos revisa que tenga el comentario para evitar eliminar una regla que no toca
# 9.- Opcion a registrar en el log los baneos y unbaneos
#
#    ======= A tener en cuenta =========
# Puede estar anadiendo y quitando constantemente un baneo si el log no rota, tiene un buffer pequeno o el tiempo de baneo es corto (amplia buffer, abajo detallo)
# Por defecto el log registra solo unas 340 lineas y perderias accesos no autorizados al rotar el log. Anade en la seccion "config system" del fichero /etc/config/system
#  option log_buffer_size 512  # Por defecto toma 16 y con 256 amplia a unas 5000 lineas y 512 unas 10.000 (no poner mas de 999 ya que se comporta erroneo)
# Si cambiamos la cadena de alcance y todavía quedan reglas andidas, no seran eliminadas, aunque pase el tiempo de unbaneo. Borrar a mano o reiniciar
# Puede que no te banee por tener un acceso reciente pero que pasadas las lineas de busqueda seleccionadas ya no lea tu acceso y no omita el baneo.
#    Lo ideal seria resetear y no buscar fallos hacia atras después de un acceso correcto de esa ip (pendiente por hacer, pero asi ya me funciona bien)
#
#============================================================================================================
#========================================== OPCIONES ========================================================

# Tiempo de baneo (en segundos). Transcurrido ese tiempo se desactiva el baneo y se quita la IP de la lista.
ban_time=36000      # 36000 = 10h, por defecto para pruebas       # 86400 = Un dia = 24 horas    # Dos semanas = 86400 * 14 = 1209600

# Definicion de las rutas de los ficheros que se usan en el script.
fail2ban_running="/tmp/fail2ban.run"             # Para saber si se ejecutado al menos una vez (para carga inicial)
banfile="/tmp/banned.ips"                        # Fichero de baneos. Almacezar siempre en /tmp/ para asegurar que se escribe en RAM
banfile_stored="/etc/fail2ban/banned.ips"        # Fichero que podemos dejar grabado en la flash para volver a comenzar los baneos donde los dejamos.
                                                 # Previamente, antes de reiniciar el router debemos grabar el fichero de la memoria, a la flash.
banfile_static="/etc/fail2ban/banned_static.ips" # Para añadir manualmente ips que queramos banear desde el principio y de manera indefinida. El formato es de una IP por línea.

# Whitelist de ips a omitir en el baneo
MyIPs=$(ifconfig | grep "inet addr" | awk '{ print $2}' | cut -d ":" -f 2 | xargs)     # Todas las ips locales del router (LAN,WAN,local y VPN levantadas)
WhitelistIPs="192.168.1.1"                                                             # Ips que omitiran al baneo. Para mas de una anadir con un espacio
WhitelistDNS="entrada.dnsdinamica.ext otraentrada.no-ip.org"                           # DNS que omitiran al baneo. Requiere hostip para resolver los DNS
WhitelistIPs="$MyIPs $WhitelistIPs $(for DNS in $WhitelistDNS; do hostip $DNS; done | xargs)" # Suma todas las ips de lista blanca e ips de DNS

TriggerBan=4             # Cuantos fallos de contrasena o usuario inexistente ha de encontrar en el log para banear a la ip
LinesToFindAcces=1000    # Cuantos eventos revisa atras en el log para ver si hay un acceso correcto de esa ip. Si lo hay no la baneara. 0 para infinito
Comentario="BRUTEBAN"    # Comentario que ira asociado a la regla anadida a iptables para distinguirla
WriteLogWithAction=0     # 1 para escribir en el log cuando banea o unbanea una ip. Cualquier otra cosa para omitir.
WriteLogTag="f2b_action" # Tag al escriir en log el baneo o unbaneo (si lo has activado con WriteLogWithAction=1)

# Ambito donde se aplicaran los baneos.  En internet, red local o ambas. Descomentar la opcion deseada.
#alcance="input_rule"        # Ambas redes
#alcance="input_lan_rule"    # Solo red local
alcance="input_wan_rule"     # Solo internet    # Por defecto y para hacer pruebas con mejor seguridad desde lan

#=============================================================================================================
#======================================    CRONIFICAR    =====================================================
# Copiar en /etc/fail2ban/fail2ban_openwrt.sh y dar permisos d ejecución: chmod +x /etc/fail2ban/fail2ban_openwrt.sh
# */10 * * * *  /etc/fail2ban/fail2ban_openwrt.sh >> /dev/null 2>&1

#=============================================================================================================
#=====================================    Codigo generico   ==================================================
fecha_actual=`date +%s`
unban_date=`expr $fecha_actual + $ban_time`

#=============================================================================================================
#===================================== COMPROBACION INICIAL ==================================================

# Comprobamos si acabamos de iniciar el router y en ese caso preelaboramos el fichero de baneos
# Modificación : Si tenemos un fichero grabado previo, lo usamos.
# Modificación : Si tenemos un fichero de ips para banear estático, preelaboramos el fichero de baneos.

if [ ! -f $fail2ban_running ]; then
   touch $fail2ban_running
  
   if [ -f $banfile_static ]; then
      [ -f $banfile ] && rm $banfile

      for x in `cat $banfile_static | awk '{print $1}' FS=":"`; do
         echo 2100000000:$x >> $banfile
      done
   fi
  
   if [ -f $banfile_stored ]; then
      for l in `cat $banfile_stored | awk '{print $2}' FS=":"`; do
         exists=`cat $banfile | grep $l | wc -l`
         if [ "$exists" -lt 1 ]; then
            echo "$unban_date:$l" >> $banfile
         fi
      done
   fi

   # Si es la primera vez que lanzamos el script, debemos crear el fichero donde se guardan
   # las ips baneadas, si no lo hemos creado ya, en los procedimientos anteriores
   [ ! -f $banfile ] && touch $banfile
  
   for x in `cat $banfile | awk '{print $2}' FS=":"`; do
        echo "Anade Baneo:   iptables -I $alcance 1 -s $x -j DROP -m comment --comment "${Comentario}"
        iptables -I $alcance 1 -s $x -j DROP -m comment --comment "${Comentario}" #:${fecha_actual}:${unban_date}"
        [[ "$WriteLogWithAction" == "1" ]] && logger -t tag "$WriteLogTag" "Recuperado baneo en inicio a ip ${x}"
   done
fi

#================================================================================================
#====================== BANEO INTENTOS USUARIOS NO VALIDOS Y MAL PASSWORD =======================

# Entraran al for aquellas ips que hayan excedido mas del numero $Trigger los fallos de contrasena y usuario"
for badip in `logread | grep -e 'Login attempt for nonexistent user' -e 'Bad password' | cut -d':' -f 4 | cut -d ' ' -f 8 | uniq -c -f 7 | awk '{ if ( $1 > $TriggerBan ) print $2}'`; do
    # Si la direccion IP no esta en la lista de baneados, ni en la de recientes accesos correctos ni en la lista blanca, la anadimos a iptables
    if ! [ "$(grep $badip $banfile)" ] && ! [ "$(logread -l $LinesToFindAcces -e 'Password auth succeeded' | cut -d ':' -f 4 | cut -d ' ' -f 8 | grep $badip )" ] && ! [[ "$WhitelistIPs" == *"$badip"* ]] ; then
        iptables -I $alcance 1 -s $badip -j DROP -m comment --comment "${Comentario}" #:${fecha_actual}:${unban_date}"
        [[ "$WriteLogWithAction" == "1" ]] && logger -t tag "$WriteLogTag" "Baneo a ip ${badip}"

        # Anadimos la IP al archivo de baneados "$banfile" y la hora a la que terminara el baneo de esa IP en formato epoch (segundos desde 01-01-1970)
        echo "$unban_date:$badip" >> $banfile;
   fi
done

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

# Comprueba si alguno de los registros del fichero $banfile tiene una fecha anterior a la actual. En caso afirmativo borra las reglas de iptables
for z in `cat $banfile`; 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' $banfile
      unban_rule=`iptables -L $alcance -n --line-numbers | grep "${Comentario}" | grep -m 1 $unban_ip|awk '{print $1}'`
      iptables -D $alcance $unban_rule -m comment --comment "${Comentario}"
      [[ "$WriteLogWithAction" == "1" ]] && logger -t tag "$WriteLogTag" "Unbaneo a ip ${z}"
   fi
done
ire probando las actualizaciones y comento, gracias camaradas

Enviado desde mi ONE A2005 mediante Tapatalk

Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: jaraneda en 25-09-2017, 17:09 (Lunes)
consulta, debo instalarlo de nuevo o solo cambiando el script funcionaria? solo lo cambie
si debe instalarse se hace de la misma manera o de otra forma?
lo consulto porque no me muestra ninguna info en el firewall por luci y anteriormente lo hacia.

 Saludos y gracias.

pd: lo instale normamente pero agregue el nuevo script, revisare su comportamiento en el transcurso del dia y comento.
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: anonimoD en 26-09-2017, 17:14 (Martes)
consulta, debo instalarlo de nuevo o solo cambiando el script funcionaria? solo lo cambie
si debe instalarse se hace de la misma manera o de otra forma?
lo consulto porque no me muestra ninguna info en el firewall por luci y anteriormente lo hacia.

 Saludos y gracias.

pd: lo instale normamente pero agregue el nuevo script, revisare su comportamiento en el transcurso del dia y comento.



El script que he retocado se basa en el de TKI2000, el cual es para que lo insertéis a vuestro gusto en el cron. Cron es el programador de tareas de linux y se puede retocar con crontab -e o bien desde luci, en la seccion Sheluded Tasks. Meter un instalador y servicio me parece innecesario y verlo ahí no quiere decir que este funcionando, si sabes que tienes accesos no autorizados los mejor que puedes hacer para asegurarte es con una ip local hacer varios accesos fallidos y ver que te añade una regla de baneo en el firewall (recuerda que se ejecuta cada x minutos, por lo que hasta que no el toque ejecutarse no te baneará).  Dentro del script hay anotaciones sobre ello y otras opciones que puedes configurar, como por ejemplo añadir un nombre dns o ips a una lista de whitelist para que no te la baneé, tiempo de baneo, modificar la cantidad de intentos fallidos sobre la que aplicará el baneo, y recuerda que por defecto los logs son pequeños, si no los amplias da igual que script utilices, pues en el log se estarán perdiendo registros. Dentro del script también lo comento.
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: jaraneda en 26-09-2017, 18:32 (Martes)
estoy haciendo pruebas, esta super bien documentado en el propio script.
se agradece

Enviado desde mi ONE A2005 mediante Tapatalk

Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: anonimoD en 26-09-2017, 20:07 (Martes)
estoy haciendo pruebas, esta super bien documentado en el propio script.
se agradece

Enviado desde mi ONE A2005 mediante Tapatalk



De nada, lo ideal es que siempre quede mínimamente explicado, no solo para terceras partes, también para uno mismo si lo retoma al cabo de unos años.

Un saludo,
David.
Título: Re: Script Banear direcciones IP contra ataques SSH (Openwrt BB 14.07)
Publicado por: anonimoD en 30-09-2017, 20:04 (Sábado)
estoy haciendo pruebas, esta super bien documentado en el propio script.
se agradece

Enviado desde mi ONE A2005 mediante Tapatalk


A todo el que haya utilizado mi último script, hay dos fallos. Por favor, copiadlo de nuevo. Ya he editado mi comentario, por lo que podéis tomarlo de el. El nuevo es el que tiene modificaciones del día (2017-09-30)

@Jaraneda copia de nuevo el script. Tenía dos fallos por que el termimal de openwrt(ash) no soportaba correctamente una función que si me iba en bash, por ejemplo las whitelist no se aplicaban bien. Ya lo he corregido en mi comentario de arriba donde pegué el código. También cambié más cosas para que sea algo más comprensible y homogéneo además de añadir algo más de instrucciones.
Edita por favor el comentario donde me respondes al código y elimina la parte del código que aparece en tu respuesta para que solo quede el correcto. Gracias y disculpa!