Ранее я писал о двух известных сканерах безопасности общего плана rkhunter и CentOS
На “Хабре” так же есть описание организации работы сканера для вебхостинга — maldet. Теперь хотелось бы рассмотреть реализацию приложения для эвристического обнаружения уязвимостей, вирусов и ботнетов для ОС Linux — Antidoto.
Имея итальянское имя, этот открытый проект является детищем русскоязычного разработчика Павла Одинцова pavelodintsov. Это открытый проект и располагается на гитхабе. Одна из причин создания этого сканера, а так же то, что ярко выделяет его перед остальными — сканирование памяти работающей системы на предмет обнаружения запущенного вредоносного программного обеспечения.
Заявлена работа на всех популярных современных Linux-дистрибутивах: Centos 5-6, Debian 5-7, Ubuntu 10-14. В целом, должно работать и на других дистрибутивах, так как проект написан на perl.
Рассмотрим возможности Антидота.
- Поиск не пустых файлов и директорий со странными названиями (пробелы, точки) в публично доступных директориях (/tmp, /var/tmp)
- Поиск не пустых файлов с заданиями планировщика для пользователей apache, www-data (/var/spoo/crontabs, /var/spool/cron)
- Уведомление об отсутствующих файлах с информацией о последних авторизациях (/var/log/btmp, /var/log/wtmp)
- Поиск процессов, чьи исполняемые файлы отсутствуют
- Обнаружение популярных вредоносных программ в памяти по md5-хэшам
- Обнаружение подозрительного ПО, использующего udp/tcp-порты (irc, прокси, контроллеры ботнета)
- Обнаружение подключений к удаленным серверам с ненормальным количеством тредов (от 5 и выше)
- Обнаружение процессов, отличающиеся по архитектуре от системы, используемой на сервере
- Обнаружение процессов, которые запущены из файлов, собранных статически (бинарные файлы, включающие все зависимые компоненты)
- Обнаружение процессов, которые были запущены с использованием LD_PRELOAD, запущенных из файлов с битами SUID, SGID
Antidoto может быть запущен в режиме аудита, который используется в качестве замены сразу нескольких программ: netstat, lsof, ss и ps. Так же, может использовать в качестве движка сканирования установленный ClamAV.
Установка и запуск сканера antidoto очень простая, так как для запуска не требуется никаких дополнительных зависимостей. Просто скачивается файл сканера и модуль к нему:
wget -OAntidoto.pl --no-check-certificate https://raw.githubusercontent.com/pavel-odintsov/Antidoto/master/Antidoto.pl
wget -OAntidoto.pm --no-check-certificate https://raw.githubusercontent.com/pavel-odintsov/Antidoto/master/Antidoto.pm
perl Antidoto.pl
Помимо сканера проверки файлов, есть сетевой сканер, который входит в комплект Antidoto.
wget -OAntidoto.pm --no-check-certificate https://raw.githubusercontent.com/pavel-odintsov/Antidoto/master/Antidoto.pm
wget -Olinux_network_activity_tracker.pl --no-check-certificate https://raw.githubusercontent.com/pavel-odintsov/Antidoto/master/linux_network_activity_tracker.pl
perl linux_network_activity_tracker.pl
Далее рассмотрим практическое использование Antidoto на сервере под управлением CentOS на котором расположено некоторое количество openvz-контейнеров.
Ни первый скрипт, ни второй не предполагают использование параметров при запуске.
Но у Antidoto.pl есть набор параметров в коде с помощью которых можно откорректировать проверку сетевой активности. Используются булевы значения, поэтому настроить не особо сложно.
- compress_forks => 1, при обнаружении форков процесса показывать только один процесс
- show_process_information => 1, выводить информацию о найденных процессах
- show_open_files => 1, выводить в отчет открытые файлы приложений
Следующий блок будет полностью посвещен TCP-соединениям
- show_tcp => 1, выводить любую информацию, относящуюся к TCP
- show_whitelisted_listen_tcp => 1, выводить списком прослушиваемые сокеты, находящиеся в белом списке
- show_listen_tcp => 1, выводить список слушающих TCP-сокетов
- show_client_tcp => 1, выводить список TCP-сокетов клиентов
- show_local_tcp_connections => 1, отобразить информацию о локальных TCP-соединениях
Последний блок аналогичный предыдущему, но относится к UDP
- show_udp => 1,
- show_whitelisted_listen_udp => 1,
- show_listen_udp => 1,
- show_client_udp => 1,
- show_local_udp_connections => 1,
Запустив скрипт на родительском сервере я получил следующие данные
# perl Antidoto.pl
We got warning about process from CT: 115: 'Programm is x86 on container with arch x86_64 Probably it's an malware!'
pid: 48998 name: 3proxy ppid: 30919 uid: 13 gid: 13 CT: 115
exe path: /home/proxy/bin/3proxy
cwd: /
cmdline: /home/proxy/bin/3proxy /home/proxy/conf/main.cfg
We found a file with suspicious name .crontab.kVBjzc.swp in CT 485 in directory: /vz/root/485/tmp
We got warning about process from CT: 485: 'it running manually from NOT root user and it's very dangerous'
pid: 927381 name: AchievementSave ppid: 925991 uid: 501 gid: 502 CT: 485
exe path: /home/0xp_servers/prop_hunt2/serverfiles/srcds_linux
cwd: /home/0xp_servers/prop_hunt2/serverfiles
cmdline: ./srcds_linux -game garrysmod -strictportbind -ip 192.168.0.2 -port 27015 +host_workshop_collection -authkey +clientport 27008 +tv_port 27023 +map cs_office +servercfgfile prop_hunt2.cfg -maxplayers 32 +gamemode prop_hunt -tickrate 33
Как мы видим, при проверке сервера был выявлен подозрительный файл во временной директории контейнера 485 и несоответствие архитектуры запущенного процесса 3proxy.
К счастью, на сервере не обнаружено никакого вредоносного ПО.
Перейдем к рассмотрению режима диагностики (аудита) сервера, который представлен отдельным скриптом — linux_network_activity_tracker.pl
Его преимущества в том, что он заменяет сразу несколько утилит: netstat, lsof, ss и ps и предоставляет в качестве результата проверки удобочитаемый вывод информации. Как и Antidoto, просто запускаем скрипт на родительском сервере с контейнерами
# perl linux_network_activity_tracker.pl
Container's 15675 process 415528 connected to the DANGER tcp port 6667 to the server 192.169.0.2
Container's 15675 process 415530 connected to the DANGER tcp port 6667 to the server 192.169.0.2
Container's 29419 process 174494 listens DANGER tcp port 9050
Как видно из полученной информации, скрипт аудита обнаружил в одном контейнере подключения к 6667 порту (это наиболее популярный порт для подключения к IRC и управления ботами), а в другом -приложение, ожидающее подключение на 9050 порт. При дальнейшем рассмотрении, это оказалась socks-прокси.
Другие статьи про сканеры безопасности и уязвимостей:
Автор: vadim_s_sabinich