Сижу однажды смотрю "Южный Парк" во вконтакте, никого не трогаю. И тут приходит сообщение от яндекс.метрики что мой VPS сервер не доступен. Удивляюсь, проверяю. Действительно не открывается. Захожу в админку хостера. А там "приятное" сообщение:
Тема: Блокировка сервера
От: Alexander B. - 2012-08-05 00:06:28
С вашего VDS осуществляется удаленная атака на сторонний сервер. Это противоречит условиям предоставления услуг. Ваш VDS остановлен. Ждем объяснений.
Host Ip Proto Bytes Flows bps bpp akvatopia.ru. 62.109.15.180 UDP 4.8G 354392 63.9M 1498
Удивился еще больше. Перегрузил VDS-ку и начал смотреть логи.
В /var/log/apache2/error.log нашел следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [Fri Aug 03 21:59:20 2012] [error] [client 177.103.175.245] File does not exist: /htdocs [Sat Aug 04 09:58:31 2012] [error] [client 188.116.200.75] File does not exist: /htdocs sh: -c: line 1: syntax error near unexpected token `;' sh: -c: line 1: `; 1> /tmp/zcmdtemp 2>&1; cat /tmp/zcmdtemp; rm -rf /tmp/zcmdtemp' [Sat Aug 04 18:33:15 2012] [error] [client 125.21.246.70] File does not exist: /htdocs --2012-08-04 18:56:44-- http://www.lorrainejordan.com/osc.txt Resolving www.lorrainejordan.com... 69.27.101.88 Connecting to www.lorrainejordan.com|69.27.101.88|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 33860 (33K) [text/plain] Saving to: `osc.txt' 0K .......... .......... .......... ... 100% 53.8K=0.6s |
Стало понятно что взломали через кривой php скрипт.
Но как найти через какой? На сервере больше 20 доменов. Все раскиданы по разным пользователям. Внимательно изучать каждый вручную? Это будет долго и можно легко упустить нужный запрос в логе. Что делать?
Пока пытался придумать однострочник в bash-e чтобы погрепать сразу во всех логах, ввел такую команду:
1 | find /var/www/ -name "*.log" |
И тут же выцепил файлы psybnc бота который используется для контроля и организации ddos-атак.
1 2 3 4 | /var/www/%user%/data/logs/%domian1%.ru.error.log /var/www/%user%/data/logs/%domian2%.ru.error.log /var/www/%user%/data/www/%domain%/a9123412%sape-code%3412324123/.bob/log/psybnc.log /var/www/%user%/data/logs/%domain3%.ru.access.log |
Запихали его в директорию с sape-скриптом! Вот гады. Впрочем, это понятно. Она доступна на запись любому.
Посмотрел что там внутри:
1 2 3 4 5 6 7 8 | # ls -al drwxrwxrwx 3 aaauser2 aaauser2 200 2012-08-04 18:57 . drwxr-xr-x 7 aaauser2 aaauser2 1112 2012-06-08 12:00 .. drwx------ 7 www-data www-data 496 2012-06-17 12:53 .bob -rw-r--r-- 1 www-data www-data 141227 2008-12-11 19:27 bobpsy.tar.gz.1 -rw-r--r-- 1 www-data www-data 141227 2008-12-11 19:27 bobpsy.tar.gz.1.1 -rw-r--r-- 1 aaauser2 aaauser2 64731 2012-06-03 03:59 sape.php -rw------- 1 www-data aaauser2 5257 2012-06-17 01:47 wp-pdf.php |
Обнаружил скрипт через который взломали и запустили ддос - wp-pdf.php.
После этого уже нашел и обращение к нему в логах:
1 | 112.198.77.139 - - [04/Aug/2012:18:19:48 +0400] "GET /a3412%sapecode%1223432/wp-pdf.php HTTP/1.1" 200 4431 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0" |
Вот еще список полезных строчек bash-команд для поиска подозрительных файлов на вашем сервере:
1 2 3 4 5 6 7 8 9 10 11 12 | # Поиск по пользователю, группе apache find /var/www/ -user www-data find /var/www/ -group www-data # Поиск обращения к файлу по всем логам find /var/www/ -name "*.log" | xargs cat '{}' | grep 'wp-pdf.php' # Тоже самое, но теперь в архивных, запакованных логах. find /var/www/ -name "*.gz" | xargs zcat '{}' | grep 'wp-pdf.php' # Ищем файлы доступные любому для чтения find /var/www/ -perm -o=w |
И, кстати, анализируя запускаемые скрипты бэкдора, обнаружил подарочек в crontab-е.
1 2 | # crontab -u www-data -l 0,10,20,30,40,50 * * * * /var/www/aaauser2/data/www/%domain1%.ru/a1231%sapecode%231324/.bob/boby2k >/dev/null 2>&1 |
Такое тоже надо не забывать вычищать.
Понятно что файл wp-pdf.php оставили как запасной вход (back-door). А взломали раньше. Причем я догадываюсь даже через что. Через открытый установочный файл scripts/setup.php, панель ispmanager на debian-е этим грешит. Потом я закрыл его для всех, поставил 0700 на файл setup.php (можно убедится тут http://akvatopia.ru/myadmin/scripts/setup.php). Но вот за бекдором и не усмотрел, как оказалось.
Вот для любопытных такое же в гугле:
http://www.google.ru/search?q=allinurl:scripts/setup.php&start=100
phpMyAdmin 2.11.8.1deb5+lenny3 setup
phpMyAdmin 2.11.4 setup
phpMyAdmin 2.8.2.2 setup
phpMyAdmin 2.11.3-rc1 setup
Реальный пример, по-видимому, уязвимых сайтов:
http://w3.uniroma1.it/phpmyadmin/scripts/setup.php
http://www.mrrda.com/public/_phpmyadmin/scripts/setup.php
http://kunden.goracer.de/phpmyadmin/18377/scripts/setup.php
Описание самой баги:
http://www.securityfocus.com/bid/37861
http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2009-4605
http://onsec.ru/php-unserialize.pdf
Как использовать:
http://rdot.org/forum/showthread.php?t=347
http://www.xakep.ru/post/52128/
http://forum.antichat.ru/showthread.php?t=239845
http://pastebin.com/GrVvx544
Но эта уязвимость старая, поэтому скорее всего уже везде прикрыта.
Таким вот образом навыки information security пригождаются иногда и в seo.
В общем, не забывайте следить за своими сайтами. Проверяйте их на закладки и наличие неожиданных файлов. Для этого, например, самое простое что можно сделать, это создать полный листинг всех ваших веб-файлов через ls -alR. Нестандартные, необычные файлы будут сразу бросаться в глаза даже при беглом его просмотре.
Такие дела.
— Сволочи!
(с) Южный парк