Обнаружен вредоносный WSO РНР шэлл-скрипт /libraries/simplepie/idn/OpenIDOpenID.php (сайт на Joomla! 3). На данный момент определяется только некоторыми антивирусами как JS/SARS.S61, PHP:Decode-DE [Trj], Trojan.Html.Agent.vsvbn, PHP.Shell.354, php.cmdshell.unclassed.359.UNOFFICIAL.
В один "прекрасный" (это кому как) день, один из наших подопечных (http://ladynews.biz), в результате сканирования своего сайта антивирусом хостинга, получил вот такую вот мессагу:
Разумеется, было предложено разобраться с этим безобразием, - сканирование штатным антивирусом ClamAV, с набором антивирусных баз по умолчанию, не дал дополнительного результата.
На момент начала этой истории (2015-10-23), этот вирусный шелл-скрипт отсутствовал в антивирусных БД большинства антивирусов включая таких "монстров" как Comodo, DrWeb, ESET-NOD32, GData, Kaspersky, McAfee, Microsoft, Symantec, TrendMicro и т.п., что также 2015-10-23 было подтверждено онлайн-сканером VirusTotal. Лишь только несколько антивирусов смогли определить вредоносный PHP скрипт:
Антивирус Результат Дата обновления AhnLab-V3 JS/SARS.S61 20151022 Avast PHP:Decode-DE [Trj] 20151023 NANO-Antivirus Trojan.Html.Agent.vsvbn 20151023
В тот же день про обнаружение вредоносного скрипта были поставлены в известность ClamAV и Dr.Web. ClamAV пока упорно молчит, а Dr.Web на вредоносную посылку отреагировал в течении 24 часов:
Ваш запрос был проанализирован. Соответствующая запись добавлена в вирусную базу Dr.Web и будет доступна при следующем обновлении.
Угроза: PHP.Shell.354
Dr.Web сдержал своё обещание и вирусный скрипт OpenIDOpenID.php теперь определяется как PHP.Shell.354, однако многие антивирусы такие как ClamAV, Comodo, DrWeb, ESET-NOD32, GData, Kaspersky, McAfee, Microsoft, Symantec, TrendMicro и т.п., ещё понятия о нём не имеют (по состоянию на 2015-10-25).
Ок., файл /libraries/simplepie/idn/OpenIDOpenID.php мы удалили, а надолго ли? Откуда он взялся, мы можем только теряться в догадках. Что дальше? Начинаем ставить всякие Securitycheck компоненты и крутить правила в .htaccess запрещающие доступ к всему и вся ибо на шаред-хостинге (ака Виртуальный хостинг, shared hosting) на большее у нас нет полномочий. На долго ли эти меры спасут, никто не знает.
Кстати на тему всяких Securitycheck компонентов... Securitycheck - это компонент для Joomla! и вполне неплохой. А вот некий "Antivirus Website Protection" полнейший отстой которым я крайне никому нерекомендую использовать, вот подтверждённый практикой отзыв об этом "Antivirus Website Protection":
Ease of use
This Component also creates a pack.tar file in your /tmp that contains your configuration.php and any other passwords found! BE AWARE
Что в переводе означает: "этот компонент также создаёт резервную копию всего сайта в файле /tmp/pack.tar, который содержит configuration.php с паролями от БД! БУДЬТЕ ОСТОРОЖНЫ" - это говорит о том, что "Website Protection" от этого компонента и не пахнет, что также должно навести жертву на мысль про изменение путей к директориям /logs
, /tmp
, /cache
и запрета доступа к ним.
Перейдя по этой ссылке можно понять, что проблеме как минимум больше года. Заглянув сюда поймём, что маскировка шэлл-скрипта выполнена не хитрыми base64_encode/gzdeflate, а значит ещё где-то должна быть часть вызывающая/подключающая OpenIDOpenID.php и выполняющая base64_decode/gzinflate. Значит OpenIDOpenID.php лишь результат (ака следствие), а не причина, где жертва жалуется на то что, с сервера начал отправляться спам в промышленных масштабах, а ручное удаление вредоносных файлов не помогает, после чего жертве кроме как на NIC-RU хостинг жаловаться больше не на кого. "Дырявый" виртуальный хостинг вполне может быть и оч. даже часто имхо люди там работают за з/п, а не за идею, но в некоторых случаях проблема может быть значительно глубже.
Вот к примеру "В файле Adobe Flash обнаружен вредоносный инжектор iFrame". Думаю ни для кого не секрет, что на флэш можно писать интерфейсы для загрузки файлов на сайт и делать ещё много разных интересных вещей на языке ActionScript. Вирус в .swf
файлах (Adobe Flash), как показала практика, может оставаться незамеченным годами и быть чёрной дверью в сайте (ака back door — задняя дверь) через которую "закидываются" файлы вроде "OpenIDOpenID.php" удалять которые можно до посинения и безрезультатно.
Что же делать, как среди тысяч файлов найти "слабое звено"? Для этого нужно использовать так называемый эвристический анализ и в некоторых случаях применять антивирусные базы данных сторонних разработчиков. Следует брать во внимание, что эвристический анализ, в зависимости от его настроек, может давать много ложных срабатываний чем при использовании дополнительных вирусных сигнатур от сторонних разработчиков.
Где взять антивирусные базы данных сторонних разработчиков? Например базы данных с антивирусными сигнатурами от сторонних разработчиков для ClamAV можно взять бесплатно по адресам: www.securiteinfo.com, malwarepatrol.net, rfxn.com. Как использовать эти дополнительные антивирусные базы? Это уже совсем будет иная история. Можно сказать лишь то, что дополнительные антивирусные базы для ClamAV от rfxn.com (проект LMD (Linux Malware Detect)) нацелены на поиск вредоносного ПО именно в веб-приложениях и даёт более удачные результаты. rfxn.com так же заявляет, что 78% угроз, отпечатки которых содержатся в их БД не определяются более чем 30-ю коммерческими анти-вирусами, - и скорее всего так оно и есть.
Итак... Чем же закончилась история с вредоносным РНР-шелл скриптом OpenIDOpenID.php?
Решено было запастись дополнительными антивирусными базами для ClamAV от malwarepatrol.net и rfxn.com, скачать резервную копию файлов сайта да просканировать их локально, вот результат сканирования:
$ clamscan /ladynews.biz /../game_rus.swf: MBL_647563.UNOFFICIAL FOUND /../farmfrenzy_pp_rus.swf: MBL_647563.UNOFFICIAL FOUND /../beachpartycraze_rus.swf: MBL_2934225.UNOFFICIAL FOUND /../hollydeluxe_rus.swf: MBL_647563.UNOFFICIAL FOUND /../loader_rus.swf: MBL_647563.UNOFFICIAL FOUND ----------- SCAN SUMMARY ----------- Known viruses: 4174348 Engine version: 0.98.7 Scanned directories: 3772 Scanned files: 18283 Infected files: 5 Total errors: 1 Data scanned: 417.76 MB Data read: 533.51 MB (ratio 0.78:1) Time: 1039.768 sec (17 m 19 s)
/libraries/simplepie/idn/OpenIDOpenID.php как и выше упомянутые .swf файлы были удалены, а решена ли проблема? Пока сложно сказать, - копаем дальше...
Из расшифрованной версии файла /libraries/simplepie/idn/OpenIDOpenID.php (http://pastebin.com/WRLRLG9B), взглянув на константу @define('WSO_VERSION', '2.5');
, становится ясно, что это такой себе продукт под названием WSO. Немного покопав сеть по ключевому слову WSO были получены вот такие вот результаты:
- WSO (веб-шелл) | Форум АНТИЧАТ
- HARDLINUX/webshell (PHP webshell - Новый Web Shell WSO на php 2015 года)
Оказывается тема давно не нова, что ж берём в зубы regexxer, продолжаем колупать файлы сайта и обнаруживаем: Error opening directory '/home/user/libraries/joomla/cache/controller/cache': Отказано в доступе
Ага, вот ты с.ка где ещё серануло! Смотрим права на директорию /libraries/joomla/cache/controller/cache, которой по умолчанию не должно быть, = chmod 111
(ака Выполнить для Владелец/Группа/Все). Таким образом что-то где-то сидит и рассырает себя по каталогам скрывая себя даже от вирусов чмодами 111.
Установив для каталога чмоды 551 и заглянув во внутрь, там был обнаружен /libraries/joomla/cache/controller/cache/cache/langs.php, исходный код которого выложен здесь: http://pastebin.com/JDTWpxjT - каталог /libraries/joomla/cache/controller/cache удаляем.
Отлично, теперь приводим в порядок чмоды на все файлы и каталоги:
# массовая смены прав (chmod) на файлы в директории ./dirname и нижележащих find /home/user/public_html -type f -exec chmod 644 {} \; # массовая смены прав (chmod) на в ./dirname и нижележащих find /home/user/public_html -type d -exec chmod 755 {} \;
Ещё раз повторяем проверку антивирусом с дополнительными базами clamscan /ladynews.biz
, но якобы всё чисто.
Повторяем поиск файлов regexxer-ом и пробуем поискать по ключевым словам OpenIDOpenID, OpenID или WSO - и, приходим к выводу о том, что п.здец оказался намного ширше и глубже:
- /administrator/components/com_admin/index.php - его не должно здесь быть, вот его исходник: http://pastebin.com/jYEiZY9G
- /administrator/components/com_finder/controllers/imagelist.php - его не должно здесь быть, вот его исходник: http://pastebin.com/0uqDRMgv
- /administrator/components/com_users/tables/css.php - его не должно здесь быть, вот его исходник: http://pastebin.com/8qNtSyma
- /administrator/templates/hathor/html/com_contact/contact/toolbar.trash.html.php - его не должно здесь быть, вот его исходник: http://pastebin.com/CtVuZsiz
- /components/com_jce/editor/tiny_mce/plugins/link/img/Manager.php - его не должно здесь быть, вот его исходник: http://pastebin.com/2NwTNCxx
- /libraries/joomla/application/web/router/helpsites.php - его не должно здесь быть, вот его исходник: http://pastebin.com/ANHxyvL9
- /plugins/system/ytshortcodes/XML.php - его не должно здесь быть, вот его исходник: http://pastebin.com/GnmSDfc9
- /templates/index.php - его не должно здесь быть, вот его исходник: http://pastebin.com/gHbMeF2t
/administrator/components/com_admin/index.php и /templates/index.php вероятно были входными скриптами, в которых выполнялся основной код с помощью крайне не рекомендуемой к использованию функции eval()
где также использовались:
$v1 = strrev("edoced_46esab"); $v3 = strrev("etalfnizg"); $md = str_rot13("onfr64_qrpbqr"); $mdh = str_rot13('tmvasyngr');
Что ж, логика маскировки вредоносного кода ясна. Теперь же если мы поищем конструкцию "eval($
", то мы обнаружим ещё очень много интересного:
- /administrator/components/com_admin/sql/updates/postgresql/php.php - http://pastebin.com/gRHvXt5u
- /components/com_kunena/template/blue_eagle/media/iconsets/buttons/bluebird/newsfeed.php -
- /components/com_mailto/helpers/index.php -
- /components/com_users/views/login/file.php -
- /components/com_users/controller.php - инфицирован и требует замены!,
- /includes/index.php -
- /libraries/joomla/string/wrapper/section.php -
- /libraries/legacy/access/directory.php -
- /libraries/nextend/javascript/jquery/InputFilter.php -
- /libraries/nextend/smartslider/admin/views/sliders_slider/tpl/config_tinybrowser.php -
- /libraries/xef/assets/less/admin.frontpage.php -
- /media/editors/codemirror/mode/rust/Alias.php -
- /modules/mod_kunenalatest/language/zh-TW/smtp.php -
- /modules/mod_kunenalogin/language/de-DE/XUL.php -
- /plugins/content/jw_allvideos/jw_allvideos/includes/js/mediaplayer/skins/bekle/CREDITS.php -
- /templates/sj_news_ii/html/mod_sj_contact_ajax/toolbar.messages.php -
Не от всех ещё вирусных РНР скриптов код выложен на pastebin.com ибо в течении 24 часов разрешается только 10 публикаций. В общем порядок удаления примерно следующий:
Да, чуть не забыл, - перед началом удаления вредоносных скриптов не помешает добавить в .htaccess несколько правил запрещающих прямое обращение к любым .php файлам в любых директориях, но разрешающие доступ только к корневым файлам /
или /index.php
и /administrator/
или /administrator/index.php
- это перекроет противному злоумышленнику доступ к входящим шэлл-скриптам спрятанных в различных системных директориях:
UPD 2015-10-28: Ну, что? Уже расслабились? Рано ещё...
Теперь ещё поищем в дебрях файлов сайта бинарные файлы, которых в движке не должно быть и в помине:
find /mypath/ -executable -type f find /mypath/ -type f -perm -u+x find /mypath/ -type f | xargs file | grep "\:\ *data$"
Кто ищет — тот всегда найдет (бинарные файлы):
- /modules/mod_p30life_expectancy_calc/tmpl/accordian.pack.js
- /images/stories/audio/34061012-b1be419af0b9.mp3
- /libraries/xef/sources/folder/navigation.php
- /libraries/joomla/application/web/application.php
- /libraries/joomla/document/json/admin.checkin.php
- /libraries/nextend/assets/css/LICENSES.php
- /libraries/fof/config/domain/toolbar.categories.html.php
- /libraries/fof/form/field/client.php
- /libraries/phputf8/sysinfo_system.php
- /components/com_mobilejoomla/index.php
- /components/com_mobilejoomla/sysinfo_system.php
- /components/index.php
- /components/com_banners/sysinfo_config.php
- /components/com_kunena/views/home/admin.checkin.php
- /components/com_jce/editor/tiny_mce/plugins/source/js/codemirror/toolbar.checkin.php
- /components/com_jce/editor/tiny_mce/plugins/colorpicker/admin.cache.php
Подытожим
Откуда выросли ноги у этой заразы достоверно установить не удалось, - то ли виновата недавно найденная в движке критическая уязвимость позволяющая выполнять SQL-инъекции и повышать привилегии, то ли упомянутые выше отмеченные как вредоносные .swf файлы, то ли ещё не обнаруженная до сих пор какая-то уязвимость в одном из сторонних компонентов или плагинов, то ли дырявый виртуальный веб-хостинг, - вопрос остаётся открытым?
На текущий момент обнаруженные вредоносные файлы вычищены, файлы движка полностью перезалиты, правилами в .htaccess выстроены баррикады... У кого есть время и кому интересно собрать воедино и поковырять эту кучу говна можете скачать архив wso-php-shell-in-joomla.zip - там упакованы все упомянутые выше вредоносные РНР файлы, пароль от архива: www.remoteshaman.com
ИТОГО: Паранойи много не бывает, а любой бесплатный или коммерческий антивирус с его эвристикой вместе с дополнительными базами сигнатур далеко не панацея. Следовательно любые анти-вирусы являются устаревшим инструментом для защиты активной многопользовательской среды и для предотвращения различных неизвестных угроз следует использовать именно параноидальные методы защиты, например: виртуализация, SELinux, Bastille Linux, immutable bit, ecryptfs etc!
- Угроза: WSO PHP веб-шелл
- Жертва: ladynews.biz