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

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
denismikh
Сообщения: 6
Зарегистрирован: 28 дек 2021, 19:12

Оставил в скрипте только этапы:
Stage 2 - search for login attempts via WinBox
Stage 6 - search for an attempt to enter through PPTP

Время выполнения 30 минут.


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

Приветствую всех!

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

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




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

do {
    # ----------- 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 [find src-address-list="BlockDangerAddress" disabled=yes];
    }

    # IP-address validation function
    local DangerIPAddr do={
        if ($1~"[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}") do={
            if ([ip firewall address-list find list="BlockDangerAddress" address=$1;] ="") do={ 
                ip firewall address-list add address=$1 list="BlockDangerAddress" timeout=14d;
                put ">>> added in black list IP $1";
                log warning ">>> Added in black list IP $1";
                return true;
            }
        }
        return false;
    }

    # Function that reports the absence of dangerous addresses
    local NotFound do={
        if (!$1) do={
            put ">>> no new dangerous IP-addresses were found...";
        }
    }

    #----------- Stage 1 - searching of failed login attempt -----------
    put ("$[system clock get time;] Stage 1 - searching of failed login attempt");
    local isDetected false;
    foreach dangerString in=[log find topics~"system" message~"login failure for user";] do={
        local stringTemp ([log get $dangerString message;]);
        local dangerIP ([pick $stringTemp ([find $stringTemp "from"] +5) ([find $stringTemp "via"] -1)]);
        if ([$DangerIPAddr $dangerIP]) do={ set $isDetected true; }
    }
    [$NotFound $isDetected];
    
    #----------- Stage 2 - search for login attempts from unknown networks  -----------
    put ("$[system clock get time;] Stage 2 - search for login attempts from unknown networks");
    set $isDetected false;
    foreach dangerString in=[log find topics~"warning" message~"denied winbox/dude connect from";] do={
        local stringTemp ([log get $dangerString message;]);
        local dangerIP ([pick $stringTemp ([find $stringTemp "from"] +5) ([len $stringTemp])]);
        if ([$DangerIPAddr $dangerIP]) do={ set $isDetected true; }
    }
    [$NotFound $isDetected];

    #----------- Stage 3 - search for an attempt to enter through IPSec password -----------
    put ("$[system clock get time;] Stage 3 - search for an attempt to enter through IPSec password");
    set $isDetected false;
    foreach dangerString in=[log find topics~"ipsec" 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 ([$DangerIPAddr $dangerIP]) do={ set $isDetected true; }
    }
    [$NotFound $isDetected];

    #----------- Stage 4 - search for an attempt to enter through IPSec proposal -----------
    put ("$[system clock get time;] Stage 4 - search for an attempt to enter through IPSec proposal");
    set $isDetected false;
    foreach dangerString in=[log find topics~"ipsec" message~"failed to get valid proposal";] do={
        local stringTemp ([log get $dangerString message;]);
        local dangerIP ([pick $stringTemp 0 ([find $stringTemp "failed" ] -1)]);
        if ([$DangerIPAddr $dangerIP]) do={ set $isDetected true; }
    }
    [$NotFound $isDetected];

    #----------- Stage 5 - search for an attempt to enter through L2TP -----------    
    put ("$[system clock get time;] Stage 5 - search for an attempt to enter through L2TP");
    set $isDetected false;
    foreach dangerString in=[log find topics~"l2tp" message~"authentication failed";] do={
        local stringTemp ([log get $dangerString message]);
        local dangerIP ([pick $stringTemp ([find $stringTemp "<"] +1) ([find $stringTemp ">"]) ]);
        if ([$DangerIPAddr $dangerIP]) do={ set $isDetected true; }
    }
    [$NotFound $isDetected];

    #----------- Stage 6 - search for an attempt to enter through PPTP  -----------
    put ("$[system clock get time;] Stage 6 - search for an attempt to enter through PPTP");
    set $isDetected false;
    foreach dangerStr1 in=[log find topics~"pptp" 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) do={
                local stringTemp ([log get $dangerStr2 message;]);
                local dangerIP ([pick $stringTemp ([find $stringTemp "from"] +5) ([len $stringTemp])]);
                if ([$DangerIPAddr $dangerIP]) do={ set $isDetected true; }
            }
        }
    }
    [$NotFound $isDetected];

    #----------- Stage 7 - search for an attempt to enter through OVPN  -----------
    put ("$[system clock get time;] Stage 7 - search for an attempt to enter through OVPN");
    set $isDetected false;
    foreach dangerStr1 in=[log find topics~"ovpn" topics~"error" message~"unknown msg" or message~"msg too short";] do={
        foreach dangerStr2 in=[log find topics~"ovpn" 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) do={
                local stringTemp ([log get $dangerStr2 message;]);
                local dangerIP ([pick $stringTemp ([find $stringTemp "from"] +5) ([len $stringTemp])]);
                if ([$DangerIPAddr $dangerIP]) do={ set $isDetected true; }
            }
        }
    }
    [$NotFound $isDetected];

    put ("$[system clock get time;] End of search");
} on-error={ 
    put ("Script of blocking dangerous IP addresses worked with errors.");
    log warning ("Script of blocking dangerous IP addresses worked with errors."); 
}



