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

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

Добрый день.
hacklog писал(а): 04 янв 2022, 12:54 Стоит 1 раз ввести неправильный пароль, и ">>> Added in black list IP 74.119.192.60."
...
Боюсь когда-то себя из-за опечатки забанить... )
denismikh писал(а): 29 дек 2021, 13:39 Время выполнения 30 минут.
MMAXSIM писал(а): 11 фев 2022, 11:15 А не могли-бы вы добавить блокировку таких ip. Нужные мне я добавлю в белый список.
Обновил скрипт с учётом пожеланий пользователей:

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




# Script for searching and blocking dangerous addresses by drPioneer.
# https://forummikrotik.ru/viewtopic.php?p=84017#p84017
# tested on ROS 6.49
# updated 2022/02/18

:do {
    # Setting log scan level:  extremeScan = false (usual option) / true (extremal option)
    :local extremeScan false;
    
    # ----------- Checking & installing firewall-filter rules ----------- 
    :if ([ip firewall filter find src-address-list="BlockDangerAddress"]="") do={
        ip firewall filter add action=drop chain=input comment="Dropping dangerous addresses" 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];
    }
    :if ([ip firewall filter find src-address-list="White List"]="") do={
        ip firewall filter add chain=input comment="White List of IP-addresses" src-address-list="White List" place-before=0;
        ip firewall address-list add address="input_your_address" list="White List";
    }
    :if ([ip firewall filter find src-address-list="White List" disabled=yes]!="") do={
        ip firewall filter enable [find src-address-list="White List" disabled=yes];
    }
    :put "$[system clock get time] - Start of searching dangerous addresses on '$[system identity get name]' router.";
    :if ($extremeScan) do={:put "$[system clock get time] - BE CAREFUL!!!!!! Extreme scanning mode is ENABLED!"}

    # 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 "$[system clock get time] - 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 "$[system clock get time] - No new dangerous IP-addresses were found."}
    }

    # Function of converting decimal numbers to hexadecimal
    :local DecToHex do={
        :if ($1 < 10) do={:return ("*".$1)}
        :local tempNumber $1;
        :local result "";
        :local remainder 0; 
        :local hextable [:toarray "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F"];
        :while ($tempNumber > 0) do={
            :set remainder ($tempNumber % 16);
            :set tempNumber [:tonum ($tempNumber >> 4)];
            :set result (($hextable->$remainder).$result);
        }
        :return ("*".$result);
    }
    
    #----------- Stage of searching for failed login attempts -----------
    :put "$[system clock get time] - Stage of searching for failed login attempts:";
    :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 of searching for login attempts from unknown networks  -----------
    :put "$[system clock get time] - Stage of searching 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 of searching for attempts to enter through an IPsec password -----------
    :put "$[system clock get time] - Stage of searching for attempts to enter through an 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 of searching for attempts to enter through IPSec proposal -----------
    :put "$[system clock get time] - Stage of searching for attempts 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 of searching for attempts to enter through L2TP -----------    
    :put "$[system clock get time] - Stage of searching for attempts 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 of searching for attempts to establish TCP connection -----------
    :if ($extremeScan) do={
        :put "$[system clock get time] - Stage of searching for attempts to establish TCP connection:";
        :set $isDetected false;
        :foreach dangerString in=[:log find message~"TCP connection established 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];
    } else={

    #----------- Stage of searching for attempts to enter through PPTP -----------
        :put "$[system clock get time] - Stage of searching for attempts to enter through PPTP:";
        :local dangerString1 [:toarray [:log find topics~"pptp" message~"authentication failed"]];
        :local dangerString2 [:toarray [:log find topics~"pptp" message~"TCP connection established from"]];
        :set $isDetected false;
        :foreach dangerString in=$dangerString2 do={
            :local string2   ([:log get $dangerString message])
            :local stringId2 ("0x".[:pick $dangerString ([:find $dangerString "*"] +1) [:len $dangerString]]);
            :local stringId1 ("$[$DecToHex ([:tonum ($stringId2)] +1)]");
            :if ([:len [:find $dangerString1 $stringId1]]!=0) do={
                :local dangerIP ([:pick $string2 ([:find $string2 "from"] +5) ([:len $string2])]);
                :if ([$DangerIPAddr $dangerIP]) do={:set $isDetected true}
            }
        }
        [$NotFound $isDetected];
    
    #----------- Stage of searching for attempts to enter through OVPN  -----------
        :put "$[system clock get time] - Stage of searching for attempts to enter through OVPN:";
        :local dangerString1 [:toarray [:log find topics~"ovpn" topics~"error" message~"unknown msg" or message~"msg too short"]];
        :local dangerString2 [:toarray [:log find topics~"ovpn" message~"TCP connection established from"]];
        :set $isDetected false;
        :foreach dangerString in=$dangerString2 do={
            :local string2   ([:log get $dangerString message])
            :local stringId2 ("0x".[:pick $dangerString ([:find $dangerString "*"] +1) [:len $dangerString]]);
            :local stringId1 ("$[$DecToHex ([:tonum ($stringId2)] +1)]");
            :if ([:len [:find $dangerString1 $stringId1]]!=0) do={
                :local dangerIP ([:pick $string2 ([:find $string2 "from"] +5) ([:len $string2])]);
                :if ([$DangerIPAddr $dangerIP]) do={:set $isDetected true}
            }
        }
        [$NotFound $isDetected];
    }        

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



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

Нововведения в работе скрипта:
  • добавлено включение отсутствующего или неактивного правила "Firewall->Filter Rules" для работы с белым списком IP-адресов
  • изменена логика поиска проблемных IP-адресов для PPTP и OVPN -> ускорена обработка длинных журналов устройства
  • в качестве эксперимента добавлена возможность "экстремального" сканирования журнала устройства.
Режим "экстремального" сканирования по умолчанию выключен, но его можно включить путём ручного изменения в коде значения переменной extremeScan из false в true.
При активировании такого варианта сканирования нужно быть готовым, что могут быть заблокированы нужные вам IP-адреса. Для исключения блокировки нужных IP-адресов, их заранее следует внести в белый список "Firewall->Address Lists"

Принимаются предложения и конструктивная критика.
Последний раз редактировалось drpioneer 18 фев 2022, 17:58, всего редактировалось 3 раза.


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

Добрый! Думаю правило White List в Firewall при добавлении, следует поднять в самый верх списка, так как у многих уже есть правила блокировки.


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

denismikh писал(а): 18 фев 2022, 14:00 Добрый! Думаю правило White List в Firewall при добавлении, следует поднять в самый верх списка, так как у многих уже есть правила блокировки.
Почему бы и нет?
Приделал! :co_ol:

viewtopic.php?p=84017#p84017


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

Только уберите :local extremeScan true; как по умолчанию)) а то я уже ощутил экстрим.


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

