Скрипт блокировки ip-адресов, с которых пытаются подобрать пользователей роутера

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Может не понял чего, поправьте ...
Зачем банить ip из лога тех, кто пытается подобрать пароль к vpn ? Ведь это почти бессмысленно, так как никто не делает больше одной попытки с одного IP-адреса - IP постоянно меняются ...


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Sertik писал(а): 06 дек 2021, 21:15 ...
Зачем банить ip из лога тех, кто пытается подобрать пароль к vpn ? Ведь это почти бессмысленно, так как никто не делает больше одной попытки с одного IP-адреса - IP постоянно меняются
...
Есть список хотелок: viewtopic.php?p=70810#p70810, согласно которому скрипт развивается.
Этой позицией покрывается последний пункт в списке хотелок.
tranceinsane писал(а): 06 дек 2021, 09:59 ...
а у меня этот скрипт не работает. Предыдущий работает, а вот именно этот нет, просто тихо и все. В чем может быть проблема?
...
Скрипт был немного усовершенствован:

Код: Выделить всё



# Script for blocking dangerous addresses that tried to connect to the router by drPioneer
# https://forummikrotik.ru/viewtopic.php?p=82619#p82619
# tested on ROS 6.49
# updated 2021/12/08

:do {
    :local outMsg "Dangerous addresses detected:";
    :local lenMsg [:len $outMsg];

    # ----------- Stage 1 - search for a device login attempt ----------- 
    :foreach routerUser in=[ /user find disabled=no; ] do={
        :do {
            :foreach dangerString in=[ /log find message~"login failure for user"; ] do={
                :do { 
                    :local stringTemp ([ /log get $dangerString message ]);
                    :local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "from" ] - 1 )]);
                    :local dangerIP   ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :find $stringTemp "via"  ] - 1 )]);
                    :local dangerVia  ([ :pick $stringTemp ([ :find $stringTemp "via"  ])     ([ :find $stringTemp "via"  ] + 20)]);
                    :if ($routerUser != $dangerUser) do={
                        :if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={ 
                            /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
                            :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong router user '".$dangerUser."' ".$dangerVia.")");
                        } 
                    }
                } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Login failure for user' in log."); } 
            }
        } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found active router user."); }
    }

    # ----------- Stage 2 - search for login attempts via WinBox  ----------- 
    :foreach dangerString in=[ /log find message~"denied winbox/dude connect from"; ] do={
        :do {
            :local stringTemp ([ /log get $dangerString message ]);
            :local dangerIP ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :len $stringTemp ]) ]);
            :if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={ 
                /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
                :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (not allowed WinBox user IP-address)");
            }
        } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Denied winbox/dude connect from' in log."); }
    }

    # ----------- Stage 3 - search for an attempt to enter through IPSec password ----------- 
    :foreach dangerString in=[ /log find message~"parsing packet failed, possible cause: wrong password"; ] do={
        :do {
            :local stringTemp ([ /log get $dangerString message ]);
            :local dangerIP   ([ :pick $stringTemp 0 ([ :find $stringTemp "parsing" ] - 1) ]);
            :if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={ 
                /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
                :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong IPSec password)");
            }
        } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Parsing packet failed, possible cause: wrong password' in log."); }
    }

    # ----------- Stage 4 - search for an attempt to enter through IPSec proposal ----------- 
    :foreach dangerString in=[ /log find message~"failed to get valid proposal"; ] do={
        :do {
            :local stringTemp ([ /log get $dangerString message ]);
            :local dangerIP   ([ :pick $stringTemp 0 ([ :find $stringTemp "failed" ] - 1) ]);
            if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={ 
                /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
                :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong IPSec proposal)");
            } 
        } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string 'Failed to get valid proposal' in log."); }
    }

    # ----------- Stage 5 - search for an attempt to enter through L2TP ----------- 
    :foreach dangerString in=[ /log find topics~"l2tp" message~"user" message~"authentication failed"; ] do={
        :do {
            :local stringTemp ([ /log get $dangerString message ]);
            :local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "authentication" ] - 1) ]);
            :local dangerIP   ([ :pick $stringTemp ([ :find $stringTemp "<"    ] + 1) ([ :find $stringTemp ">" ]) ]);
            :if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={ 
                /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
                :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong L2TP user '".$dangerUser."')");
            }
        } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of L2TP 'User' & 'Authentication failed' in log."); }
    }    

    # ----------- Stage 6 - search for an attempt to enter through PPTP  ----------- 
    :foreach dangerStr1 in=[ /log find topics~"pptp" message~"user" message~"authentication failed"; ] do={
        :do {
            :foreach dangerStr2 in=[ /log find topics~"pptp" message~"TCP connection established from"; ] do={
                :do {
                    :local stringId1 ("0x".[:pick $dangerStr1 ([:find $dangerStr1 "*"] + 1) [:len $dangerStr1]]);
                    :local stringId2 ("0x".[:pick $dangerStr2 ([:find $dangerStr2 "*"] + 1) [:len $dangerStr2]]);
                    :if ((($stringId1 - $stringId2) = 1) || (($stringId2 - $stringId1) = 1)) do={
                        :local stringTemp ([ /log get $dangerStr1 message ]);
                        :local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "authentication" ] - 1) ]);
                        :local stringTemp ([ /log get $dangerStr2 message ]);
                        :local dangerIP   ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :len $stringTemp ]) ]);
                        :if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={ 
                            /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
                            :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong PPTP user '".$dangerUser."')");
                        }
                    }
                } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of PPTP 'TCP connection established from' in log."); }
            }
        } on-error={ :set outMsg ($outMsg."\r\n>>> Script error. Not found string of PPTP 'User' & 'Authentication failed' in log."); }
    }

    # ----------- Checking & installing firewall-filter rule ----------- 
    :if ([ /ip firewall filter find src-address-list="BlockDangerAddress"; ] = "") do={
        /ip firewall filter add action=drop chain=input comment="Dropping dangerous adresses" src-address-list=BlockDangerAddress;
    }
    :if ([ /ip firewall filter find src-address-list="BlockDangerAddress" disabled=yes; ] != "") do={
        /ip firewall filter enable [ /ip firewall filter find src-address-list="BlockDangerAddress" disabled=yes; ];
    }

    # ----------- Output searching results ----------- 
    :if ([:len $outMsg] > $lenMsg) do={
        :put $outMsg;
        :log warning $outMsg;
    }
}


