Вредоносный РНР шелл-скрипт - Откуда растут ноги

malware-logo Обнаружен вредоносный 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), в результате сканирования своего сайта антивирусом хостинга, получил вот такую вот мессагу:

В аккаунте обнаружены файлы с вредоносным содержимым. Настоятельно рекомендуем ограничить доступ к FTP аккаунту только с используемых Вами IP-адресов, а также воспользоваться антивирусной защитой для проверки аккаунта на наличие вирусов. Ознакомьтесь со статьей Рекомендации по безопасности и защите от взлома для предотвращения повторного заражения.

Разумеется, было предложено разобраться с этим безобразием, - сканирование штатным антивирусом 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 были получены вот такие вот результаты:

Оказывается тема давно не нова, что ж берём в зубы 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

Комментарии   

АдМинь БагоИскатель
0 #1 АдМинь БагоИскатель 03.11.2015 08:13
Да, хорошо погрызло...
Цитировать

Добавить комментарий


Защитный код
Обновить

2 megabytes