denismikh писал(а): 18 фев 2022, 15:37 Только уберите :local extremeScan true; как по умолчанию)) а то я уже ощутил экстрим.
Спасибо за замечание.
Был невнимателен. :nez-nayu:
Исправил. :-ok-:


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

Добрый вечер.
В старом скрипте WhiteList был слитно написан, теперь через пробел. чуть на грабли с extremeScan не наступил. Думая что нужные айпи в порядке.

P.S. И да. Каждую ночь конфиг шлется на почту. Потом быстренько с телефона скачал и залил обратно в роутер , сброшенный ресетом :ps_ih:


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

MMAXSIM писал(а): 18 фев 2022, 19:13 Добрый вечер.
В старом скрипте WhiteList был слитно написан, теперь через пробел. чуть на грабли с extremeScan не наступил. Думая что нужные айпи в порядке.

P.S. И да. Каждую ночь конфиг шлется на почту. Потом быстренько с телефона скачал и залил обратно в роутер , сброшенный ресетом :ps_ih:
В старом скрипте белого списка не было в принципе. Была лишь отсылка к сообщению, как его прикрутить вручную:
viewtopic.php?p=76298#p76298
В том сообщении "White List" написано через пробел...


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

MMAXSIM писал(а): 18 фев 2022, 19:13 В старом скрипте белого списка не было в принципе. Была лишь отсылка к сообщению, как его прикрутить вручную:
viewtopic.php?p=76298#p76298
В том сообщении "White List" написано через пробел...
Разобрался. Спасибо.


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

Я бы оба правила для белых и черных списков создавал в разделе RAW

Предыстория:
Стал список BlockDangerAddress использовать для собственных блокировок связанных с forward (чтобы не плодить кучу списков и кучу правил для этих списков)
А обнаружение попыток подключения через NAT (dstnat) находятся в разделе Mangle (например проброс порта к RDP или FTP).
Это связано с тем, что правила NAT исполняются раньше, чем Firewall.
В итоге правило блокировки прописанное в Firewall надо делать в двух экземплярах - input и forward , а в RAW достаточно только одно - prerouting
Но даже при двух правилах в Firewall, адреса попавшие в BlockDangerAddress продолжают обрабатываться правилами в Mangle (Mangle исполняется раньше NAT и Firewall). А запросов иногда прилетает огромная куча.
Цепочка примерно такая: --> RAW --> Mangle (prerouting) --> NAT --> Mangle (input/forward) --> Firewall (input/forward) --> . Более подробно описано в документации.

Поэтому лучше делать в RAW

Размещать верхним правило prerouting/accept для белого списка , а следом за ним правило prerouting/drop для BlockDangerAddress , тогда все запросы от злоумышленников режутся в самом начале прероутинга и не грузят лишний раз наш микрот.
Далее все правила для белого списка в разделе Firewall и NAT оставляем как нам надо.

Кстати вместо белого списка использую AdminList - только админы имеют привелегии, остальные на общих основаниях, либо через свой список по другим портам (их могу менять при необходимости).
Последний раз редактировалось andrey-d 24 фев 2022, 00:04, всего редактировалось 2 раза.


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

Кстати, чтобы люди не страдали от неожиданно созданного правила блокировки - правило можно создавать отключенным.
А его перемещение и включение делать в режиме Safe Mode.

В случае потери связи с микротиком, режим Safe Mode отключится через некоторое время, вернёт всё как было и не нужно устраивать пляски с бубнами :-):

Главное Safe Mode отключить не забыть :hi_hi_hi:

Если правило отключено - пусть скрипт в лог кричит, что правило блокировки отключено.


Ответить