На днях мне довелось впервые познакомиться с вирусом, который пытался майнить криптовалюту на одном из серверов, за которым я приглядывал. Сама история обнаружения и лечения веб сервера от этого вируса не представляет какого-то особенного интереса. Тем не менее я решил поделиться опытом общения с новым для меня зловредом.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Симптомы заражения
Все началось как обычно - с сообщения от мониторинга zabbix о том, что на сервере повышенная нагрузка на CPU. Сразу скажу, что мониторинг - лучший друг в борьбе с вирусами. Без его помощи можно вообще не узнать, что у вас что-то случилось.
Кратенько расскажу о сервере. Этот веб сервер несет на себе очень старые сайты на популярных движках. Многие из этих сайтов давно не обновлены, в них есть уязвимости, которые периодически используют злоумышленники и заливают вирусы. То, что можно было и имело смысл обновить - обновили, но далеко не все. Это просто неоправданно дорого и бесполезно в данном случае. Я перенес в свое время все эти сайты на отдельный веб сервер, где все пакеты и сама система имеют свежие версии и оперативно обновляются. Тем не менее, это не сильно спасает от периодических проблем, которые я закрываю в ручном режиме.
В данном случае первой ласточкой был вирус, рассылающий спам. Я зашел на сервер и увидел огромную очередь писем на отправку. Почтовый лог был забит информацией. Я сразу же остановил и отключил postfix, так как он там по большому счету не нужен. Отправка писем ведется через внешний smtp.
В разделе /tmp заметил левые файлы с владельцем apache. Удалил их. Времени подробно разбираться с сервером не было и я отложил это дело, но снизил метрики в мониторинге, чтобы сразу заметить малейшее увеличение нагрузки выше среднего.
В следующую ночь на сервере опять были странности, которые я сразу же заметил утром по мониторингу. Сервер - виртуальная машина с одним процессором. В стандартном шаблоне заббикс срабатывает триггер, если load average держится выше 5-ти, что для однопроцессорного сервера очень много. Я перед этим снизил порог срабатывания до 0.5, это и позволило мне своевременно среагировать. Нагрузка была примерно 1-1.5, что не позволило бы сработать стандартному триггеру.
Злоумышленники ведут себя очень грамотно. Выражается это в том, что они запускают свои вирусы глубокой ночью, когда администраторы спят. Ты реагируешь только утром, в итоге у вируса есть несколько часов, чтобы сделать то, что от него требуется. За это время можно разослать тысячи спамовых писем.
В общем, получилось такая история. Сервер был каким-то образом заражен. Сначала был запущен вирус, который рассылал спам. После того, как я его удалил, в дело пошла вторая очередь. Вторым вирусом, о котором я рассказываю, оказался криптомайнер. Ниже расскажу, почему я так решил.
Поиск криптомайнера
Долго искать вирус мне не пришлось. По загрузке процессора в htop сразу же были найдены файлы опять же в директории /tmp, которые создавали нагрузку.
Содержание одного из файлов навело на мысль о том, что эти файлы делают:
threads = 1 mine = stratum+tcp://44FpmYtxaYgKSDCt8iuYTGLKfWdPDpi64a38SnfHunFXbkNbnsX473yGcrqhCL3NhZ2MZ9YNpGwPsbxaJULJrSSAFd3Yx8o:x@xmr.crypto-pool.fr:3333/xmr
Как я понял, тут указан один из пулов, куда отправлять намайненное. Я быстро позакрывал лишние процессы и удалил файлы.
Стало очевидно, что надо искать источник заражения и перекрывать его. Сервер явно попал в оборот какой-то ботнет сети. Изначально его использовали для рассылки спама. После того, как я перекрыл эту возможность, на нем стали майнить криптовалюту. И все это происходит ночью, когда я сплю :)
Удаление вируса майнера
У меня каждый день делается бэкап всех сайтов. Я всегда рекомендую его делать не реже, чем раз в сутки. Беглое сравнение файлов на веб сервере и в архиве показало заражение как минимум двух сайтов. Кто из них в итоге был виновником, а может и оба сразу, неизвестно.
Я прогнал сайты антивирусом для веб хостинга ai-bolit. Он показал множество зараженных файлов. Более детальное изучение показало, что они вообще не имеют отношение к сайтам. В определенное время они были загружены на сервер и потом использовались.
Чтобы понять, через какой сайт идет заражение и управление вирусами - смотрите логи сервера. Явным признаком заражения - POST запросы к левым файлам.
5.9.31.30 - - [03/Dec/2017:11:17:57 +0300] "POST /ewcvqw HTTP/1.1" 200 36
Можно банить ip, с которых идут запросы. Но мне кажется, это не даст большого результата. Файлы время от времени меняются, как и ip адреса.
В итоге, я просто загрузил из бэкапа зараженные сайты месячной давности, где не было замечено подозрительных файлов. Если бы у меня не было этих бэкапов, не представляю, сколько бы времени и сил я потратил на вычищение сайтов.
По итогу принял решение разнести все эти сайты по отдельным lxc контейнерам, чтобы обезопасить сам сервер и соседние сайты от заражения. Так я смогу более точно определять источник заражения. К сожалению, более действенного способа по защите старых сайтов от заражения различными вирусами я не знаю.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Интересно, а был бы эффект от "мести"? То есть, оставить вирус, но немножко подправить, чтоб отсылал неверные результаты. Плохо представляю, как работает распределенное вычисление криптовалюты, но если малюсенькая одоля ошибочных данных сводило бы на нет весь процесс вычислений, месть была бы зачетная.
Вряд ли это имеет смысл, так как первое, что нужно сделать - снять нагрузку с сервера, чтобы он мог нормально работать. Генерировать ложные данные себе убыток - сервер то тормозит :) Да и вряд ли это как-то навредит. Это все автоматизировано, работают десятки и сотни серверов. От того, что побьются данные с одного сервера, никакого эффекта не будет.
лол, ктож разрешает запускаться бинарникам из /tmp раздела!!
Отключенный SELinux
Замечания справедливые. Сервак не важный и внимания к нему минимум, я не стал заморачиваться, хотя по факту из-за этого потерял больше времени. Уже готов черновик статьи по защищенному web серверу. Когда опубликую, буду рад замечаниям по существу.
Ждемс ))
Для апача есть mod_ruid2 или suexec, главное правильно настроить...
Я когда то ставил GIT, что бы отслеживать изменения в файловой системе сайтов.
Сейчас все сайты так же разнесены по контейнерам (docker).