- подправлена логика поиска проблемных IP-адресов для PPTP
- внедрено автодобавление отсутствующего и включение выключенного правила в "Firewall->Filter Rules", производящего глушение проблемных IP-адресов. Положение правила в списке необходимо выставлять вручную в соответствии со своими предпочтениями.


Mikuser01
Сообщения: 3
Зарегистрирован: 20 дек 2021, 23:13

Добрый день. Спасибо большое за замечательный скрипт. Скрипт добавляет только последнего пользователя или всех кто есть в логах?
Изображение


Аватара пользователя
Virtue
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

Mikuser01 писал(а): 20 дек 2021, 23:18 Добрый день. Спасибо большое за замечательный скрипт. Скрипт добавляет только последнего пользователя или всех кто есть в логах?
Изображение
с тех же самых айпишек сегодня и меня долбили..
добавил правило:

Код: Выделить всё

/ip firewall filter
add action=accept chain=input dst-port=1723 in-interface="интерфейс, смотрящий в интернет" protocol=tcp src-address-list="лист разрешенных адресов"
add action=drop chain=input in-interface="интерфейс, смотрящий в интернет" 
и больше не беспокоят...


Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Mikuser01 писал(а): 20 дек 2021, 23:18 Добрый день. Спасибо большое за замечательный скрипт. Скрипт добавляет только последнего пользователя или всех кто есть в логах?
Изображение
Приветствую.
Скрипт формирует чёрный список всех подозрительных IP-адресов.
Скрипт никуда не добавляет никаких пользователей.


denismikh
Сообщения: 6
Зарегистрирован: 28 дек 2021, 19:12

Добрый! Заметил что скрипт долго выполняется, загрузка CPU 100%, если лог пишется на диск в 10000 строк. Проверяли на 951Ui-2HnD с прошивкой 6.49.2, время выполнение заняло примерно 35 минут.


Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

denismikh писал(а): 28 дек 2021, 19:21 Добрый! Заметил что скрипт долго выполняется, загрузка CPU 100%, если лог пишется на диск в 10000 строк. Проверяли на 951Ui-2HnD с прошивкой 6.49.2, время выполнение заняло примерно 35 минут.
Добрый день.

Подтвердил подобное поведение при описанных условиях на RB751U-2HnD ROS 6.49.
Переписал скрипт на предмет ускорения его работы.
Теперь в моих условиях скрипт грузит процессор на 100% в течении 30 секунд.
Считаю такой вариант приемлемым по сравнению с тем, что было:

Код: Выделить всё




# Script of blocking dangerous addresses by drPioneer.
# https://forummikrotik.ru/viewtopic.php?t=4781&start=20
# tested on ROS 6.49
# updated 2021/12/29

:do {
    :local outMsg "Detected dangerous addresses:";
    :local lenMsg [:len [$outMsg]];
    
    # ----------- Stage 1 - search for a device login attempt ----------- 
    :foreach dangerString   in=[ /log find message~"login failure for user"; ] do={
        :foreach routerUser in=[ /user find disabled=no; ] do={
            :local stringTemp ([ /log get $dangerString message; ]);
            :local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "from" ] - 1 )]);
            :local dangerIP   ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :find $stringTemp "via"  ] - 1 )]);
            :local dangerVia  ([ :pick $stringTemp ([ :find $stringTemp "via"  ])     ([ :find $stringTemp "via"  ] + 20)]);
            :if ($routerUser != $dangerUser) do={
                :if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP; ] = "" ) do={ 
                    /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
                    :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong router user '".$dangerUser."' ".$dangerVia.")");
                } 
            }
        }
    }
    
    # ----------- Stage 2 - search for login attempts via WinBox  ----------- 
    :foreach dangerString in=[ /log find message~"denied winbox/dude connect from"; ] do={
        :local stringTemp   ([ /log get $dangerString message; ]);
        :local dangerIP     ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :len $stringTemp ]) ]);
        :if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP; ] = "" ) do={ 
            /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
            :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (not allowed WinBox user IP-address)");
        }
    }
    
    # ----------- Stage 3 - search for an attempt to enter through IPSec password ----------- 
    :foreach dangerString in=[ /log find message~"parsing packet failed, possible cause: wrong password"; ] do={
        :local stringTemp   ([ /log get $dangerString message; ]);
        :local dangerIP     ([ :pick $stringTemp 0 ([ :find $stringTemp "parsing" ] - 1) ]);
        :if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP; ] = "" ) do={ 
            /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
            :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong IPSec password)");
        }
    }
    
    # ----------- Stage 4 - search for an attempt to enter through IPSec proposal ----------- 
    :foreach dangerString in=[ /log find message~"failed to get valid proposal"; ] do={
        :local stringTemp   ([ /log get $dangerString message; ]);
        :local dangerIP     ([ :pick $stringTemp 0 ([ :find $stringTemp "failed" ] - 1) ]);
        :if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP; ] = "" ) do={ 
            /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
            :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong IPSec proposal)");
        } 
    }
    
    # ----------- Stage 5 - search for an attempt to enter through L2TP ----------- 
    :foreach dangerString in=[ /log find topics~"l2tp" message~"user" message~"authentication failed"; ] do={
        :local stringTemp ([ /log get $dangerString message; ]);
        :local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "authentication" ] - 1) ]);
        :local dangerIP   ([ :pick $stringTemp ([ :find $stringTemp "<"    ] + 1) ([ :find $stringTemp ">" ]) ]);
        :if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP; ] = "" ) do={ 
            /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
            :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong L2TP user '".$dangerUser."')");
        }
    }    
    
    # ----------- Stage 6 - search for an attempt to enter through PPTP  ----------- 
    :foreach dangerStr1     in=[ /log find topics~"pptp" message~"user" message~"authentication failed"; ] do={
        :foreach dangerStr2 in=[ /log find topics~"pptp" message~"TCP connection established from"; ] do={
            :local stringId1 ("0x".[:pick $dangerStr1 ([:find $dangerStr1 "*"] + 1) [:len $dangerStr1]]);
            :local stringId2 ("0x".[:pick $dangerStr2 ([:find $dangerStr2 "*"] + 1) [:len $dangerStr2]]);
            :if ((($stringId1 - $stringId2) = 1) || (($stringId2 - $stringId1) = 1)) do={
                :local stringTemp ([ /log get $dangerStr1 message ]);
                :local dangerUser ([ :pick $stringTemp ([ :find $stringTemp "user" ] + 5) ([ :find $stringTemp "authentication" ] - 1) ]);
                :local stringTemp ([ /log get $dangerStr2 message; ]);
                :local dangerIP   ([ :pick $stringTemp ([ :find $stringTemp "from" ] + 5) ([ :len $stringTemp ]) ]);
                :if ([ /ip firewall address-list find list="BlockDangerAddress" address=$dangerIP ] = "" ) do={ 
                    /ip firewall address-list add address=$dangerIP list="BlockDangerAddress" timeout=14d;
                    :set outMsg ($outMsg."\r\n>>> Added in black list IP ".$dangerIP." (wrong PPTP user '".$dangerUser."')");
                }
            }
        }
    }
    
    # ----------- Checking & installing firewall-filter rule ----------- 
    :if ([ /ip firewall filter find src-address-list="BlockDangerAddress"; ] = "") do={
        /ip firewall filter add action=drop chain=input comment="Dropping dangerous adresses" src-address-list=BlockDangerAddress;
    }
    :if ([ /ip firewall filter find src-address-list="BlockDangerAddress" disabled=yes; ] != "") do={
        /ip firewall filter enable [ /ip firewall filter find src-address-list="BlockDangerAddress" disabled=yes; ];
    }

    # ----------- Output searching results ----------- 
    :if ([:len $outMsg] > $lenMsg) do={
        :put $outMsg;
        :log warning $outMsg;
    }
} on-error={ :log warning ("Script of blocking dangerous IP addresses worked with errors."); }



