Вирусы на серверах компании — как это бывает?

Всем привет! В свободное от не-работы время я CTO собственной компании (DigitalWand), и как следствие — чем мне только ни приходится заниматься! И вот недавно один из наших клиентов посетовал на проблемы в своей внутренней кухне: мол, вирус положил внутренние сервисы, включая git и площадки для разработки. И тут мне вспомнилась собственная аналогичная проблема, которая произошла год тому назад. Вот эту страшилку и хотел бы рассказать. Думаю, будет полезна как начинающим сисадминам и девопсам, так и вообще людям, которые каким-то боком с линуксовыми серверами связаны.

Image by pikisuperstar on Freepik

Image by pikisuperstar on Freepik

Об атаках на сервера вообще

Прежде всего оговорюсь, что я не являюсь каким-либо узкоспециализированным экспертом в области безопасности, ну и даже просто мой уровень DevOps / Sysadmin оставляет желать лучшего. Так, нахватался знаний по ходу дела. Да и потом, когда возникает ситуация «никто кроме нас» — уже не вариант отмахиваться, мол, не мой профиль…

Мотивы

По моим наблюдениям, сервера и сайты совершенно разных компаний постоянно «утюжат» робо-хакеры в поисках дыры, через которую можно пролезть. Так что даже если конкретно сегодня вы уверены, что всё идеально настроили и ваша система как неприступная цитадель — не переживайте, пройдёт месяц, другой, вы поставите себе какой-то новый софт, подкрутите конфиги, пропустите обновление — и вот уже «входная дверь» для зловреда открыта, осталось только дождаться, когда он её найдёт.

Большинство зловредов, с которыми я сталкивался — относительно безобидные в том плане что не ставят перед собой цели украсть данные, шифровать диски, вымогать деньги и т.п. Наоборот, чаще всего они занимаются массовыми почтовыми рассылками или пытаются майнить на свободных ресурсах ваших серверов. И не привлекать к себе лишнего внимания. Так что, возможно, ваша система полна такими «невидимыми сусликами», а вы просто об этом не знаете. Заражают и работают такие зловреды тоже, как правило, в автоматическом режиме — если бы был за ними живой человек-оператор, заинтересованный в том, чтобы гарантированно вас уничтожить, то шансов вылечиться было бы значительно меньше.

Симотомы

Как опознать заражение «невооруженным глазом»? Прежде всего, ваш хостинг-провайдер может выслать вам через техподдержку уведомление о подозрительном траффике, и разбор этой проблемы не стоит откладывать в долгий ящик. Второй момент: вы можете заметить периодическую недоступность ранее стабильно работавших сервисов, замедление открытия сайтов на хостинге, на дисках может начать заканчиваться место без особой причины. Если заметили что-то такое — это в целом повод заглянуть на сервер, открыть монитор процессов и хотя бы поверхностно посмотреть, а что это такое сейчас грузит систему? Сколько времени работает процесс, кто его создал, на что даёт нагрузку: диск, процессор или сеть? Знаете ли вы, что это за процесс? Какую функцию он выполняет? А нужны ли вашей инфраструктуре эти функции? Что будет, если процесс положить — перезапустится ли он сам через какое-то время, перестанет ли в вашей системе при этом работать какая-то важная функция?

Надо понимать, что название процесса не будет говорить само за себя, типа exploit.sh или virus.bin. Вероятнее всего это будет либо случайный набор букв, либо название продублирует имя какого-то существующего полезного сервиса.

Лечение

Как вылечиться от такого вторжения? Тут всё индивидуально, прям универсального решения нет. Могу наверняка сказать только то, что просто остановить процессы и удалить вызвавшие их файлы может быть недостаточно. Даже, скорее всего, это и не произведёт особого эффекта: вероятно, «зловред» где-то в системе уже успел прописать скрипт своего самовосстановления, и через какое-то время проявит себя снова. Так что нужно тщательно проверить все операции, исполняемые по таймеру, несколько дней внимательно понаблюдать за происходящим. Ну и поставить обновления, конечно.

Наш случай

А теперь, собственно, что случилось конкретно у нас и как мы от этого вылечились. Далее будет довольно много технических деталей, и без них тут никак — иначе не получится в полной мере оценить всё коварство и изящество, с которым подходят к взлому.

Первый звоночек, что что-то идёт не так — посыпались письма с ошибками с зараженных серверов. При этом ошибки слал не наш мониторинг, а простые внутрисистемные уведомления о том, что команда в консоли завершилась с ошибкой и т.п. И падали они не на специальный ящик, а на какие-то несуществующие — благо, у нас была настроена специальная почта, на которую собирались все сообщения, отправленные на несуществующий ящик. Вот пример:

Очень странное письмо

Очень странное письмо

Я был на куче созвонов и забил. Так бы и лег спокойно спать, если бы dev сервер не лёг раньше меня. За вечер нам с админом удалось кое-что раскопать, но по итогу сервера на ночь вообще отключили (хорошо, что мы могли себе это позволить!)

Итак, характерные черты «заразы»:

  1. Она удаляет содержимое crontab и прописывает туда запуск своих скриптов

  2. Она прописывает запуск своих скриптов при запуске системы, в /etc/rc.d

  3. Пишет в hosts какие‑то домены про блокчейн

  4. Сносит все iptables, ищет и удаляет точечно какие‑то программы, которые, видимо, потенциально могут помешать работе «вируса» или обнаружить его.

  5. Запускает кучу инстансов какого‑то процесса bbp, причем новые инстансы будут появляться быстрее, чем удаляешь их руками.

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

  7. Создаёт пользователя под благовидным логином system и выдаёт ему права на sudo

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

В общем, я делал несколько подходов к очищению, и несколько раз казалось, что система уже свободна от вирусов, но минут через 20 он снова появлялся… Пришлось внимательно читать скрипты вируса, благо это простой bash. По итогу сформировал вот такую инструкцию для «борьбы»:

  1. Во-первых, не надо пытаться убить процессы. Это бессмысленно, новые всё равно вылезут.

  2. service crond stop —  всё равно кронтаб весь перетёрт

  3. chattr -ia /var/spool/cron/root  после чего можно удалить мусор из крона

  4. удалил пользователя system

  5. прописал exit 0 в файл /etc/rc.local

  6. chattr +i /etc/rc.local

  7. убил процессы eid2jfhp4j (или похожие, со странным рандомным именем)

  8. rm -rf /tmp/bbp; touch /tmp/bbp; chattr -i /tmp

  9. rm -rf /opt/bbp; touch  /opt/bbp; chattr +i /opt/bbp

  10. rm -rf /var/tmp/bbp; touch /var/tmp/bbp; chattr -i /var/tmp/bbp

  11. useradd system  --shell=/bin/false --no-create-home — скрипт в вирусе пытается создать системного пользователя. Но не проверяет его наличие. Так что если нет уверенности, что машина полностью «обеззаражена» — лучше создать этого юзера самому, и сразу кастрировать его по правам.

  12. зачистил /etc/hosts от вот этого:

    Забитый мусором и бесконечно растущий /etc/hosts

    Забитый мусором и бесконечно растущий /etc/hosts

  13. добавил туда 127.0.0.1 privatekeysweeper.cf

  14. chattr +i /etc/hosts

  15. переименовать команду ssh — для уверенности, что другие машины не будут заражены.

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

Принцип действия

Вирус состоит из нескольких bash скриптов. Неплохо отрефакторенных, кстати говоря — для баша!

© Habrahabr.ru