Найти вирусы в php файлах

Vishez

Гуру форума
Регистрация
19 Авг 2013
Сообщения
170
Реакции
83
Кто нибудь знает команды в консоли для поиска вирусов(шеллов и тд) в пхп файлах? Думаю должно быть что-то типа такого

grep -rn --include=*.php ./ -e 'eval'

Только вместо 'eval' должна быть строка с включениями для разных вирусов. Eval впринципе кое-что находит но список слишком большой(сайты на джумле в основном) и файлов нужно просматривать много. По ctime найти не получается, так как менял права на все файлы и папки и теперь там везде практически одинаковое значение ctime

 
Последнее редактирование:
Самый банальный вариант - это поиск, с возможностью искать фразы в файлах. Список функций, которые могут неявно вызывать код можно глянуть тут: Для просмотра ссылки Войди или Зарегистрируйся
 
Лучше всего просканировать ai-bolit
это будет и качетсвенней и покажет уязвимости, которые могут быть не только eval
 
Мне кажется, проще у себя на жестком диске чем-нибудь прогнать.
 
Значительно проще поступаю... Поставьте на сервер антивирусный пакет ClamAv, выполните обновление баз и запустите поиск по нужной директории, а лучше от корня. Лучше это не делать в час наибольшей нагрузки на сервак только.
 
Вирусы могут быть не только через эвал.
Давайте разберем:

Для начала можно узнать какие файлы php были изменены за последние 7 дней (к примеру вы знаете что последнюю неделю ничего не меняли. Кол-во дней можно изменить)

find . -type f -name '*.php' -mtime -7

Следующие команды ищут php файлы содержащие атакующие сценарии.

find . -type f -name '*.php' | xargs grep -l "eval *(" --color
find . -type f -name '*.php' | xargs grep -l "base64_decode *(" --color
find . -type f -name '*.php' | xargs grep -l "gzinflate *(" --color


первый параметр поиска это директория поиска, точка означает текущий каталог (и все вложенные каталоги). Можно изменить этот параметр в любое существующее имя каталога для уменьшения результатов поиска

Если вы удалите опцию -l из grep, он будет показывать текст совпавшего файла. Чтобы пойти дальше я бы воспользовался этой объединенной командой, которая является более общей

find . -type f -name '*.php' | xargs grep -l "eval *(str_rot13 *(base64_decode *(" --color

Совет: расширьте выражение для поиска функций, которые могут быть использованы злонамеренно, такие как mail, fsockopen, pfsockopen, stream_socket_client, exec, system и passthru. Можно скомбинировать все эти значения в одну команду:

find . -type f -name '*.php' | xargs egrep -i "(mail|fsockopen|pfsockopen|stream_socket_client|exec|system|passthru|eval|base64_decode) *\("

---
Наконец, вот не менее известный способ, что бы скрыть код:

preg_replace("/.*/e","\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28'5b19fxq30jD8d/wp5C3tQoMx4CQ

FILE GOES ON FOR A LONG TIME......

lnSELWEZJakW9R3f7+J+uYuFiiC318gZ9P8C'\x29\x29\x29\x3B",".");


preg_replace с e модификатором будет исполнять этот код, он выглядит необычно, однако это просто сжатый в формате base64 php код использующий некоторые шестнадцатеричные коды символов.
\x65\x76\x61\x6C\x28\x67\x7A\x69\x6E\x66\x6C\x61\x74\x65\x28\x62\x61\x73\x65\x36\x34\x5F\x64\x65\x63\x6F\x64\x65\x28 переводится как eval ( gzinflate ( base64_decode (, а \x29\x29\x29\x3B, как )) ) ;

Эта команда поможет вам найти использование preg_replace:
find . -type f -name '*.php' | xargs egrep -i "preg_replace *\((['|\"])(.).*\2[a-z]*e[^\1]*\1 *," --color

Совет: если вы получаете тонну результатов выполнения данной команды, можно сохранить результат в файл или перенаправить их в другую программу под названием less, которая позволяет просматривать результаты по одной странице за раз. Клавиша f отвечает за прокрутку вперед, клавиша q за выход.

find . -type f -name '*.php' | xargs grep base64_ | less
find . -type f -name '*.php' | xargs grep base64_ > results.txt


---
Из своего опыта: часто код с вирусом располагается сразу после открытия тега <?php куча табуляций код вируса
Тем самым скрывая себя при просмотре в текстовом редакторе.

Совет: Используйте систему контроля версий (git, hg и т.д.) для того чтобы можно было быстро найти изменения и откатить их.
Совет: Регулярно обновляйте вашу CMS и все ее пакеты. По возможности отключите возможность отправки файлов в формах.
Совет: Регулярно меняйте пароли с админке/серверу/бд
Совет: Не авторизуйтесь в админку/FTP/SSH на чужом компьютере. Это крайне не безопасно. Используйте обновленное антивирусное обеспечение.
 
Значительно проще поступаю... Поставьте на сервер антивирусный пакет ClamAv, выполните обновление баз и запустите поиск по нужной директории, а лучше от корня. Лучше это не делать в час наибольшей нагрузки на сервак только.
А как его поставить? У меня есть ftp для заливки файлов, куда его загрузить?
 
А как его поставить? У меня есть ftp для заливки файлов, куда его загрузить?

Если у вас только хостинг, не выделенный сервер либо виртуальный сервер, то вы не сможете устанавливать пакеты самостоятельно. Но вы всегда можете спросить у службы поддержки о том какое антивирусное обеспечение они используют, как можно его использовать в вашей ситуации и возможно ли установить чтото еще.
 
Я бы рекомендовал также запретить использование опасных функций на уровне пхп. Это можно сделать через htaccess или конфиг пхп. Большинство из перечисленных функций никогда не используются популярными CMS, но востребованы для шелов.
Для .htaccess
php_value disable_functions 'exec, system, passthru, scandir, popen, shell_exec, proc_open, proc_close, proc_nice, get_current_user, getmyuid, posix_getpwuid, apache_get_modules, virtual, posix_getgrgid, getmyinode, fileowner, filegroup, getmypid, apache_get_version, apache_getenv, apache_note, apache_setenv, disk_free_space, diskfreespace, dl, ini_restore, openlog, syslog, highlight_file, show_source, symlink, disk_total_space, ini_get_all, get_current_user, posix_uname'

для php.ini
disable_functions = 'exec, system, passthru, scandir, popen, shell_exec, proc_open, proc_close, proc_nice, get_current_user, getmyuid, posix_getpwuid, apache_get_modules, virtual, posix_getgrgid, getmyinode, fileowner, filegroup, getmypid, apache_get_version, apache_getenv, apache_note, apache_setenv, disk_free_space, diskfreespace, dl, ini_restore, openlog, syslog, highlight_file, show_source, symlink, disk_total_space, ini_get_all, get_current_user, posix_uname';

Для пхп-фпм:

php_admin_value[disable_functions] = 'exec, system, passthru, scandir, popen, shell_exec, proc_open, proc_close, proc_nice, get_current_user, getmyuid, posix_getpwuid, apache_get_modules, virtual, posix_getgrgid, getmyinode, fileowner, filegroup, getmypid, apache_get_version, apache_getenv, apache_note, apache_setenv, disk_free_space, diskfreespace, dl, ini_restore, openlog, syslog, highlight_file, show_source, symlink, disk_total_space, ini_get_all, get_current_user, posix_uname'
 
Назад
Сверху