LINUX.ORG.RU
ФорумAdmin

Как защитить от инъекций php-fph в свзяке с nginx

 ,


0

1

Здравствуйте, форумчане. Случилась проблема. Купили виртуальный сервер на reg.ru, с предустановленным LEMP. Директория сайта /var/www/html пользователь и группа sites:sites, nginx и php-fpm работают тоже от имени пользователя sites. Есть несколько сайтов на php. Несколько раз в неделю в папке /tmp создаются директории с рандомными названиями zzffrtt, zzffrtt2, zzffrtt3 владелец и группа sites:sites.

ls -lh /tmp
drwxrwxrwx 2 sites sites 4.0K Nov 15 19:27 zzffrtt
drwxrwxrwx 2 sites sites 4.0K Nov 15 19:28 zzffrtt2
drwxrwxrwx 2 sites sites 4.0K Nov 15 1

В этих директориях лежит одноимённый файл zzffrtt размер около 2Мбайт. В процессах появляются одноимённые процессы zzffrtt, zzffrtt2, zzffrtt3. Скорее всего это какой-нибудь спам-бот и проникает он через php-fpm, так как только в его настройках указан параметры:

env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

Собственно, помогите устранить эти вторжения. Как можно определить как именно произошла инъекция, как настроить логирование для поиска источника. В самих логах nginx нет ничего информативного, ведь должен быть какой-то get или post запрос, а если сопоставить время появления вирусов в папке /tmp и логи nginix, то никаких записей там нет. Версия php-fpm - 7.2.24-0, версия nginx/1.14.0. Читал про уязвимость CVE-2019-11043 которая срабатывает при классической настройки виртуального хоста для обработки php запросов:

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
try_files $fastcgi_script_name =404;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}


Последнее исправление: touch_pro (всего исправлений: 2)

Скорее всего уязвимость в php-софте (полезной нагрузке) который у тебя в /var/www/html. Что там у тебя стоит, WP, Joomla, Opencart…?

Что стоит сделать:

  • Проверить не появились-ли в php софте бэкдоры (сравнить файлы с эталонными, то что правил/писал сам просмотреть глазами);
  • Переустановить ОС, накатить всё по новой;
  • Обновить php-софт (CMS, темы, плагины…);
  • Есть различные костыли которыми можно подпереть phpшную прикладуху чтобы уязвимости в ней было сложнее использовать, но это отдельная тема и для начала нужно разобраться с некостыльными методами перечисленными выше.
MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Движок мало известный evro-site, этой конторы уже нет с 2018 года. Плюс ещё несколько сайтов с каким-то самописным php. Тоесть разработчиков сайтов нет, и текущий движок не обновить.

Поэтому и решил спросить на форуме, как найти источник проникновения. Вполне возможно что это php-софт, но как это доказать?

touch_pro
() автор топика
Ответ на: комментарий от touch_pro

Вполне возможно что это php-софт, но как это доказать?

Если нет каких-то веских свидетельств в пользу того что дыра не в php-скриптах, разумно исходить из того что она в них. Это гораздо вероятнее.

Если в логах nginx вобще нет запросов совпадающих более-менее по времени со временем создания файлов, возможно неверно время создание файлов. Если нет только подозрительных запросов, возможно запросы выглядят не подозрительно (например в код сайта внедрён бэкдор управляемый через кастомный заголовок или куку, в логах это будет обычный GET заглавной страницы).

Раз код не поддерживается и, вероятно, имеет уязвимости, разумно по максимуму ограничить ему права. В идеале запретить ему писать на диск вообще или хотя бы запретить писать в места в которых разрешено выполнение кода

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Попробую для каждого сайта создать отдельного юзера, тогда новый вирус в папке /tmp будет создан от конкретного юзера из под которого запускается php-fpm. Пока юзер один ‘sites’ то сложно сказать какой конкретно сайт заражён.

touch_pro
() автор топика
Ответ на: комментарий от touch_pro

Движок мало известный evro-site, этой конторы уже нет с 2018 года

На этом можно заканчивать, т.к. в переводе на русский это значит «код решето, а исправить дороже чем выкинуть».

no-such-file ★★★★★
()
Ответ на: комментарий от touch_pro

Вполне возможно что это php-софт, но как это доказать?

Погрепай в логах POST-запросы к скриптам с IP ботов.

Станет немного понятнее.

Twissel ★★★★★
()
Ответ на: комментарий от no-such-file

Чтобы это обосновать руководству, нужно сперва доказать что админ тут ни причём, а для этого нужна конкретика, подтверждающий лог запроса…

touch_pro
() автор топика
Ответ на: комментарий от touch_pro

подтверждающий лог запроса

Если исходить из того что код как-то загружают на сервер (т.е. он не спрятан где-то на сервере заранее), то можно попробовать логать все запросы с длинным контентом полностью, т.е. от заголовков до конца контента.

no-such-file ★★★★★
()
Ответ на: комментарий от jura12

Спасибо за подсказку. Установил ModSecurity 3 в режиме SecRuleEngine DetectionOnly. В лог начала писаться огромная куча запрсов, основная масса идёт с вэб-формы обратной связи:

GET /pages/31/?id=9&subject=%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%20%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5%20%D0%B2%D0%B5%D1%81%D1%8B%20%D0%92%D0%90-%D0%9F HTTP/1.1
Accept: text/html,text/plain,text/xml,text/*,application/xml,application/xhtml+xml,application/rss+xml,application/atom+xml,application/rdf+xml,application/php,application/x-php,application/x-httpd-php
User-Agent: Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)
Accept-Encoding: br,gzip
Accept-Language: ru
Host: ip-адрес

Онлайн кодировщик Base64 не смог раскодировать эту строчку

%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%20%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5%20%D0%B2%D0%B5%D1%81%D1%8B%20%D0%92%D0%90-%D0%9F

Что я делаю не так? Или это и есть атака бота mj12bot.com который под видом Base64 шлёт непонятные инструкции?

touch_pro
() автор топика
Ответ на: комментарий от touch_pro

php -r 'echo urldecode("%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%20%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D1%8B%D0%B5%20%D0%B2%D0%B5%D1%81%D1%8B%20%D0%92%D0%90-%D0%9F");'

Это обычный спам.

NeOlip ★★
()
Ответ на: комментарий от touch_pro

все правильно ты делаешь. только это все просмотр. waf начнет работать только после SecRuleEngine On. но тогда на сайтах может чтото перестать работать. например на моем сайте перестала сохраняться страница потомучто там была записана линуксовая команда. наверно надо какие-то фильтры надо отключить. но потом как все проверишь то будешь защищен.неважно что попадает в лог. вирусы намеренно шифруют свои команды.

P.S.у fail2ban есть свой фильтр для mod security.

jura12
()
Последнее исправление: jura12 (всего исправлений: 1)
Ответ на: комментарий от NeOlip

Спасибо, очень помогло. Может что-нибудь интересное удастся расшифровать.

touch_pro
() автор топика

чота мало верится, что дело в пыхосайтах, ну серьезно. если права на файлы в тмп от типа ввв-дата, то не значит что это от живых сайтов, начиная с того, что в хттп шару аплоадят какойнить мадшелл, заканчивая тем, что дырка гденить в утекших паролях/ключах ссх, а права - дело десятое и ставятся только чтобы запутать.

deep-purple ★★★★★
()
Ответ на: комментарий от jura12

Может подскажете как в modsecurity убрать запись в лог Response body, а то это тело ответа очень гигантское, невозможно листать лог.

touch_pro
() автор топика
Ответ на: комментарий от deep-purple

Проверил лог успешных подключений по ssh.

less /var/log/auth.log | grep Accepted

И кроме моих подключений больше к серверу никто не подключался.

touch_pro
() автор топика
Ответ на: комментарий от jura12

Разобрался, надо было в логе убрать параметр E отвечающий за тело ответа:

#SecAuditLogParts ABIJDEFHZ
SecAuditLogParts ABIJDFHZ

Теперь лог стал весить в разы меньше, и его удобнее читать. Но пока ничего интересного там не нашёл, кроме бесконечных обращений к форме обратной связи(((

touch_pro
() автор топика
Ответ на: комментарий от deep-purple

Может тогда посоветуете как поискать мадшелы на сайте, может есть какой-нибудь скрипт?

touch_pro
() автор топика

В логе modsecurity нашёл интересную строку:

-A
 GET /index.php?param1=assert&param2=print(md5(57575848371)); HTTP/1.1
-H
 Warning. detected SQLi using libinjection.

Что бы это значило?

touch_pro
() автор топика
Ответ на: комментарий от touch_pro

вы молодец, быстро у вас получается. я знаком только с теорией. у меня какоето правило блокирует сохранение контента. потому брокировку я пока отключил.

заметте. на мод секьюрити есть фильтр в fai2ban. особо назойливых можно банить.

jura12
()
Ответ на: комментарий от touch_pro

надо смотреть какое правило срабатывает и читать само правило.

jura12
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.