Mikrotik Script para bloquear intentos de login


Leyendo en el foro de mikrotik me encontre con este script que monitorea el log en busca errores , Y bloquea en base a la cantidad de intentos de acceso. Lo interesante es que podemos configurarlo para detectar distintos tipos de acceso. Por ejemplo los famosos intentos de acceso por VPN Ipsec que dicen «phase1 negotiation failed…». O los accesos erroneos por winbox nos dirian «login failure for user», etc.

Paso 1, importar script pegando esto en la terminal.

/sys script 
add dont-require-permissions=no name=LoginAttempBlocker owner=usuario policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="# Check if exist drop \
    firewall rule and add\r\
    \n/ip firewall raw\r\
    \n:if ([:len [find where src-address-list=\"blockedUsers\"]] = 0) do={\r\
    \n    add action=drop chain=prerouting src-address-list=blockedUsers\r\
    \n}\r\
    \n\r\
    \n:global lastLogLogin\r\
    \n:if ([:typeof \$lastLogLogin] != \"num\") do={:set lastLogLogin 0}\r\
    \n\r\
    \n/log\r\
    \n:global maxattampt 3\r\
    \n:global errorArray [:toarray \"\"]\r\
    \n:global failmsg    \"login failure for user \"\r\
    \n:global frommsg    \" from \"\r\
    \n:global viamsg     \" via \"\r\
    \n:global listfail   \"blockedUsers\"\r\
    \n:local  id2num     do={:return [:tonum \"0x\$[:pick \$1 1 [:len \$1]]\"]}\r\
    \n\r\
    \n:foreach rlog in=[find where (([\$id2num \$\".id\"] > \$lastLogLogin) \\\r\
    \n                             and \\\r\
    \n                             (message~\"((25[0-5]|(2[0-4]|[01]\\\?[0-9]\\\?)[0-9])\\\\.){3}(25[0-5]|(2[0-4]|[01]\\\?[0-9]\\\?)[0-9])\"))] do={\r\
    \n    \r\
    \n    :set lastLogLogin [\$id2num \$rlog]\r\
    \n    :local rmess [get \$rlog message]\r\
    \n    :if ((\$rmess~\$failmsg) and (\$rmess~\$frommsg) and (\$rmess~\$viamsg)) do={\r\
    \n         :local userinside [:pick \$rmess ([:find \$rmess \$failmsg -1] + [:len \$failmsg]) [:find \$rmess \$frommsg -1]]\r\
    \n         :local ipinside   [:pick \$rmess ([:find \$rmess \$frommsg -1] + [:len \$frommsg]) [:find \$rmess \$viamsg -1]]\r\
    \n         :local intinside  [:pick \$rmess ([:find \$rmess \$viamsg -1] + [:len \$viamsg]) [:len \$rmess]]\r\
    \n         :if ([:typeof ((\$errorArray)->\$ipinside)] = \"nothing\") do={\r\
    \n             :set ((\$errorArray)->\$ipinside) 1\r\
    \n         } else={\r\
    \n             :set ((\$errorArray)->\$ipinside) (((\$errorArray)->\$ipinside) + 1) \r\
    \n         }\r\
    \n         :if (((\$errorArray)->\$ipinside) > (\$maxattampt - 1)) do={\r\
    \n             /ip firewall address-list\r\
    \n             :if ([:len [find where list=\$listfail and address=\$ipinside]] = 0) do={\r\
    \n                 add list=\$listfail address=\$ipinside comment=\"\$rmess\" timeout=24h\r\
    \n             }\r\
    \n         }\r\
    \n         \r\
    \n    }\r\
    \n}"

Paso 2, configurar el script editando las variables globales:

:global maxattampt 3
:global failmsg    "login failure for user "
:global frommsg    " from "
:global viamsg     " via "
:global listfail  "blockedUsers"

3 serian la cantidad de intentos que toleramos. (para bloquear en un cuarto intento).

login from user, from y via van a depender del mensaje en el log que querramos capturar. Si quieren filtrar intentos de acceso por winbox entonces dejarlo como esta.

blockedUsers es la lista del firewall que se crea dinamicamente con la/s IP del usuario que intenta acceder.

Paso 3, agregar tu script al calendario para que se ejecute cada 5 minutos o menos.

Esto hara que nuestro script lea el log cada 5 minutos. Mas ajustemos el tiempo, mas eficiente sera el chequeo de acceso. Si dentro de estos 5 minutos, hubo 3 o mas intentos, automaticamente se creara una regla en el Firewall Raw, y borrara todo el input desde la direccion IP dinamica detectada en la lista blockedUsers. Se entiende que en las proximas 24 hs caducara la direccion y volvera a tener acceso.

______________

origen: tech-nico.com

Deja un comentario