[SCRIPT] Защита от брута аккаунтов, бан ip по firewall

Тема в разделе "Веб скрипты (WEB)", создана пользователем root, 5 окт 2014.

  1. root

    root Administrator Команда форума Administrator Moderator Developers Team

    Регистрация:
    23 авг 2014
    Сообщения:
    254
    Симпатии:
    58
    Баллы:
    11
    Все это писалось под wipfw, он отлично дружит с брандмауэром windows 2003 64 битных ОС.
    Все уже настроено, вам нужно только выполнить все по инструкции.


    1. Распаковываем архив, скрипт нужно установить в корень диска С. то есть в C:\brut\
    2. Запускаем файл install.cmd, если вы это делаете по удаленке, через RDP, то связь скорее всего оборвется на несколько секунд, потом восстановится.
    В файле wipfw.conf закомментированы настройки, которые помогут ограничить число коннектов с 1 ип, немного криво работает, редактируйте кому надо под себя, перед установкой wipfw, если отредактировали, то такие же настройки пропишите и в файл flush.conf
    3. Запускаем config.cmd


    4. Если ваш PHP установлен по умолчанию в C:\Program Files (x86)\PHP то ничего трогать не нужно, если нет, тогда редактируем файл run_brut_script.bat и меняем там путь до PHP
    5. Открываем файл brut.php и редактируем путь до ваших логов авторизации
    6. Настраиваем запуск скрипта run_brut_script.bat по расписанию, инструкция как часто запускать этот скрипт, описана в начале файла brut.php, например ставите запуск раз в 2 минуты или раз в минуту
    7. Настраиваете запуск скрипта reload.cmd по расписанию, это очистка забаненных ip, то есть запускать с периодичностью такой, через сколько времени вы хотите снимать баны. Например раз в 3 часа, раз в 12 часов и т.д.


    Все.
    Увидеть список забаненных адресов можно открыв командную строку и набрать команду wipfw show
    Код:
    <?php 
    /*  
        (c) Gogi79  
        Защита от брута (подбор паролей), как это работает: 
        Наличие брута можно определить по частым записям в логе авторизации, которые идут с одних и тех же ip-адресов. 
        Пример: 22.04.2010 23:59:38: mazahacko - password (188.186.68.130) 
        Важно! Скрипт необходимо запускать с таким интервалом, чтобы именно за этот промежуток времени делался подсчет 
        попыток авторизации с одного ip-адреса. 
        Пример запуска и конфигурации: 
        Если нужно считать брутом те ip, которые делают более 10 попыток авторизации за 1 минуту, нужно запускать 
        скрипт каждую минуту, а в переменную $max_password установить значение 10. 
        Если 5 попыток за 2 минуты, соответственно скрипт запускать раз в 2 минуты, а $max_password установить 5. 
    */ 
    
    
    $cur_dir = dirname(__FILE__); 
    $dir_auth_logs = "C:\\Server\\hAuthD\\log\\auth"; // Путь к директории с логами авиторизации 
    $ipfw_path = "C:\\WINDOWS\\system32\\ipfw.exe"; // IPFW по умолчанию путь установки. 
    $max_password = 7; // кол-во неудачных попыток входа на любой аккаунт с ip-адреса чтобы ip попал в бан. 
    
    
    function dir_list($dir) { 
        $list = array(); // Массив сортировка по дате модификации файлов 
        if ($handle = opendir($dir)) { 
            while (false !== ($file = readdir($handle))) { 
                if ($file != "." && $file != "..") { 
                    $list[$file] = filemtime($dir."\\".$file); 
                } 
            } 
            closedir($handle); 
        } else { 
            return false; 
        } 
        if (count($list)>0) { 
            arsort($list); 
            return $list; 
        } 
        return false; 
    } 
    
    
    function get_ip($s) { 
        if (preg_match("~\((([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}))\)~",$s,$match)) { 
            $ip = $match[1]; 
            return $ip; 
        } 
        return false; 
    } 
    
    
    $files = dir_list($dir_auth_logs); 
    if ($files === false) { 
        die(); // Если нет файлов, завершаем работу 
    } 
    $lastfile = array_shift(array_keys($files)); 
    if (!$lastfile) { 
        die(); // Если нет файлов, завершаем работу 
    } 
    
    
    // Проверяем кэш файл, если он есть 
    $last_filename = ""; 
    if (file_exists($cur_dir."\\lastpos.txt")) { 
        $f = file($cur_dir."\\lastpos.txt"); 
        list($last_filename,$last_pos) = explode(",",trim($f[0])); 
    } 
    
    
    $fp = fopen($dir_auth_logs."\\".$lastfile,"r"); 
    if ($lastfile == $last_filename) { 
        rewind($fp); 
        fseek($fp,$last_pos); 
    } 
    
    
    $statip = array(); 
    
    
    while (!feof($fp)) { 
        $line = fgets($fp); 
        // Если это удачные попытки авторизации, пропускаем... 
        if (strpos($line," password ") === false) continue; 
        $ip = get_ip($line); 
        if ($ip !== false) { 
            $statip[] = $ip; 
        } 
    } 
    
    
    $tell = ftell($fp); 
    fclose($fp); 
    
    
    // Записываем текущую позицию в кэш 
    $fp2 = fopen($cur_dir."\\lastpos.txt","w"); 
    fputs($fp2,$lastfile.",".$tell."\n"); 
    fclose($fp2); 
    
    
    if (count($statip)<1) { 
        die(); 
    } 
    
    
    // Подсчет ip-адресов 
    $countip = array_count_values($statip); 
    arsort($countip); 
    $ban_ip = array(); 
    foreach ($countip as $client_ip => $count_auth) { 
        if ($count_auth < $max_password) continue; 
        // Список ip-адресов которые мы банить не будет, добавлять по аналогии, по 1 строке на каждый адрес. пример: if ($client_ip == "78.25.59.141") continue; 
        if ($client_ip == "78.25.59.141") continue; 
        $ban_ip[] = $client_ip; 
    } 
    
    
    if (count($ban_ip)<1) { 
        die(); // Нет брута, завершаем работу. 
    } 
    
    
    // Проверяем кэш забаненных ip-адресов, если он есть 
    $cur_cache_banned_ip = "ban_ip.txt"; 
    $cache_banned_ip = array(); 
    if (file_exists($cur_dir."\\".$cur_cache_banned_ip)) { 
        $f = file($cur_dir."\\".$cur_cache_banned_ip); 
        for ($i=0;$i<count($f);$i++) { 
            $lpos = trim($f[$i]); 
            if ($lpos == "") continue; 
            $cache_banned_ip[$lpos] = 1; 
        } 
    } 
    
    
    // Определяем какие новые ip будем банить. 
    $fp3 = fopen($cur_dir."\\".$cur_cache_banned_ip,"a"); 
    $fp4 = fopen($cur_dir."\\ban_ip.bat","w"); 
    fputs($fp4,"@echo off\r\n"); 
    for ($i=0;$i<count($ban_ip);$i++) { 
        if (isset($cache_banned_ip[$ban_ip[$i]])) continue; 
        // Бан, баним только доступ к авторизации 
        fputs($fp4,$ipfw_path." add deny tcp from ".$ban_ip[$i]." to me 2106\r\n"); 
        // Запись ip в кэш 
        fputs($fp3,$ban_ip[$i]."\n"); 
    } 
    fclose($fp4); 
    fclose($fp3); 
    
    
    ?>