Спасибо за замечание :co_ol: .
Последний раз редактировалось drpioneer 29 дек 2021, 12:35, всего редактировалось 2 раза.


denismikh
Сообщения: 6
Зарегистрирован: 28 дек 2021, 19:12

drpioneer писал(а): 28 дек 2021, 23:34 Добрый день.

Подтвердил подобное поведение при описанных условиях на RB751U-2HnD ROS 6.49.
Переписал скрипт на предмет ускорения его работы.
Теперь в моих условиях скрипт грузит процессор на 100% в течении 30 секунд.
Считаю такой вариант приемлемым по сравнению с тем, что было:
Спасибо! Заметил в скрипте теперь нет этапа #Checking & installing firewall-filter rule, его можно вернуть?


Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

denismikh писал(а): 29 дек 2021, 11:31
drpioneer писал(а): 28 дек 2021, 23:34 ...
Переписал скрипт на предмет ускорения его работы.
...
Спасибо! Заметил в скрипте теперь нет этапа #Checking & installing firewall-filter rule, его можно вернуть?
Внёс недостающий этап: viewtopic.php?p=83124#p83124 :smu:sche_nie:
Ещё раз спасибо за замечание.


denismikh
Сообщения: 6
Зарегистрирован: 28 дек 2021, 19:12

Проверил ещё раз, время выполнения всё равно 30 минут.
 Скрины
Изображение

Настройки лога на диск
Изображение


Ответить