Re[2]: Отлов ботнета

Igor Askarov juks at juks.ru
Mon Sep 10 13:10:06 MSD 2007



Если атака вменяемых масштабов (основана на запросе динамических страниц), то всё решается довольно просто.

Вот, например, так. Проверено в деле (отлов ботнета на 100 машин). Прощу прощения за php, так было
нужно, переписать на перл не составит сложности.

$timeLimit - временной предел между двумя запросами к html-документам для получения штрафного очка
$countLimit - предельное количество штрафных очков для одного адреса, приводящее к его блокировке

<?
  $fname = 'access.log';
  # Можно обрабатывать готовый файл, можно читать из stdin редирект от tail -f access.log
  $fh = fopen($fname, 'r');
  #$fh = fopen('php://stdin', 'r');
  $timeLimit = 2;
  $countLimit = 50;

  $status = array();

  while ($string = fgets($fh))
  {
       $ip = substr($string, 0, strpos($string, ' '));

       if($status[$ip]['blocked']) continue;

       $st = strpos($string, '[') + 1;
       $time = strtotime(substr($string, $st, strpos($string, ']', $st + 1) - $st));

       $st = strpos($string, '"') + 1;
       $req = substr($string, $st, strpos($string, '"', $st + 1) - $st);
       $st = strpos($req, " ") + 1;
       $doc = substr($req, $st, strpos($req, " ", $st) - $st);

       $dot = strlen($doc) - strrpos($doc, ".");

       if(!$dot || $dot > 5) {
          if(!is_array($status[$ip])) $status[$ip] = array('count'=>0);

          if($time - $status[$ip]['time'] <= $timeLimit) {
              $status[$ip]['count'] ++;
              if($status[$ip]['count'] >= $countLimit) {
                  # Здесь можно блокировать адрес файрволлом
                  echo "$ip : $doc\n";
                  $status[$ip]['blocked'] = 1;
              }
          }

          $status[$ip]['time'] = $time;
          $status[$ip]['doc'] = $doc;
       }
  }

?>


> Hello Дмитрий,


> 1. Настроить систему так как было прекрасно описано
>    "Настройка FreeBSD для обслуживания 100-200 тысяч соединений." (C) Игорь Сысоев
>    
> 2. Методика редиректов.

>    CLIENT --- [URI] ---> SERVER
>    SERVER --- [URI]+[SECURITY CODE] (HTTP 307 CODE) --> CLIENT
>    CLIENT --- [URI]+[SECURITY CODE] ---> SERVER
>    SERVER --- [URI] (HTTP 307 CODE) ---> CLIENT

>    Пример работы:

> 1. [ЗАПРОС]
>    GET / HTTP/1.1
>    Host: www.xxx.com

> 2. [ОТВЕТ]
>    HTTP/1.1 307
>    Location: http://www.xxx.com/?code=ABCDEFGHIJKLMNOPQ

> 3. [ЗАПРОС]
>    GET /?code=ABCDEFGHIJKLMNOPQ HTTP/1.1
>    Host: www.xxx.com

> 4. [ОТВЕТ]
>    HTTP/1.1 307
>    Location: http://www.xxx.com/

> 5. [ЗАПРОС]
>    GET / HTTP/1.1
>    Host: www.xxx.com

> 6. [ОТВЕТ]
>    HTTP/1.1 200
>    DATA

>    Соответственно, мы должны иметь таблицу соответствия кодов и ип
>    адресов авторизированных клиентов.
>    Если клиенты проходят авторизацию, стоит добавлять их в разрешающий
>    список и не применять к ним защиту на протяжении некоторого
>    времени.

>    Процесс редиректа, шаги 2-3, можно повторять случайно количество
>    раз, но не стоит делать больше 5-6 раз.

>    Реализация этого метода на PHP не поможет, как и других скриптовых
>    языках. Лучше всего создавать модуль к nginx.

> P.S. Последние встреченные мною ботнеты, обходят подобную защиту, и
> легко поддерживают все виды HTTP 3xx редиректов.





-- 
С уважением,
 Igor                          mailto:juks at juks.ru






More information about the nginx-ru mailing list