Поиск бэкдоров на сервере
В данном сообщении речь пойдет о том, как найти бэкдор на вашем сервере. Чаще всего наличие вредоносного кода сказывается на повышенной нагрузке на сервер. Связано это с тем, что различные веб-шеллы сами по себе не интересны, а служат лишь проводником для получения информации либо протроянивания сервера. О том, как злоумышленникам удалось получить доступ к вашим файлам или базе данных будет описано позже и в другой статье. Здесь же я лишь поведаю о том, чем могут угрожать бреши в безопасности и как найти и удалить бэкдор.
В случае использования каких-либо CMS и движков приходится быть готовым к тому, что рано или поздно кто-нибудь найдет уязвимость в системе и проэксплуатировав её получит доступ к вашим данным. После того как хакер нашел способ, например загружать файлы на ваш сервер ему нужно получить доступ к функциям того-же php или консоли. Для этого существуют различные веб-шеллы, которые также используют некоторые web-mastera для быстрого доступа к файлам, mysql и прочему. Как правило для выполнения команд в таких скриптах используются различные функции php. Вот неполный список таких:
passthru
shell_exec
system
eval
Выглядит такой web shell примерно так:
Это довольно распространенный веб шелл, есть и более известные, например b374k-shell. Выглядит он так:
Основной функционал таких шеллов:
- отображении информации о сервере
- работа с файлами и папками, а также правами доступа к ним
- SQL менеджер
- выполнение PHP кода
- биндпорт и бек-коннект (удаленное подключение)
Остальные функции по вкусу и цвету. Все это умещается в размер менее 50 килобайт.
Обычно такие скрипты используют обфускацию и прочие приёмы для затруднения чтения исходного кода. Но основой для их функционирования все-таки служат выше описанные функции.
Для поиска бэкдоров существует множество инструментов, например для блогового движка WordPress есть специальные плагины, один из таких exploit-scanner. Я же хочу показать способ поиска через консоль, т.е. обычный поиск текста в файлах.
Воспользуемся командой grep.
grep -RPn "(passthru|shell_exec|system|base64_decode|fopen|fclose|eval)" /var/www/ > /var/www/backlist.txt
После поиска в файле /var/www/backlist.txt будут находится пути к файлам, которые подходят под наши требования. В моем случае получился такой список:
/var/www/stackoff.local/wso2.php:87: "list file attributes on a Linux second extended file system" => "lsattr -va", /var/www/stackoff.local/wso2.php:206: eval(arr[2].substr(0, arr[1])); /var/www/stackoff.local/wso2.php:311: } elseif (function_exists('passthru')) { /var/www/stackoff.local/wso2.php:313: @passthru($in); /var/www/stackoff.local/wso2.php:315: } elseif (function_exists('system')) { /var/www/stackoff.local/wso2.php:317: @system($in); /var/www/stackoff.local/wso2.php:319: } elseif (function_exists('shell_exec')) { /var/www/stackoff.local/wso2.php:320: $out = shell_exec($in); /var/www/stackoff.local/wso2.php:479: eval($_POST['p1']); /var/www/stackoff.local/wso2.php:508: eval($_POST['p1']); /var/www/stackoff.local/wso2.php:595: $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($f.'/', FilesystemIterator::SKIP_DOTS)); /var/www/stackoff.local/wso2.php:713: 'Base64 decode' => 'base64_decode', /var/www/stackoff.local/wso2.php:803: $fp = @fopen($_POST['p1'], "r"); /var/www/stackoff.local/wso2.php:807: fclose($fp); /var/www/stackoff.local/wso2.php:813: $fp = @fopen($_POST['p1'], 'w'); /var/www/stackoff.local/wso2.php:816: fclose($fp); /var/www/stackoff.local/wso2.php:846: $fp = @fopen($_POST['p1'], 'r'); /var/www/stackoff.local/wso2.php:850: @fclose($fp); /var/www/stackoff.local/wso2.php:880: $fp = @fopen($_POST['p1'],"w"); /var/www/stackoff.local/wso2.php:883: @fclose($fp); /var/www/stackoff.local/wso2.php:889: $fp = @fopen($_POST['p1'], 'r'); /var/www/stackoff.local/wso2.php:893: @fclose($fp); /var/www/stackoff.local/wso2.php:1309: } elseif($fp = @fopen($_POST['file'], 'w')) { /var/www/stackoff.local/wso2.php:1312: fclose($fp); /var/www/stackoff.local/wso2.php:1478: $w = @fopen($f,"w") or @function_exists('file_put_contents'); /var/www/stackoff.local/wso2.php:1480: @fwrite($w,@base64_decode($t)); /var/www/stackoff.local/wso2.php:1481: @fclose($w); /var/www/stackoff.local/wso2.php:1512: eval($_POST['p1']); /var/www/stackoff.local/b374k-2.2.poly.php:1:<?php eval(gzinflate(base64_decode("HJ3HbuzccoVf5cLwwAYHzAmGAXcz5xwnPxibOeenN3Un...
Таким простым образом мы нашили подозрительные файлы которые нужно рассмотреть и отправить в печь.