Поиск бэкдоров на сервере

В данном сообщении речь пойдет о том, как найти бэкдор на вашем сервере. Чаще всего наличие вредоносного кода сказывается на повышенной нагрузке на сервер. Связано это с тем, что различные веб-шеллы сами по себе не интересны, а служат лишь проводником для получения информации либо протроянивания сервера. О том, как злоумышленникам удалось получить доступ к вашим файлам или базе данных будет описано позже и в другой статье. Здесь же я лишь поведаю о том, чем могут угрожать бреши в безопасности и как найти и удалить бэкдор.

В случае использования каких-либо CMS и движков приходится быть готовым к тому, что рано или поздно кто-нибудь  найдет уязвимость в системе и проэксплуатировав её получит доступ к вашим данным. После того как хакер нашел способ, например загружать файлы на ваш сервер ему нужно получить доступ к функциям того-же php или консоли. Для этого существуют различные веб-шеллы, которые также используют некоторые web-mastera для быстрого доступа к файлам, mysql и прочему. Как правило для выполнения команд в таких скриптах используются различные функции php. Вот неполный список таких:

  • passthru
  • shell_exec
  • system
  • eval

Выглядит такой web 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...

Таким простым образом мы нашили подозрительные файлы которые нужно рассмотреть и отправить в печь.

Так же можно заказать анализ у StopVirus.by полноценный анализ на вредоносный код.