Поиск бэкдоров на сервере
В данном сообщении речь пойдет о том, как найти бэкдор на вашем сервере. Чаще всего наличие вредоносного кода сказывается на повышенной нагрузке на сервер. Связано это с тем, что различные веб-шеллы сами по себе не интересны, а служат лишь проводником для получения информации либо протроянивания сервера. О том, как злоумышленникам удалось получить доступ к вашим файлам или базе данных будет описано позже и в другой статье. Здесь же я лишь поведаю о том, чем могут угрожать бреши в безопасности и как найти и удалить бэкдор.
В случае использования каких-либо CMS и движков приходится быть готовым к тому, что рано или поздно кто-нибудь найдет уязвимость в системе и проэксплуатировав её получит доступ к вашим данным. После того как хакер нашел способ, например загружать файлы на ваш сервер ему нужно получить доступ к функциям того-же php или консоли. Для этого существуют различные веб-шеллы, которые также используют некоторые web-mastera для быстрого доступа к файлам, mysql и прочему. Как правило для выполнения команд в таких скриптах используются различные функции php. Вот неполный список таких:
passthrushell_execsystemeval
Выглядит такой 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...
Таким простым образом мы нашили подозрительные файлы которые нужно рассмотреть и отправить в печь.

