Идея. Скажем, у Вас есть свой проект (пусть тот же хеко-саент) который Вы холите и лелеете. Но Вам постоянно докучают злобные хэккеры, ужасающе втыкивающие кавычку в адресную строку и пишущие алерт(/лол/) в Ваших комментах. Да мы не идеальны, допустить одну брешь можно и да наверно, скорее, нужно. Писать без ошибок не получается только у тех, кто не пишет ничего. Ну так вот, допустим писали вы свой проект и допустили такую маленькую ошибочку, а злобный хакер применив свой талант втыкивать в нужное место кавычку и хеккерский прием (инто аутфайл) закатал Вам свой шелл. А теперь надену галстук и скажу немного серьезнее. Вчера мне пришла нетрезвая мысль написать «антивирус» для своего блога. Из всего выше изложенного бреда, можно уяснить, что данный скрипт будет искать гадкие веб шеллы. Приступ к алгоритмизации и последующей реализации. PHP: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"> <head> <title>r0: АнтивирУс f0r pr0j3c7</title> <meta http-equiv="Content-Type" content="text/html; charset=Windows-1251" /> </head> <body> <center> Ant1v1rus <?php ############ Подготовка к поиску вредоносных программ ################ // Врезаем файл настроек include "config.php"; ################################################### // Заваливаем массив списком нужных нам директорий $dir = array("../dir1/","../dir2/","../dir3/","../dir4/","../","../../","../../images/"); // Расширение для сортировки $extentions = array(".php"); // масссив из безопасных 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"); ################################################### // Каждый элемент массива - как отдельную директорию foreach ($dir as $get_dir) { // Открываем хэндл директории $dir_handle = opendir($get_dir); // Получаем данные из директории while ( false !== ($file = readdir($dir_handle)) ) { // Находим файлы с расширением пэхопэ $ext = strtolower(strrchr($file, ".")); // Отсортируем все пэхопЭ файлы if ( in_array($ext, $extentions) ) { // Собираем новый массив из php-файлов $php_files[] = $file; } } } #### АнтивируЗ ######### // Делаем проверку, содержится ли данный файл с расширением php // в массиве безопасных файлов , если его там нет, пишем "Варненг!" foreach ($php_files as $files) { if ( !in_array($files,$safe_files) ) { echo "<font color=’#147018’ > <b>Ахтунг! Подозрительный файл »» ".$files."</b></font><br />"; } } ?> </center> </body> </html> Поясню. Моя логика была такова: имеется массив с названием папок(он же $dir), из которого затем извлекаются имена файлов, у которым делаем обрезание(по расширению) и если этой php-файл заносив его в новый массив, элементы которого проходят проверку на вшивость из уже имеющегося массива заданных файлов. P.S Конечно, если хеккер проникает внутрь то он может залить свой шелл как index-файл в любую диру, но это представляет опасность с точки зрения многих искателей приключений, хочется как бы затаиться, поэтому и придумывают имена отличные от index.php =)) ЗУФСУ !
А что мешает хакеру, залившему шелл, добавить его в список разрешенных? Имхо такую вещь надо реализовывать так: делать скрипт на баше, который раз в Н часов (по крону) проверяет папку на наличие подозрительных файлегов и в случае обнарежения оных отправляет админу письмо. Примерно, вот так: Code: my $dir = '/usr/local/bin/apache/htdocs'; my @files = qw(index.php guestbook.php forum.php); foreach my $toCheck(<$dir/*.php>) { my $valid = 0; foreach my $pattern(@files) { $valid = 1 if $toCheck =~ /$pattern/ } sendMail(...) unless $valid; }
проникнувший на саент хэкка может внедрить злостный код прямо в антивирус и он будет писать чтонибудь матное или работать не так как полагается или просто удалить или он просто ... вот так вот =\
2KSURi: Огасики.. Тогда уж сообщение на сотовый =) Я не кожу на баше =/ Может и да =) Мне нравиться мыслить к0к0й уж0с.. надо уд0лить пока он не написал моей маме, что меня похекали...
Я нечто подобное писал, даже где-то сохранилось. Мой скрипт искал новые файлы, и если файл подпадал под критерий опасности посылала мне на мыло информацию. + проверял размеры всех существующих файлов с теми же размерами хранящимися в базе. Эта проверка раз в сутки запускалась. Отдельно можно было запустить проверку контента новых и измененных файлов на предмет наличия "опасных функций". Вещь на самом деле полезна для тех кто любит устраивать на ФТП своего сайта свалку, так что потом в случае чего хрен поймешь что твое а что чужое.
Как я понял, скрипт проверяет только определенные диры? Что мешает сделать mkdir pohek; echo 'evil c0de here' > pohek/xek.pl ?
это верно, причем проверять на наличие любых изменений в файлах и отслеживать появление новых, т.к. простой парсинг файлов на предмет наличия "опасных" функций легко можно обойти..
уже писали и выкладывали подобные скриптики.. кроме того под *nix ведь тоже бывают антивирусы, которые умеют искать и веб-шеллы..
Подобный скрипт может помочь владельцу сайта, но теперь представьте админа сервера (примерно на 1к сайтов) которого зафлудит мессагами PS: код php вообще не читаем раскраска ужасна (берите пример с vim)
Вспоминаем сниффер!!! к примеру через SQL-inj или PHP-inj заливаем shell.jpg и .htaccess который будет асоциировать картинку с php файлом. ну а далее дело техники.... Квартет (с) Крылов
аффтар жжот) нужна рекурсия по дире: PHP: function scan_dir($dirname) { //echo ';'.$dirname.'<br />'; GLOBAL $text, $retext; $dir = opendir($dirname); while (($file = readdir($dir)) !== false) { if($file != "." && $file != "..") { if(is_file($dirname."/".$file)) { echo '[B]'.$file.'[/B] : '.(filesize($dirname.'/'.$file)/1024/1024).' MB<br />'; } if(is_dir($dirname."/".$file)) { // scan_dir($dirname."/".$file); } } } closedir($dir); } scan_dir('C:\Documents and S............'); код сканера, который я юзал, чтобы названия книжек собрать)) добавить функцию хеширования файла мд5 и проверять чек-сумму, ведь обычно код встраивают в существующие файлы. проверять на всяк дату изменения (если ты параноик) но это просто обойти. скрыть сам скрипт антивируса, например в свою домашнюю диру. или же сверять файлы с копией в надежном месте. + верно отмечено, зырить так же нужно и на спец файлы веб-сервера (.htaccess .htpasswd) Конечно, когда серв под 1 проект, или он под хрутом, то лучше всего вырезать все "ненужные" форуму функции пшп машины. ЗЫ считаю глупостью рассказывать свои применяемые методы, т.к. это ослабит их защиту)