Перейти к содержимому


Фотография

Ловим любителей подбирать пароли Hotspot Wifi

Hotspot WiFi Brutforce

  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 Dims

Dims

    Новичок

  • Members
  • Pip
  • 1 сообщений

Отправлено 30 Март 2017 - 06:53

Хочу поделиться. Может кому полезно будет.

 

Mikrotik 6.38.1 (stable)

 

У меня в организации возникла необходимость раздавать WiFi внутри через Hotspot с WEB-авторизацией.

Но так как ходят разные человеки и от "особоумных" пришлось сделать автоблокировщик по МАК. А чтобы не подбирали пароли.

 

Работа скрипта следующая.

Анализируем log. Отлавливаем сообщения по topics и имени сервера WiFI

needenter - топик в логах

/log print
12:41:51 hotspot,info,debug XX:XX:XX:XX:XX:XX (X.X.X.X): login failed: invalid username or password

needserver - имя сервера hotspot`a

/ip hotspot print
 #   NAME                                   INTERFACE                                   ADDRESS-POOL                                   PROFILE                                   IDLE-TIMEOUT
 0   wifi-server                            ether9                                                                                     wifi-hsprof                               1h          

fPass - количество попыток подбора

 

################################### SETTING ################################################
# топик в логах
:local needenter "hotspot";
# имя сервера
:local needserver "wifi-server";
# количество попыток

:local fPass 10;
# разрешаем разблокировку
:local UBlocked true;
# время блокировки (в секундах)
:local TimeBlocked ( 24 * 3600 );
###########################################################################################

 

В процессе скрипта создаются глобальные переменные:

:global LCplxMacBrut; - массив маков и количество неудачных попыток

:global LCplxMacBlocked; - массив маков забаненых и время разблокировки
:global LCplxMacBrutTime; - значения времени отсчета для избежания повторных реакций на сообщения в логе

 

И если количество попыток больше fPass то биндим МАК как blocked с добавлением временной метки в комментарии когда был заблокирован.

/ip hotspot ip-binding add mac-address="$Mac" comment="$comm" server="$HotServer" type=blocked disabled=no;

Если есть запись в биндах то включает ее и ставит blocked.

 

2017-04-05:

Не трогает bypassed, то есть уже забинденых на проход МАКи.

2017-04-07

Добавлена возможность сохранять БАН-масив при перезагрузке. ВНИМАНИЕ!: Используется comment скрипта.

Функции вынесены в отдельный скрипт.

 

 

Глобальные функции:

LCplxFunctions

#functions

# function getSQLDateTime returned DateTime in fromat YYYY-MM-DD HH:MM:SS
# USE: $getSQLDateTime;
# function getSQLDate returned date in format YYYY-MM-DD
# USE: $getSQLDate;
# function getSQLTime returned time in format HH:MM:SS
# USE: $getSQLTime;
# function convert format datetime (YYYY-MM-DD HH:MM:SS) to UnixTime
# USE: $UNIXTime [datetime];
# DeleteFromArray index from begin 0
# USE: $DeleteFromArray <array> [index];


:if ([/system scheduler find name="LCplxFunctions"] = "") do={
    /system scheduler add name="LCplxFunctions" start-date="Jan/01/1970" start-time="startup" on-event="/system script run \"LCplxFunctions\";";
};

:global getSQLDateTime do={
:local CurTime ([/system clock get date] . " " . [/system clock get time]);
    :local montsarr ([:toarray "jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec"]);
    :local mon ([:pick $CurTime 0 3]); :local day ([:pick $CurTime 4 6]); :local year ([:pick $CurTime 7 11]);
:local hour ([:pick $CurTime 12 14]); :local min ([:pick $CurTime 15 17]);  :local sec ([:pick $CurTime 18 20]);
    :foreach c,a in=$montsarr do={:set c ($c + 1);:if ($a = $mon) do={:set mon $c; };};
    :while ([:len $mon] < 2) do={:set mon ("0" . $mon);};
    :while ([:len $day] < 2) do={:set day ("0" . $day);};
    :while ([:len $hour] < 2) do={:set hour ("0" . $hour);};
    :while ([:len $min] < 2) do={:set min ("0" . $min);};
    :while ([:len $sec] < 2) do={:set sec ("0" . $sec);};
    :return ($year . "-" . $mon . "-" . $day . " " . $hour . ":" . $min . ":" . $sec);
};

:global getSQLDate do={
:local CurTime ([/system clock get date]);
    :local montsarr ([:toarray "jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec"]);
    :local mon ([:pick $CurTime 0 3]); :local day ([:pick $CurTime 4 6]); :local year ([:pick $CurTime 7 11]);
    :foreach c,a in=$montsarr do={:set c ($c + 1);:if ($a = $mon) do={:set mon $c; };};
    :while ([:len $mon] < 2) do={:set mon ("0" . $mon);};
    :while ([:len $day] < 2) do={:set day ("0" . $day);};
    :return ($year . "-" . $mon . "-" . $day );
};

:global getSQLTime do={
:local CurTime ([/system clock get time]);
    :local hour ([:pick $CurTime 0 2]); :local min ([:pick $CurTime 3 5]);  :local sec ([:pick $CurTime 6 8]);
    :while ([:len $hour] < 2) do={:set hour ("0" . $hour);};
    :while ([:len $min] < 2) do={:set min ("0" . $min);};
    :while ([:len $sec] < 2) do={:set sec ("0" . $sec);};
    :return ($hour . ":" . $min . ":" . $sec);
};

:global UNIXTime do={
:local timef [$1];
    :global getSQLDateTime;
    :if ( [:typeof $timef]="nil" ) do={
        :set timef [$getSQLDateTime];
    };
    :local year 1970; :local mon 1; :local day 1; :local hour 0; :local min 0; :local sec 0;
    :local ZeroTime ( (($year * 360 + $mon * 30 + $day ) * 24 * 3600 ) + $hour * 3600 + $min * 60 + $sec );
    :local year [:tonum [:pick $timef 0 4]]; :local mon [:tonum [:pick $timef 5 7]];
:local day [:tonum [:pick $timef 8 10]]; :local hour [:tonum [:pick $timef 11 13]];
:local min [:tonum [:pick $timef 14 16]]; :local sec [:tonum [:pick $timef 17 19]];
    :local NowTime ( (($year * 360 + $mon * 30 + $day ) * 24 * 3600 ) + $hour * 3600 + $min * 60 + $sec );
    :local Ut ($NowTime - $ZeroTime);
    :return ($Ut);
};

:global DeleteFromArray do={     
:local ArrayM [$1];
:if ( [:typeof $ArrayM]="nil" ) do={
  :return false;
};
:local del [$2];
:if ( [:typeof $del]="nil" ) do={
  :set del 0;
};
:local ReturnArray "";
:foreach i,k in=$ArrayM do={
  :if ($i!=$del) do={
   :set ReturnArray ($ReturnArray ."," . $k);
  };
};
    :set ReturnArray [:toarray $ReturnArray];
:return $ReturnArray;
};

LCplxAutoBlockMac

################################### SETTING ################################################
# topic log
:local needenter "hotspot";
# server name
:local needserver "wifi-server";
# failed password
:local fPass 10;
#enables module UnBind
:local UBlocked true;
#period for blocked in second
:local TimeBlocked ( 24 * 3600 );
##############################################################################################



:global LCplxMacBrut;
:global LCplxMacBrutTime;
:global LCplxMacBlocked;
:global getSQLDate;
:global getSQLDateTime;
:global UNIXTime;
:local nowdate [$getSQLDate];
:if ([/system scheduler find name="LCplxAutoBlockMac"] = "") do={
    /system scheduler add name="LCplxAutoBlockMac" start-date="Jan/01/1970" start-time="00:00:00" interval="3m" on-event="/system script run \"LCplxAutoBlockMac\";";
};
:if ( [:typeof $LCplxMacBrut]!="array" ) do={
:set LCplxMacBrut [:toarray ("")];
};
:if ( [:typeof $LCplxMacBlocked]!="array" ) do={
:if ([:typeof $LCplxMacBlocked]="nothing") do={
  :set LCplxMacBlocked [:toarray ("")];
  :local tmpBlock [/system script get LCplxAutoBlockMac comment];
  :if ( $tmpBlock!="" ) do={
   :set tmpBlock [:toarray $tmpBlock];
   :foreach a,b in=$tmpBlock do={
    :local bpos [:find $b "="];
    :local c ([:pick $b 0 $bpos]);
    :local d ([:pick $b ($bpos+1) [:len $b]]);
    :set ($LCplxMacBlocked->"$c") $d;
   };  
  } else={
   :set LCplxMacBlocked [:toarray ("")];
  };
};
};
:local fs true;
:do {
:local fs [/ip hotspot get $needserver name];
} on-error={
  :set $fs false;
};
:if ($fs!=false) do={
:local msgLog  [/log find message~"login failed: invalid username or password"];
:foreach i in=$msgLog do={
  :local mmsg [/log get $i message ];
  :local t [/log get $i time];
  :local DateTime ($nowdate . " " . $t);
  :local Utime [$UNIXTime [$DateTime]];
  :if ($LCplxMacBrutTime < $Utime ) do={
   :set LCplxMacBrutTime $Utime;
   :local topic ([:toarray [/log get $i topics]]);
   :foreach topi in=$topic do={
    :if ( $topi = $needenter) do={
     :local ip;
     :local tryIP false;
     :local Ipl;
     :for i from=0 to=[:len $mmsg] step=1 do={
      :if ($tryIP=false) do={
       :if ([:pick $mmsg $i]="(") do={
        :set tryIP true;
        :set Ipl ($i);
       };
      } else={
       :if ([:pick $mmsg $i]=")") do={
        :set tryIP false;
       };
      };
      :if ($tryIP) do={
       :if ($Ipl<$i) do={
        :set ip ($ip . [[:pick $mmsg $i]]);
       };
      };
     };
     :local Mac ([/ip hotspot host get [/ip hotspot host find address="$ip"] mac-address]);
     :local id ([/ip hotspot ip-binding find mac-address="$Mac"]);
     :local HotServer ([/ip hotspot host get [/ip hotspot host find address="$ip"] server]);
     :local typeRec;
     :do {
      :local typeRec [/ip hotspot ip-binding get number="$id" type];
     } on-error={
      :local typeRec "";
     };
     :local disRec;
     :do {
      :local disRec [/ip hotspot ip-binding get number="$id" disabled];
     } on-error={
      :local disRec "";
     };
     :if ($typeRec!="bypassed" || $typeRec!="blocked") do={
      :local iok [($LCplxMacBrut->"$Mac")];
      if ( [typeof $iok] ="nil" ) do={
       :set ($LCplxMacBrut->"$Mac") 1;
      } else={
       :local MBC ($LCplxMacBrut->"$Mac");
       :set $MBC ( $MBC + 1 );
       :set ($LCplxMacBrut->"$Mac") $MBC;
       :if ($MBC>$fPass) do={
        :if ($needserver=$HotServer) do={
         :if ($id!="") do={
          :if ($typeRec!="blocked" || $disRec=true) do={
           :local comm;
           :do {:set comm ([/ip hotspot ip-binding get number="$id" comment]);} on-error={:set comm "";};
           :local comm ($comm . " Auto Blocked " . $DateTime);
           /ip hotspot ip-binding set mac-address="$Mac" type=blocked comment="$comm" numbers="$id" disabled=no;
          };
         } else={
          :local comm ("Auto Bind Brutforce " . $DateTime);
          /ip hotspot ip-binding add mac-address="$Mac" comment="$comm" server="$HotServer" type=blocked disabled=no;
         };
         :local tmpArray [:toarray ("")];
         :foreach a,b in=$LCplxMacBrut do={
          :if ($a!=$Mac) do={
           :set ($tmpArray->"$a") $b;
          };
         };
         :set LCplxMacBrut $tmpArray;
         :if ( $UBlocked ) do={
          :local a ( $LCplxMacBrutTime + $TimeBlocked );
          :set ($LCplxMacBlocked->"$Mac") $a;
          /system script comment LCplxAutoBlockMac comment="$LCplxMacBlocked";
         };
        };
       };
      };
     };
    };
   };
  };
};
:if ( $UBlocked=true ) do={
  :local timef [$UNIXTime];
  :local delArray [:toarray ("")];
  :set LCplxMacBlocked [:toarray $LCplxMacBlocked];
  :foreach a,b in=$LCplxMacBlocked do={
   :local timelabel [:tonum $b];
   :if ( $timef > $timelabel ) do={
    :local Mac $a;
    :local id ([/ip hotspot ip-binding find mac-address="$Mac"]);
    :if ( $id!="" ) do={
     :local typeRec [/ip hotspot ip-binding get number="$id" type];
     :if ( $typeRec="blocked") do={
      /ip hotspot ip-binding remove numbers=$id;
     };
    };
    :set ($delArray->"$Mac") 999;
   };
  };
  :local tmpArray [:toarray ("")];
  :if ( [:len $delArray] > 0 ) do={
   :foreach a,b in=$delArray do={  
    :foreach c,d in=$LCplxMacBlocked do={
     :if ($a!=$c) do={
      :set ($tmpArray->"$c") $d;
     };
    };
   };
   :set LCplxMacBlocked $tmpArray;
   /system script comment LCplxAutoBlockMac comment="$LCplxMacBlocked";
  };
};
} else={
:log error ("ERROR: configure error LCplxAutoBlockMac. See variable \"needserver\".");
};

Установка:

 

1. Создать скрипты LCplxFunctions, LCplxAutoBlockMac и заполнить из содержимым.

2. Отредактировать настройки в LCplxAutoBlockMac.

3. Запустить LCplxFunctions, для глобальных функций.

4. Запустить LCplxAutoBlockMac.


Сообщение отредактировал Dims: 10 Апрель 2017 - 06:32





Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных