Антивирус на php.

Discussion in 'PHP' started by r0, 13 Apr 2007.

  1. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    578
    Likes Received:
    274
    Reputations:
    91
    Идея на нова. Проще сделать следить за контрольной суммой ф-лов и директорий. Написать скрипт, который из крона каждые 5 минут будет это проверят. В случае изменения контрольной суммы файла\директории создавать страничку "ворненг! одей сплойтенг детектед!" и закрывать доступ к сайту :)
    А твой способ не сработает при банальном протраянивании файла.
     
    #21 fucker"ok, 13 Apr 2007
    Last edited: 13 Apr 2007
  2. r0

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

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    Talisman

    Если бы все думали как Вы, сейчас php был бы правительственной тайной
    Я думаю, что это не Вы написали =/
    Прям уж0с, я думаю кому надо, тот разберется как доделать =)
     
  3. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    Можно написать скрипт который будет выводить на вашу страницу...коглда и какой файл изменился посл.раз....
    Если допустим это было сделано не с вашего ип, то....эм.....че-нить делаем...
    Уйма способов
     
  4. DRON-ANARCHY

    DRON-ANARCHY Отец порядка

    Joined:
    4 Mar 2005
    Messages:
    716
    Likes Received:
    142
    Reputations:
    50
    Это уже не антивирусы обсуждаются, а... ну... фильтры что ли...
    под антивирусами я бы понимал какие-нить анти-руткиты или типа...
     
  5. Ch3ck

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

    Joined:
    9 Jun 2006
    Messages:
    1,362
    Likes Received:
    1,157
    Reputations:
    430
    А имена шеллов всегда такие будут?
    PHP:
    $safe_files = array("index.php","about.php","add.php""xek.php""antivir.php""comments.php""xekker.php""files.php""admin.php""myshell.php""navigation.php""work.php""bottom.php","config.php","top.php","main.php","papers.php","search.php","lol.php");
     
  6. blaga

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

    Joined:
    23 Mar 2006
    Messages:
    884
    Likes Received:
    273
    Reputations:
    106
    я так понял это имена безопасных файлов а не шеллов.
     
  7. _Great_

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

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    myshell.php тоже безопасный файл?))
     
  8. blaga

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

    Joined:
    23 Mar 2006
    Messages:
    884
    Likes Received:
    273
    Reputations:
    106
    У него в коде написано
    А точнее коммент и имя массива. Вот я и подумал что это разрешаемые файлы. Весь код я не смотрел.
     
  9. KSURi

    KSURi tnega AOLPS

    Joined:
    6 Jun 2006
    Messages:
    458
    Likes Received:
    219
    Reputations:
    357
    Это уже получается Ids с контролем целостности файлов.
     
  10. Digimortal

    Digimortal Banned

    Joined:
    22 Aug 2006
    Messages:
    471
    Likes Received:
    248
    Reputations:
    189
    >> Вот это отличная идея, если кто сможет, реализуйте плиииз!!!

    ок, напишу на Perl.. +)
     
  11. George767

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

    Joined:
    10 Jan 2006
    Messages:
    129
    Likes Received:
    25
    Reputations:
    -1
    Вспоминай) Вообще-то на сервере файлы лежат в изначальном виде (формате), это когда они вызываются по-другому (к примеру через mod_rewrite в .htaccess), их сервер открывает. Так что если это банальный шелл, то он всегда будет на сервере лежать как .php файл.
     
  12. George767

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

    Joined:
    10 Jan 2006
    Messages:
    129
    Likes Received:
    25
    Reputations:
    -1
    Я завтра напишу на Php, но в моей версии кроме отправления сообщения на мыла, сайт будет закрыватся (тут естевственно надо под конкретный проект писать)
     
  13. life_is_shit

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

    Joined:
    21 Aug 2007
    Messages:
    300
    Likes Received:
    149
    Reputations:
    19
    4 Nightmarе.
    Делать было нечего, сделал

    Скрипт пользуеца мускулом, предварительно ему нужны данные для доступа.
    Он делает слепок директории и заносит в базу, делая мд5 и определяя размер файлов и директоии.
    При проверке эти данные сверяются, если что-то не совпадает то в корне контролируемой директоии создается
    .htaccess блокирующий файл для всех (кто хочет может поменять на локалхост) и высылает репорт админу.

    Code:
    <?php
    $server = 'localhost';     //хост
    $username = 'anti_change'; //юзер мускула
    $password = 'password';    //пароль мускула
    $database = 'anti_change'; //база мускула
    $path = 'C:/TopServer/home/localhost/wordpress'; //реальный путь к контролируемой директории
    $mail_to = 'admin@localhost';  //кому писать репорт
    $mail_from = 'axtung@localhost';  //от кого
    $mail_subj = 'axtung!!!';  //тема письма
    
    mysql_connect($server, $username, $password);
    mysql_select_db($database);
    
    function scan_dir($dirname) 
      { 
        GLOBAL $text, $retext; 
        $dir = opendir($dirname); 
        while (($file = readdir($dir)) !== false) 
        { 
          if($file != "." && $file != "..") 
          { 
          if(is_file($dirname."/".$file)) 
            { 
              $sql = "INSERT INTO `first_scan` (`category`, `name`, `md5_file`, `size`) VALUES ('file', '".$dirname."/".$file."', '".md5_file($dirname.'/'.$file)."', '".filesize($dirname.'/'.$file)."')";
              mysql_query($sql);
            } 
            if(is_dir($dirname."/".$file)) 
            { 
              $sql = "INSERT INTO `first_scan` (`category`, `name`, `md5_file`, `size`) VALUES ('directory', '".$dirname."/".$file."', '---', '".disk_total_space($dirname."/".$file)."')";
              mysql_query($sql);
              scan_dir($dirname."/".$file); 
            } 
          } 
        } 
        closedir($dir); 
      }
    
    function check_dir($dirname) 
      { 
        GLOBAL $text, $retext; 
        $dir = opendir($dirname); 
        while (($file = readdir($dir)) !== false) 
        { 
          if($file != "." && $file != "..") 
          { 
          if(is_file($dirname."/".$file)) 
            { 
              $sql = "SELECT * FROM `first_scan` WHERE `name` = '".$dirname."/".$file."' and `category` = 'file'";
              $result_file = mysql_query($sql);
              $array_file = mysql_fetch_array($result_file);
              if ($array_file)
              {
                 if ($array_file['md5_file'] != md5_file($dirname.'/'.$file)) 
                 {
                    $sql_md5 = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('error md5_file', '".$dirname."/".$file." error checksum')";
                    $res=mysql_query($sql_md5);
                 }  
                 if ($array_file['size'] != filesize($dirname.'/'.$file)) 
                 {
                    $sql_size = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('error size file', '".$dirname."/".$file." error size file')";
                    mysql_query($sql_size);
                 }       
              }
              else
              {
                $sql_nf = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('file not found', '".$dirname."/".$file." file not found')";
                mysql_query($sql_nf);
              }
            } 
            if (is_dir($dirname."/".$file)) 
            { 
              $sql = "SELECT * FROM `first_scan` WHERE `name` = '".$dirname."/".$file."' and `category` = 'directory'";
              
              $result_dir = mysql_query($sql);
              $array_dir = mysql_fetch_array($result_dir);
              if ($array_dir)
              {
                 if ($array_dir['size'] != disk_total_space($dirname."/".$file)) 
                 {
                    $sql_size = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('error size directory', '".$dirname." error size directory')";
                    mysql_query($sql_size);
                 }       
              }
              else
              {
                $sql_nf = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('directory not found', '".$dirname."/".$file." directory not found')";
                mysql_query($sql_nf);
              }
              check_dir($dirname."/".$file);
            } 
          } 
        } 
        closedir($dir); 
      }
      
    function check_del()
    {
      $sql = "SELECT * FROM `first_scan`";
      $result = mysql_query($sql);
      while ($array = mysql_fetch_array($result))
      {
        if (!is_dir($array['name']) && ($array['category'] == 'directory'))
        { 
          $sql_del_dir = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('directory deleted', '".$array['name']." directory deleted')";
          mysql_query($sql_del_dir);
        }  
        if (!file_exists($array['name']) && ($array['category'] == 'file'))
        {
          $sql_del_file = "INSERT INTO `axtung!` (`category_error`, `description`) VALUES ('file deleted', '".$array['name']." file deleted')";
          mysql_query($sql_del_file);
        }  
      }
    }
      
    if (isset($action) && ($action == 'first')) 
    { 
      mysql_query("DROP TABLE `axtung!`");
      mysql_query("CREATE TABLE `axtung!` (
      `id` int(11) NOT NULL auto_increment,
      `category_error` text,
      `description` text NOT NULL,
      PRIMARY KEY  (`id`)
      ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1");
      mysql_query("DROP TABLE `first_scan`");
      mysql_query("CREATE TABLE `first_scan` (
      `id` int(10) NOT NULL auto_increment,
      `category` text NOT NULL,
      `name` text NOT NULL,
      `md5_file` text NOT NULL,
      `size` text NOT NULL,
      PRIMARY KEY  (`id`)
      ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=501;
      ");
      scan_dir($path);
      echo 'слепок сделан';
    }
    
    if (isset($action) && ($action == 'check'))
    {
      check_dir($path);
      check_del();
      $mail = '';
      $report = '';
      $sql_mail = "SELECT * FROM `axtung!`";
      $result = mysql_query($sql_mail);
      while ($array = mysql_fetch_array($result))
      {
        $mail .= $array['description']."\n";
        $report .= $array['description']."<br>";
      }
      if (!empty($mail))
      {
        $fh = fopen ('C:/TopServer/home/localhost/wordpress/.htaccess', "w");
        fwrite($fh, "\n"."deny from all");
        fclose ($fh);
        mail('admin@localhost','axtung!',$mail,"From: axtung@localhost\r\n");
        echo 'Ахтунг!!!<br>'.$report.'Внимание доступ к сайту закрыт!!!';
      }
      else
      {
        echo 'Все норм, спи спокойно';
      }
    }
    if (isset($action) && ($action == 'clear_error'))
    {
      mysql_query('TRUNCATE `axtung!`');
      echo 'лог очищен';
    }
    ?>
    <form action="<?=basename($PHP_SELF)?>?action=first" method="POST">
      <input type="submit" value="создать слепок файловой системы">
    </form>
    <br>
    <form action="<?=basename($PHP_SELF)?>?action=check" method="POST">
      <input type="submit" value="проверить">
    </form>
    <br>
    <form action="<?=basename($PHP_SELF)?>?action=clear_error" method="POST">
      <input type="submit" value="очистить лог из базы">
    </form>
    
    Юзай на здоровье.

    З.Ы. Просьба на корявости не обращать внимания, ибо писал ночью и особенной ценности скрипт для меня не представлял.
    З.Ы.Талисману пасиба за реверсивный поиск, ибо самому было лень)
     
    #33 life_is_shit, 24 Sep 2007
    Last edited: 24 Sep 2007
    2 people like this.
  14. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,194
    Reputations:
    252
    life_is_shit, в твоем скрипте дырок 5 минимум...
    Инклуд и скули уже увидел...
     
  15. The_HuliGun

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

    Joined:
    19 May 2007
    Messages:
    191
    Likes Received:
    84
    Reputations:
    11
    Нету там ни одного вызова инклуд функций.
    life_is_shit, пасиб за скрипт.
     
  16. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    В идеале брать чексум файла и проверять на изменение. Скрипт кодится зендом и все. никаких проблем. Зенд платный? О_о
     
  17. Егорыч+++

    Staff Member

    Joined:
    27 May 2002
    Messages:
    1,373
    Likes Received:
    894
    Reputations:
    20
    Безусловно скрипт не имеет смысла и не от чего не защищает. Защита от инклюда файлов должна быть сделана на основании серии исследований:

    1) Проверка контрольной суммы всех файлов.
    2) Поиск записей в файлах, которые попадают под возможности шела (типа инклюде, eval , system и т. д.) . Файлы в которых нужны эти функции и места в них помечаются (хотя по любому проверка мд5 такие файлы защитит).
    3) Создаем серию ловушек. Типо файлы конфигов и мониторим время их просмотра. В случае измениния времени начинаем думать какая зараза смотрит наши файлы.

    Этого будет достаточно. Могу тоже самое продолжить про мониторинг всег sql инъекций, но это на уровне шаре хостинга реализовать сложнее.
     
  18. life_is_shit

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

    Joined:
    21 Aug 2007
    Messages:
    300
    Likes Received:
    149
    Reputations:
    19
    4 Егорыч+++
    Полностью прав, но для магазина к примеру скрипт вполне подойдет.
    4 Nightmarе & 4 The_HuliGun
    всегда пожалуйста, если нада туда чонить дописать пишите в аську, без проблем.
    4 Isis
    вообще-то скрипт желательно запоролить, или поставить доступ с одного Ip.
    недостаток в том, что пароли к базе в открытом виде, но есть зенд)