В предыдущей моей публикации про сканер уязвимостей rkhunter в комментариях хабрапользователем Indexator был упомянут сканер chrootkit. При схожем функционале c rkhunter, есть ряд отличий, который будет интересно рассмотреть в этой статье. Интересно также то, что совсем недавно была выпущена новая версия сканера, разработка которого казалась замороженной c 2009 года.
Chkrootkit — это сокращение от словосочетания «check rootkit» (поиск руткитов). В свою очередь руткитами называются вредоносные приложения, разработанные для скрытого проникновения на сервер и маскировки под обычные процессы или программы, с целью получения полного доступа на сервер.
Шелл-скрипт chkrootkit разработан в помощь системным администраторам для проверки системы на наличие известных руткитов. Первый же вопрос, который может возникнуть при этой информации: А почему шелл? Почему не perl или bash, как тот же rkunter? Разработчики стремились максимально унифицировать скрипт, чтобы он запускался на всех системах с шеллом. А во времена начала разработки скрипта, тот же perl был далеко не везде.
Суть поиска проста. С помощью системных инструментов типа strings и grep (если быть более точным, то в FAQ на сайте разработчика указан список используемых программ — awk, cut, echo, egrep, find, head, id, ls, netstat, ps, strings, sed, uname) chkrootkit ищет подозрительные участки кода в программах, сравнивает запущенные процессы с информацией из /proc, выявляя расхождения.
Инструмент состоит из некоторого количества модулей, отвечающие за разные методы проверки
- chkrootkit: шелл-скрипт, проверяющий системные бинарные файлы на модификацию руткитами.
- ifpromisc.c: модуль поиска интерфейсов, работающих на перехват пакетов.
- chklastlog.c: модуль, проверяющий на наличие фактов удаления записей из лог-файла lastlog.
- chkwtmp.c: аналогично предыдущему модулю, проверяет лог-файл wtmp.
- chkutmp.c: проверяет лог-файл utmp на наличие следов удаления записей.
- check_wtmpx.c: актуально для ОС Solaris. проверяет факт удаления записей из лога wtmpx.
- chkproc.c: поиск следов известных LKM-троянов (Linux Kernel Module).
- chkdirs.c: поиск следов известных LKM-троянов (Linux Kernel Module).
- strings.c: аналог утилиты strings.
Увы, поиск фактов удаления строк из лог-файлов не гарантирован на все 100%.
На текущий момент последней версией является 0.50 от 4 июня 2014 г. Разработчики обещают работу сканера под FreeBSD начиная с 2.0 и прочих из семейства *BSD, различными дистрибутивами Linux с ядрами от 2.2 и выше, MacOS X, Solaris и другими более экзотичными операционными системами.
В CentOS присутствует версия 0.49 в репозитариях EPEL, в портах/пакетах FreeBSD отсутствует. Для сборки последней версии потребуется установить gcc. На примере CentOS 6.x это будет выглядеть следующим образом:
Установим gcc:
yum install gcc
Скачиваем последнюю на текущий момент версию с официального ftp:
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
Распаковываем:
tar -xzf chkrootkit.tar.gz
Переходим в директорию:
cd chkrootkit-0.50
Собираем модули:
make sense
Запускаем шелл-скрипт:
./chkrootkit
Проверил так же на FreeBSD 10.1 — сборка модулей и проверка прошла без проблем.
В принципе, можно не собирать модули, и тогда на проверках, где требуются дополнительные модули, будут ошибки типа:
Checking `ldsopreload'... can't exec ./strings-static, not tested
Checking `lkm'... not tested: can't exec
Checking `sniffer'... not tested: can't exec ./ifpromisc
Checking `wted'... not tested: can't exec ./chkwtmp
Checking `z2'... not tested: can't exec ./chklastlog
Checking `chkutmp'... not tested: can't exec ./chkutmp
По умолчанию происходит полная проверка системы по всем доступным тестам, список которых можно получить, выполнив скрипт с ключом ‘-l’. К сожалению, мне не удалось найти в документации описание всех тестов, которые могут быть запущены, но это можно обсудить в комментариях.
Обратите внимание, что chrootkit не делает снимок текущих файлов и не сохраняет в своей базе, как тот же rkunter.
В качестве ключей запуска можно указывать какие из тестов запускать
К примеру,
./chkrootkit aliens sniffer
произведет поиск вредоносного кода и запущенных перехватчиков трафика
Сообщения, которые могут быть выданы при сканировании
- not infected — проверка не обнаружила ничего подозрительного
- INFECTED — программа с большой вероятностью относится к руткиту
- not tested — проверка не была произведена (для этой ОС отсутствует возможность проверки, отсутствие модуля проверки, заданы параметры командной строки, отключающие эту проверку)
- not found — программа не найдена и поэтому не проверялась
- Vulnerable but disabled — вероятность того, что приложение является вредоносным велика, но в момент проверки оно было неактивным.
Для регулярной проверки системы, можно добавить выполнение сканирования chkrootkit в планировщик под пользователем root.
crontab -e
@daily /путь/до/chkrootkit | mail -s 'CHROOTKIT Daily Run' почтовый@ящик
Для ежедневного полного сканирования системы всеми доступными модулями и тестами с последующей отправкой отчета на почтовый ящик.
В ISPmanager5 это можно настроить из удобного интерфейса планировщика, который находится в разделе «Система»
Но в силу большой вероятности того, что инфицированная ОС может подменять значения при сканировании, рекомендуется запускать chkrootkit для проверки системы при загрузке сервера в режиме восстановления или с загрузочного live-образа.
В этом случае порядок действий таков:
- загрузиться с live-образа
- скачать последнюю версию chkrootkit
- скомпилировать модули
- подмонтировать разделы диска с (потенциально) инфицированной системой
- провести сканирование chkrootkit -r /mnt/
Официальный сайт проекта: http://www.chkrootkit.org/
PS: Желаю, чтобы на ваших системах всегда chkrootkit выдавал сообщения «nothing found» или «not infected».
Автор: vadim_s_sabinich