Сборка [FAQ] AntiDDOS/DOS

Discussion in 'Безопасность и Анонимность' started by StopFreeLife, 25 Oct 2008.

  1. StopFreeLife

    StopFreeLife Elder - Старейшина

    Joined:
    30 Dec 2007
    Messages:
    88
    Likes Received:
    208
    Reputations:
    41
    DoS-атака (от англ. Denial of Service — и DDoS-атака (Distributed Denial of Service — — это разновидности атак злоумышленника на компьютерные системы. Цель этих атак — довести систему до отказа, то есть, создание таких условий, при которых легитимные (правомерные) пользователи системы не могут получить доступ к предоставляемым системой ресурсам, либо этот доступ затруднён.

    DoS-атака может быть как самоцелью (например, сделать недоступным популярный сайт), так и одним из шагов к овладению системой (если во внештатной ситуации ПО выдаёт какую-либо критическую информацию — например, версию, части программного кода и т. д.).

    © Википедия


    Анти DDOS with Firewall


    [::.Intro.::]

    Много писать не буду, все понятно!
    Надоело видеть ошибку 504 при заходе на свой сайт?
    Я помогу Вам избавиться от этого с помощью Firewall.
    Естественно защитить от огромного кол-ва ботов вы не сможете, однако

    [::.Script.::]

    Code:
    <?php
         error_reporting(0);
    
         $array    = array('66.249.64.', '81.19.64.', '89.208.19.', '213.180.206.', '72.30.0.', '87.250.230.', '213.180.216.', '222.0.0.');
    
         $position    = explode('.', $_SERVER['REMOTE_ADDR']);
         $pos    = $position[0].'.'.$position[1].'.'.$position[2].'.';
    
         if(!in_array($pos, $array))
         {
             $dir = 'bots/';
    
             $cook = strrev(sha1('Fuck you' . md5(getenv('HTTP_USER_AGENT'))));
    
             function ban()
             {
                 system("/bin/sudo pfctl -t dl -T add " . escapeshellarg($_SERVER["REMOTE_ADDR"]));
                 die('Firewall has been you!!!<br/>Cookie must be on');
             }
    
             if (empty($_COOKIE['ddos']))
             {
                 $counter = @file($dir . $_SERVER["REMOTE_ADDR"]);
                 if(count($counter) > 5) ban();
                 setcookie('ddos', $cook, time() + 9800);
                 $f = @fopen($dir . $_SERVER["REMOTE_ADDR"], "a");
                 fwrite($f, "Antiddos by xeka.ru\r\n");
                 fclose($f);
                 header('Location: ' . $_SERVER['PHP_SELF']);
                 die();
             }
    
             if ($_COOKIE['ddos'] !== $cook)
             {
                 ban();
                 die();
             }
    
             if ($_COOKIE['ddos'] == $cook)
             {
                 system("/bin/sudo pfctl -t dl -T del " . $_SERVER["REMOTE_ADDR"]);
                 @unlink($dir . $_SERVER["REMOTE_ADDR"]);
             }
         }
    ?> 
    [::.Description.::]

    $array - массив с IP адресами поисковых ботов, которых мы НЕ баним!
    $dir - папка, куда будем записывать файлы с IP адресами плохих отрубей. CHMOD права на папку 0777
    $cook - пишите что хотите, записываем шифр в куки
    function ban() - Создаем функцию бана с помощью команды к файрволу.
    Далее проверки и отделение хороших от отрубей
    (c)Isis

    --------------------------------------------------------------------------------------------------

    Методы защиты от DDoS нападений



    Попасть под воздействие DDoS атаки – кошмарный сценарий для любого системного администратора, специалиста по безопасности или поставщика доступа. Обычно атака начинается мгновенно и без предупреждения и не прекращается со временем – система не отвечает, канал заблокирован, маршрутизаторы перегружены. Эффективный и быстрый ответ на нападение затруднителен и часто зависит от третих лиц, типа ISP провайдеров. В этой статье исследуется методы, которые должны использовать системные администраторы, если они когда-либо оказались в этой, довольно нежелательной, ситуации.
    Обнаружение DDoS нападения
    DDoS нападение распознать просто – замедление работы сети и серверов, заметное как администратору системы, так и обычному пользователю. Первым шагом в нашей защите мы должны идентифицировать тип трафика, который загружает нашу сеть. Большинство нападений DDoS посылает очень определенный тип трафика - ICMP, UDP, TCP, часто с поддельными IP адресами. Нападение обычно характеризует необычно большое количество пакетов некоторого типа. Исключением к этому правилу являются DDoS нападения, направленные против определенных служб, типа HTTP, используя допустимый трафик и запросы.

    Чтобы идентифицировать и изучить пакеты, мы должны анализировать сетевой трафик. Это можно сделать двумя различными методами в зависимости от того, где исследуется трафик. Первый метод может использоваться на машине, которая расположена в атакуемой сети. Tcpdump - популярный сниффер, который хорошо подойдет для наших целей. Анализ трафика в реальном масштабе времени невозможен на перегруженной сети, так что мы будем использовать опцию "-w", чтобы записать данные в файл. Затем, используя инструмент типа tcpdstat или tcptrace, мы проанализируем результаты.Результаты работы tcpdstat, на нашем tcpdump файле:
    Code:
    DumpFile:  test
    FileSize: 0.01MB
    Id: 200212270001
    StartTime: Fri Dec 27 00:01:51 2002
    EndTime:   Fri Dec 27 00:02:15 2002
    TotalTime: 23.52 seconds
    TotalCapSize: 0.01MB  CapLen: 96 bytes
    # of packets: 147 (12.47KB)
    AvgRate: 5.56Kbps  stddev:5.40K   PeakRate: 25.67Kbps  
    
      IP flow (unique src/dst pair) Information  
    # of flows: 9  (avg. 16.33 pkts/flow)
    Top 10 big flow size (bytes/total in %):
      26.6% 16.5% 14.7% 11.6%  9.8%  7.6%  5.4%  5.4%  2.5%
    
      IP address Information  
    # of IPv4 addresses: 7
    Top 10 bandwidth usage (bytes/total in %):
      97.5% 34.1% 31.2% 21.4% 10.7%  2.5%  2.5%
      Packet Size Distribution (including MAC headers)  
    <<<<
      [   32-   63]:         79
      [   64-  127]:         53
      [  128-  255]:          8
      [  256-  511]:          6
      [  512- 1023]:          1
    >>>>
    
      Protocol Breakdown  
    <<<<
          protocol           packets                 bytes           bytes/pkt
    ------------------------------------------------------------------------
    [0] total              147 (100.00%)            12769 (100.00%)     86.86
    [1] ip                 147 (100.00%)            12769 (100.00%)     86.86
    [2]  tcp               107 ( 72.79%)             6724 ( 52.66%)     62.84
    [3]   telnet            66 ( 44.90%)             3988 ( 31.23%)     60.42
    [3]   pop3              41 ( 27.89%)             2736 ( 21.43%)     66.73
    [2]  udp                26 ( 17.69%)             4673 ( 36.60%)    179.73
    [3]   dns               24 ( 16.33%)             4360 ( 34.15%)    181.67
    [3]   other              2 (  1.36%)              313 (  2.45%)    156.50
    [2]  icmp               14 (  9.52%)             1372 ( 10.74%)     98.00
    Как видно, эти простые утилиты могут быстро помочь определить тип преобладающего трафика в сети. Они позволяют сэкономить много времени, анализируя и обрабатывая зафиксированные пакеты.

    Для контроля входящего трафика может использоваться маршрутизатор. С помощью списков ограничения доступа, маршрутизатор может служить основным пакетным фильтром. Скорее всего он также служит шлюзом между вашей сетью и интернетом. Следующий пример от Cisco иллюстрирует очень простой способ использовать списки доступа, чтобы контролировать входящий трафик:

    Code:
    access-list 169 permit icmp any any echo
      access-list 169 permit icmp any any echo-reply
      access-list 169 permit udp any any eq echo
      access-list 169 permit udp any eq echo any
      access-list 169 permit tcp any any established
      access-list 169 permit tcp any any
      access-list 169 permit ip any any
      interface serial 0
      ip access-group 169 in
    Используя команду "show access-list", система покажет количество совпавших пакетов для каждого типа трафика:

    Code:
     Extended IP access list 169
         permit icmp any any echo (2 matches)
         permit icmp any any echo-reply (21374 matches)
         permit udp any any eq echo
         permit udp any eq echo any
         permit tcp any any established (150 matches)
         permit tcp any any (15 matches)
         permit ip any any (45 matches)
    Результаты просты, но эффективны – обратите внимание на высокое число ICMP echo-reply пакетов. Подробная информация может быть собрана о подозреваемых пакетах, добавляя в конец команду "log-input" к специфическому правилу. Это правило будет регистрировать информацию о любом ICMP трафике:

    access-list 169 permit icmp any any echo-reply log-input

    Маршрутизатор теперь более подробно регистрирует собранные данные (которые можно посмотреть используя "show log") о соответствующих пакетах. В пример ниже, файл регистрации показывает несколько пакетов, соответствующих правилу DENY ICMP:

    Code:
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.142 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.113 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.212.72 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 172.16.132.154 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.15 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.142 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 172.16.132.47 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.212.35 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.113 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 172.16.132.59 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.82 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.212.56 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 172.16.132.84 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.212.47 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.35 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.212.15 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    %SEC-6-IPACCESSLOGDP: list 169 denied icmp 172.16.132.33 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet
    Обратите внимание на информацию, содержавшуюся в каждой строке: источник и адрес назначения, интерфейс и правило, которому оно соответствует. Этот тип детальной информации поможет определить нашу защиту.
    Реакция
    После того, как мы идентифицировали подозреваемый трафик, пришло время исследовать, как нам ответить на нападение. К сожалению, варианты несколько ограничены, потому что большинство DDoS нападений использует поддельные исходные IP адреса, которые вероятно сгенерированы случайным образом. Так что же нам делать?
    Отслеживаем источник атаки
    Первое, что приходит в голову, это попытаться "проследить" источник атаки. Однако DDoS, в отличие от традиционного DoS, исходит из множественных источников. Поэтому неплохо было бы определить транзитный маршрутизатор, через который проходят большинство пакетов. К сожалению, для этого потребуется сотрудничать с несколькими источниками, так как вы не способны исследовать пакеты на вышестоящих маршрутизаторах. Каждый участник процесса (главным образом ISP провайдеры) будут использовать очень похожие методы. Идентифицировав злонамеренный тип трафика, используя вышеописанные методы, будет создан новый список ограничения доступа. Добавив его к правилам, которые применены к интерфейсу, который посылает трафик атакуемому адресату, мы снова используем команду "log-input". Регистрация подробно запишет информацию об исходном интерфейсе и MAC адресе источника атаки. Эти данные могут использоваться, чтобы определить IP адрес маршрутизатора, отправляющего злонамеренный трафик. Процесс будет повторен на следующем маршрутизаторе в цепочке. После нескольких итераций, источник (или один из них) будет обнаружен. Тогда можно создать соответствующий фильтр, который заблокирует атакующего. Недостаток в этом методе защиты от DDoS нападения – время и сложность. Получение таких данных требует работы с несколькими сторонами, и иногда использование правового принуждения.
    Ограничение допустимого предела (“rate limit”)
    Лучший способ немедленной помощи, доступный большинству ISP провайдеров, должно быть “ограничение допустимого предела” злонамеренного типа трафика. Ограничение допустимого предела ограничивает пропускную способность, которую определенный тип трафика может потреблять в данный момент времени. Это может быть достигнуто, удаляя полученные пакеты, когда превышен некоторый порог. Полезно, когда определенный пакет используется в нападении. Cisco предлагает способ, который позволяет ограничить ICMP пакеты, используемые в нападении:
    Code:
    interface xy
      rate-limit output access-group 2020 3000000 512000 786000 conform-action
    transmit exceed-action drop
    access-list 2020 permit icmp any any echo-reply
    Этот пример поднимает интересную проблему, которая была отмечена ранее. Что, если злонамеренный трафик полностью законный? Например, ограничение SYN flood, направленное на Web сервер, отклонит и хороший и плохой трафик, так как все законные подключения требуют начального установления связи. Это трудная проблема, не имеющая простого ответа. Нельзя просто защитится от таких типов хитрых DDoS нападений, не принося в жертву часть законного трафика.
    Фильтрация черной дыры
    ISP провайдеры могут использовать другие способы защиты, которые зависят от изменения маршрутизации, типа фильтрации “черных дыр”. “Black hole” фильтрация отправляет злонамеренный трафик к воображаемому интерфейсу, известному как Null0 – подобный /dev/null на Unix машинах. Так как Null0 - не существующий интерфейс, трафик, направленный к Null0, по существу удаляется. Кроме того, эта методика минимизирует воздействие производительности, так как остальная часть сети остается устойчивой при тяжелых загрузках.

    Важно отметить, что адресная фильтрация - не лучший способ защиты против DDoS нападений. Даже если вы заблокировали нападение на своем маршрутизаторе или межсетевой защите – все еще большие порции входящего трафика могут затруднить прохождение законного трафика. Чтобы действительно облегчить эффект от DDoS нападения, трафик должен быть блокирован в вышестоящей цепочке – вероятно на устройстве, управляемом большим провайдером. Это означает, что многие из программ, которые утверждают, что предотвращают DDoS нападения, в конечном счете, бесполезны для маленьких сетей и их конечных пользователей. Кроме того, это означает, что предотвращение DDoS нападения, в некоторый момент, не зависит от нас.Это печальная правда, понятная любому, кто когда-либо имел дело с проблемой.
    Предотвращение
    Если вы удачно защитились от DDoS нападения, удостоверьтесь, что вы используете следующие предосторожности, которые будут препятствовать вашей собственной сети участвовать в DDoS нападениях.

    Нужно включить команду "ip verify unicast reverse-path" (или не Cisco эквивалент) на входном интерфейсе подключения восходящего потока данных. Эта особенность удаляет поддельные пакеты, главную трудность в защите от DDoS нападений, прежде, чем они будут отправлены. Дополнительно, удостоверьтесь, что блокирован входящий трафик с исходными адресами из зарезервированных диапазонов (то есть, 192.168.0.0). Этот фильтр удалит пакеты, источники которых очевидно неправильны.

    Входящие и исходящие методы фильтрации, также критичны для предотвращения DDoS нападений. Эти простые списки ограничения доступа, если внедрены всеми ISP провайдерами и большими сетями, могли бы устранить пересылку поддельных пакетов в общедоступный интернет, сокращая тем самым время, требуемое для розыска атакующего. Фильтры, помещенные в граничные маршрутизаторы, гарантируют, что входящий трафик не имеет исходного адреса, происходящего из частной сети и что еще более важно, что трафик на пересекающихся курсах действительно имеет адрес, происходящий из внутренней сети. RFC2267 - большой основа для таких методов фильтрации.

    Наконец важно составить точный план мероприятий ПРЕЖДЕ чем, произошло нападение.

    (c)seclab
     
    #1 StopFreeLife, 25 Oct 2008
    Last edited: 25 Oct 2008
    1 person likes this.
  2. StopFreeLife

    StopFreeLife Elder - Старейшина

    Joined:
    30 Dec 2007
    Messages:
    88
    Likes Received:
    208
    Reputations:
    41
    --------------------------------------------------------------------------------------------------

    Организовать простую защиту от DoS-атак для сайтов, использующих PHP + MySQL, можно следующим образом. В MySQL создается таблица (будем называть ее ip_check) с полями lasttime, count, ip (все поля — типа INTEGER, причем ip — первичный ключ).

    Сразу после подключения к базе данных выполняется проверка, есть ли для данного IP-адреса запись в таблице. Если записи нет, она создается, при этом в count пишется 1, в lasttime — текущее время. Если запись уже есть, то проверяется, когда она была сделана (поле lasttime), и если прошло менее определенного количества секунд, то поле count увеличивается на 1, в противном случае приравнивается единице, и производится обновление записи в таблице (записывается новый count и lasttime). Далее происходит проверка величины count, и если она превысила некоторое пороговое значение, выдается статус 500 (или 403 или 503), сообщение об ошибке, и выполнение скрипта завершается.

    Таким образом, для выполнения проверки требуется всего одной таблица с предельно простой структурой и 2 запроса SQL. Также можно добавить еще одно поле status, в которое ставить 1, если IP-адрес забанен навсегда по каким-то причинам, и совместить проверку на DoS-атаки с проверкой на забаненные IP-адреса без добавления дополнительных запросов. При необходимости можно еще одним запросом добавить учет суммарной нагрузки за все время или нагрузки по подсетям.

    Кроме того, перед завершением скрипта можно добавить проверку, сколько времени заняло его выполнение, и если оно превышает какую-то пороговую величину (например, 10 секунд), начислять этому IP-адресу “штрафные очки” (т.е. дополнительно увеличивать поле count).

    В виде кода это можно представить следующим образом:
    Code:
    <?php // $link -- соединение с БД, $ip_text -- IP-адрес define('ALERT_TIME',300); define('ALERT_COUNT',150);    function check_dos($ip_text, $link)  {   $ip=ip2long($ip_text);   $res=mysql_query($link,'SELECT lasttime, count, status FROM ip_check WHERE ip="'.$ip.'"');   if (mysql_num_rows($res)==0) { // нет такого IP   $count=1;   mysql_query($link,'INSERT INTO ip_check (lasttime,count,ip,status) VALUES ('.time().',1,"'.$ip.'",0)');   } else {   $data=mysql_fetch_row($res);   $status=$data[2];   if ($status!=2 && ($data[0]<time()-ALERT_TIME || $data[1]<ALERT_COUNT)))   $count=1;   elseif ($status!=2) { $count=$data[1]+1; if ($count>=ALERT_COUNT) $status=1; }   if ($status!=2) {     mysql_query($link,'UPDATE ip_check SET count='.$count,', status='.$status.', lasttime='.time().' WHERE ip="'.$ip.'"';   }   if ($status) {     header($_SERVER['HTTP_PROTOCOL'].' 503 Temporary Unavailable');     trigger_error('Превышено число допустимых запросов!',E_USER_ERROR);   } } ?>
    Кроме того, периодически следует очищать базу от старых записей (например, по cron). Кроме того, если ожидается большая интенсивность атак, возможно, имеет смысл заменить UPDATE-запрос на последовательность DELETE/INSERT, но в этом случае необходимо будет регулярно проводить оптимизацию таблицы.

    --------------------------------------------------------------------------------------------------

    [FAQ] AntiDDOS/DOS

    Онтеддос скрипт:
    Code:
    #!/bin/bash
    
    /sbin/modprobe ip_tables
    /sbin/modprobe ip_conntrack
    /sbin/modprobe ip_conntrack_ftp
    
    rm /root/.dyn*
    
    echo "Setting kernel tcp parameters to reduct DoS effects"
    
    #Reduce DoS'ing ability by reducing timeouts
    echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
    echo 18 > /proc/sys/net/ipv4/tcp_keepalive_time
    echo 1 > /proc/sys/net/ipv4/tcp_window_scaling
    echo 0 > /proc/sys/net/ipv4/tcp_sack
    echo 128 > /proc/sys/net/ipv4/tcp_max_syn_backlog
    
    #ANTISPOOFING
    for a in /proc/sys/net/ipv4/conf/*/rp_filter;
    do
    echo 1 > $a
    done
    
    ##
    #NO SOURCE ROUTE
    for z in /proc/sys/net/ipv4/conf/*/accept_source_route;
    do
    echo 0 > $z
    done
    #SYN COOKIES
    echo 1 > /proc/sys/net/ipv4/tcp_syncookies
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    #echo $ICMP_ECHOREPLY_RATE > /proc/sys/net/ipv4/icmp_echoreply_rate
    echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
    echo "1" > /proc/sys/net/ipv4/conf/all/accept_redirects
    echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
    
    # NUMBER OF CONNECTIONS TO TRACK
    echo "65535" > /proc/sys/net/ipv4/ip_conntrack_max
    
    # Set default policies
    /sbin/iptables -P INPUT ACCEPT
    /sbin/iptables -P OUTPUT ACCEPT
    /sbin/iptables -P FORWARD DROP
    
    /sbin/iptables -F
    /sbin/iptables -F INPUT
    /sbin/iptables -F OUTPUT
    /sbin/iptables -F FORWARD
    /sbin/iptables -F -t mangle
    /sbin/iptables -X
    
    /sbin/iptables -A INPUT -i lo -j ACCEPT
    /sbin/iptables -A INPUT -d 127.0.0.0/8 -j REJECT
    
    /sbin/iptables -A INPUT -i eth0 -j ACCEPT
    
    /sbin/iptables -A INPUT -m state --state INVALID -j DROP
    
    ### chains to DROP too many SYN-s ######
    /sbin/iptables -N syn-flood
    /sbin/iptables -A syn-flood -m limit --limit 1/second --limit-burst 2 -j RETURN
    /sbin/iptables -A syn-flood -j LOG --log-prefix "SYN flood: "
    /sbin/iptables -A syn-flood -j DROP
    --------------------------------------------------------------------------------------------------


    Простенький скрипт от nod'a, для защиты от ddos'a (только http flood)

    Code:
    $ip = $REMOTE_ADDR;
    if (!in_array($ip,array('66.249.64.', '81.19.64.', '89.208.19.', '213.180.206.', '72.30.0.', '87.250.230.', '213.180.216.', '222.0.0.')))  //Ипы поисковиков, которым открыт доступ к сайту.
    {
    if (!isset($_COOKIE["Тут пиши имя кукиса"]) || ($_COOKIE["Тут пиши имя кукиса"]!="А тут содержание кукиса"))
    {
    $location="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    $e = substr($location,0,strlen($r)-1);
    if ($location==$e."s")
         {
           die("Сработала анти ДДос защита. Обратитесь к администрации. ICQ 570855 (core32.org[/url])");
         }
    setcookie("Тут пиши имя кукиса","А тут содержание кукиса", time()+8640000);
    Header("Location: ".$location."?ddos=ddos");
    exit;
    }
    }
    --------------------------------------------------------------------------------------------------

    Code:
    <?php   
    /*   
    ////////////////////////////////////////////////////////////   
    Antiddos php module \=   
    РАБОТАЕТ НА IPTABLES!!!   
    Вставлять в начало скрипта через include   
    Для работы антиддоса надо иметь право доступа к исполенению функции system и команды iptables(в данном случае) если же такого нет то, то *** знает чето сделал йа.   
    лучше ставить антиддос на впс или выделенный сервер.   
    От средненькогл ддосика поможет.   
    \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\   
    */   
    $debug = false; // дебуг мод, отключает бан, показывает просто сообщения, забанило али нет.   
    if($debug){   
    error_reporting(E_ALL);   
    }else{   
    error_reporting(0);   
    }   
    
    /* Возможные значения $ddos 1-5:   
       | 1. Простая проверка по кукам, по умолчанию(рекомендую)   
       | 2. Двойная проверка через гет antiddos и meta refresh   
       | 3. Запрос на авторизацию WWW-Authenticate   
       | 4. полное отключение сайта, боты не блокируются!!!   
       | 5. выключать сайт если нагрузка слишком большая на сервере, боты не блокируются!!!   
       */   
    
    $ddos = 1;   
    $log = false;   
    $dir =  dirname(__FILE__).'/cyki_bots/'; //дира с логами ддоса, создавать и ставить права 777   
    $ddos_redirect_host = 'http://google.com/'; // хост на который редиректить ддос.   
    $icq = '123456'; //ася админа   
    $off_message = 'Извините, тех неполадки.'; //сообщение при выключенном сайте   
    $anticyka = md5(sha1('botik' . strrev(getenv('HTTP_USER_AGENT'))));   
    $ban_message = 'Вы были заблокированы. Если это ошибка обратитесь к администратору, icq of admin:'.$icq.'<hr>(c)****** antiddos module';// сообщение при бане   
    $exec_ban = "iptables -A INPUT -s ".$_SERVER["REMOTE_ADDR"]." -j DROP"; // для iptables, если у вас другая система измените, не лезьте если не знаете, лучше проконсультироваться!!!   
    $load = sys_getloadavg(); // функция для получения лоад авереге \=\   
    $ddosuser = 'lol_ddos';   
    $ddospass = substr(ip2long($_SERVER['REMOTE_ADDR']), 0, 4);   
    //не тестил //смотрит не поисковики ли это:   
    
         $google        = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "googlebot.com")        !== false;   
         $yandex        = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "yandex.ru")            !== false;   
         $rambler    = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "ramtel.ru")    !== false;   
         $rambler2    = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "rambler.ru")    !== false;   
         $aport        = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "aport.ru")            !== false;   
         $sape        = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "sape.ru")            !== false;   
         $msn        = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "msn.com")            !== false;   
         $yahoo        = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "yahoo.net")            !== false;   
    //
    $f1 = fopen($dir . 'banned_ips', "a");   
    fclose($f1);   
    if(strstr (file_get_contents($dir . 'banned_ips'), $_SERVER['REMOTE_ADDR'])){   
    die($ban_message);   
    }   
    
         if(!$google || !$yandex || !$rambler || !$rambler2 || !$aport || !$sape || !$msn || !$yahoo)   
         {   
    
    $f = fopen($dir . $_SERVER["REMOTE_ADDR"], "a");   
    fwrite($f, "zapros cyka\n");   
    
    
    
    fclose($f);   
             function ban()   
             {   
                 if(!system($exec_ban)){   
                 $f = fopen($dir . 'banned_ips', "a");   
                 fwrite($f, $_SERVER['REMOTE_ADDR'].'|');   
                 fclose($f);   
                 }   
                 echo $ban_message;   
                 header('Location: '.$ddos_redirect_host.'');   
                 die();   
             }   
    switch($ddos){   
       ///////////////////////////   
        case 1:   
    if (empty($_COOKIE['ddos']) or !$_COOKIE['ddos'])   
             {   
                 $counter = @file($dir . $_SERVER["REMOTE_ADDR"]);   
                 setcookie('ddos', $anticyka, time() + 3600*24*7*356); // на год нах.   
                 if(count($counter) > 10)   
                 {   
                 if(!$debug){   
                  ban();   
                 }else{   
                 die ("Блокированы.");   
                 }   
                 }   
                 if(!$_COOKIE['ddos_log']=='bil'){   
                 if(!$_GET['antiddos'] == 1){   
                 setcookie('ddos_log', 'bil', time()+3600*24*7*356); //типо запрос уже был чтоб не перекидывало постоянно рефрешем.   
                 header("Location: ./?antiddos=1");   
                 }   
                 }   
             }elseif ($_COOKIE['ddos'] !== $anticyka)   
             {   
                 if(!$debug){   
                  ban();   
                 }else{   
                 die ("Блокированы.");   
                 }   
             }   
       break;   
       /////////////////////////   
         case 2:   
       if(empty($_COOKIE['ddos'])){   
         if(empty($_GET['antiddos'])){   
         if(!$_COOKIE['ddos_log']=='bil'){ //проверям есть ли запись в куках что был запрос   
         die('<meta http-equiv="refresh" content="0;URL=?antiddos='.$anticyka.'" />');   
         }   
         }elseif($_GET['antiddos'] == $anticyka){   
         setcookie('ddos', $anticyka, time()+3600*24*7*356);   
         setcookie('ddos_log', 'bil', time()+3600*24*7*356); //типо запрос уже был чтоб не перекидывало постоянно рефрешем.   
         }else{   
            
         if(!$debug){   
                 ban();   
                 die("May be shall not transform address line?");   
                 }else{   
                 echo "May be shall not transform address line?";   
                 die ("Блокированы.");   
                 }   
         }   
         }   
         break;   
         case 3:   
       if(!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER']!== $ddosuser || $_SERVER['PHP_AUTH_PW'] !== $ddospass){   
         header('WWW-Authenticate: Basic realm="Vvedite parol\':  '.$ddospass.' | Login: '.$ddosuser.'"');   
         header('HTTP/1.0 401 Unauthorized');   
         if(!$debug){   
                 ban();   
                 }else{   
                 die ("Блокированы.");   
                 }   
         die("<h1>401 Unauthorized</h1>");   
       }   
       break;   
       case 4:   
       die($off_message); //сайт отключен   
       break;   
       case 5:   
         if ($load[0] > 80) {   
         header('HTTP/1.1 503 Too busy, try again later');   
       die('<center><h1>503 Server too busy.</h1></center><hr><small><i>Server too busy. Please try again later. Apache server on '.$_SERVER['HTTP_HOST'].' at port 80 with <a href="http://forum.**********/">ddos protect</a></i></small>');   
         }   
       break;   
       default:   
       break;   
       //////////////////////////   
    }   
    if ($_COOKIE['ddos'] == $anticyka)   
             {   
               @unlink($dir . $_SERVER["REMOTE_ADDR"]);   
                    
             }   
    }   
    //////////////////////////////   
    //превед всем кто меня знает о_0   
    
    ?>
    Добавлено: теперь поисковые боты определяются другим алгоритмом.
    Текущая версия: 1.1
     
    #2 StopFreeLife, 25 Oct 2008
    Last edited: 25 Oct 2008
    1 person likes this.
  3. ettee

    ettee Administrator
    Staff Member

    Joined:
    12 Oct 2006
    Messages:
    466
    Likes Received:
    1,036
    Reputations:
    1,065
    Защита на интерпретируемом языке? Либо не все понимают весь абсурд ситуации, либо у нас какие-то мазохисты.
     
    _________________________
  4. StopFreeLife

    StopFreeLife Elder - Старейшина

    Joined:
    30 Dec 2007
    Messages:
    88
    Likes Received:
    208
    Reputations:
    41
    я думаю мазохисты =_=
     
    1 person likes this.
  5. StopFreeLife

    StopFreeLife Elder - Старейшина

    Joined:
    30 Dec 2007
    Messages:
    88
    Likes Received:
    208
    Reputations:
    41
    -----------------------------------------------------------------------

    Кто бы сомневался, что ботоводы - люди ленивые, иногда даже очень, очень. Вы думаете, что если у них много ботов, превосходный софт и предостаточно классных модулей к ботам то они будут это все сразу таки использовать, отнюдь - нет. Обычно, все начинается с простых GET запросов, даже не рандомных, на главную страницу и еще на несколько других тяжелых страниц, например - форум, фотогалерея и т.д. И только при неудаче, могут быть задействованы другие методы, рандомизация всего чего только можно, SYN flood, атака POST запросами, ICMP flood . . .

    Предположим, что у нас есть сайт http://www.example.gov, его атакуют, по логам видно, что громадное количество GET запросов идет на:

    http://www.example.gov/
    http://www.example.gov/foto/
    http://www.example.gov/forum/


    В большинстве таких случаев можно обмануть ботов используя js-редирект. Старые и не профессионально написанные боты не содержат в себе js интерпретатора. Поэтому такой метод срабатывает лучше, чем можно было ожидать. Мы добьемся того, что боты не смогут нагружать базу данных, трафика будет в разы меньше.

    Создаем index.html в корне сайта и в корне foto, forum каталогов.
    прописываем туда наш простой js-редирект
    [​IMG]


    И так с каждым разделом который атакуют GET запросом прямо в корень.Размер файла получится всего 90 байт, что гораздо лучше чем когда бот соприкасается к ~20кб странице и подтягивает ~10 SQL запросов. Легитимные пользователи у которых не отключен javascript в браузере будут перенаправлены на index.php. Единственное, что плохо, так это то, что поисковые-боты тоже не оборудованы js-интерпретаторами и точно так же как атакующие боты будут утопать в js редиректе.

    Если рассмотреть конкретно этот случай защиты, то сразу просматривается уязвимость, защиту можно легко обойти если добавить боту функцию парсинга window.location.
    И не нужен никакой js-интерпретатор.
    Что бы избежать таких умных ботов с функцией парсера зашифруйте js-код, благо онлайн сервисов в интернете достаточно.
     
  6. revenantus

    revenantus New Member

    Joined:
    27 Sep 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    сталкнулся недавно с такой проблемой на шаред хостинге, негодующая школота решила по досить.хостинг как-то сразу отрубился.Пришлось резко переезжать на абузоустойчивый.Думаю далее взять с vps и поставить на него филтр простенький.По для сервера не подскажете?
     
  7. adept002

    adept002 New Member

    Joined:
    10 Dec 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Садо-мазо, защита (якобы), написанная на пхп, в лучшем случае спасет от зажатого ф5, ну ни как не от ддоса, сиегом спокойно ложится.