Прошу заинтересованных погонять этот вариант скрипта и отписаться о замеченных проблемах и недостатках.

Заранее спасибо.
Последний раз редактировалось drpioneer 19 янв 2022, 16:02, всего редактировалось 1 раз.


hacklog
Сообщения: 1
Зарегистрирован: 04 янв 2022, 12:51

Стоит 1 раз ввести неправильный пароль, и ">>> Added in black list IP 74.119.192.60." Это правильная работа скрипта? Боюсь когда-то себя из-за опечатки забанить... )


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

hacklog писал(а): 04 янв 2022, 12:54 Стоит 1 раз ввести неправильный пароль, и ">>> Added in black list IP 74.119.192.60." Это правильная работа скрипта? Боюсь когда-то себя из-за опечатки забанить... )
Добрый день.
Это правильная работа скрипта.
Одно из возможных решений предложено здесь.


chipap
Сообщения: 2
Зарегистрирован: 31 янв 2022, 10:42

drpioneer писал(а): 31 дек 2021, 02:09 Приветствую всех!

Переписал скрипт с учётом накопившихся замечаний:
  • попытался ускорить работу скрипта на старых устройствах
  • подправил логику поиска проблемных IP-адресов
  • добавил поиск проблемных IP-адресов для OVPN-подключений
  • убрал ненужную информацию об именах пользователей
  • переделал вывод инфы о текущем состоянии скрипта в терминал
Добрый день! Спасибо Вам за спасительный скрипт!

Очень выручал! Сейчас заметил, что после обновления на 6.49.2 (RB750) он перестал работать(
В логах после запуска скрипта ничего нет.

Могу помочь вам чем либо в отладке / понимании проблемы?

Спасибо!


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

chipap писал(а): 31 янв 2022, 10:48 ...
Очень выручал! Сейчас заметил, что после обновления на 6.49.2 (RB750) он перестал работать(
В логах после запуска скрипта ничего нет.
Могу помочь вам чем либо в отладке / понимании проблемы?
...
Добрый день.

Предлагаю начать с проверки установленной версии Firmware RouterBoard.
Если она НЕ равна версии RouterOS (6.49.2), тогда её стОит обновить.
Если версия Firmware RouterBoard = 6.49.2, тогда запустите скрипт в терминале:

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

system script run danger
( где danger - это имя скрипта )

Продемонстрируйте результат работы скрипта в терминале.
Должно быть что-то похожее на это:

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

13:03:42 Stage 1 - searching of failed login attempt
>>> no new dangerous IP-addresses were found...
13:03:42 Stage 2 - search for login attempts from unknown networks
>>> no new dangerous IP-addresses were found...
13:03:42 Stage 3 - search for an attempt to enter through IPSec password
>>> no new dangerous IP-addresses were found...
13:03:43 Stage 4 - search for an attempt to enter through IPSec proposal
>>> no new dangerous IP-addresses were found...
13:03:43 Stage 5 - search for an attempt to enter through L2TP
>>> no new dangerous IP-addresses were found...
13:03:44 Stage 6 - search for an attempt to enter through PPTP
>>> no new dangerous IP-addresses were found...
13:03:44 Stage 7 - search for an attempt to enter through OVPN
>>> no new dangerous IP-addresses were found...
13:03:45 End of search
И приложите строки LOGа с атаками на роутер, на которые скрипт должен был отреагировать.

Заранее спасибо.


MMAXSIM
Сообщения: 6
Зарегистрирован: 24 янв 2021, 14:23

Добрый день!
А не могли-бы вы добавить блокировку таких ip. Нужные мне я добавлю в белый список.
Изображение


DamonNebylica
Сообщения: 1
Зарегистрирован: 11 фев 2022, 13:01

Скрипт очень порадовал. Наконец недоброжелатели "блочатся". Работает прекрасно, на 3011 не имеет значения даже отличается ли firmware от hardware. Время выполнения менее 10 секунд, проц загружается всего на 50%. Потестил уже на двух подобных железках. На 951-ые и 952-ые хочу попозже тоже попробовать, сегодня уже нет времени. Спасибо тебе человечище!


Bsm
Сообщения: 1
Зарегистрирован: 15 фев 2022, 10:35

Отличный скриптик, работал на ура до обновления до 7.1.2 , после обновления начал ошибку выдавать "Script of blocking dangerous IP addresses worked with errors."


andrey-d
Сообщения: 3
Зарегистрирован: 16 фев 2022, 02:31

Отличный скрипт!


Ответить