Пользователь
0,0
рейтинг
19 сентября 2013 в 11:42

Администрирование → Linux Malware Detect — антивирус для веб-серверов из песочницы



Интернет уже не тот, что прежде — кругом враги. Тема обнаружения непосредственного заражения сайта и поиска вредоносных/зараженных скриптов на взломанном сайте рассмотрена слабо, попробуем это исправить.
Итак, представляем вашему вниманию Linux Malware Detect.

Linux Malware Detect (LMD) — это сканер для Linux, предназначенный для поиска веб-шеллов, спам-ботов, троянов, злонамеренных скриптов и прочих типичных угроз характерных для веб-пространств и особенно актуален для виртуальных шаред-хостинг платформ. Главное отличие от прочих Linux-антивирусов — его веб направленность, сканирование файлов веб-сайтов, ведь обычные антивирусы ориентируются на более глобальные угрозы уровня системы.

Что умеет


  • Поиск угроз по базе MD5 и распознавание типа угрозы (например, php.cmdshell.nan.296.HEX) по HEX-базе.
  • Статистический анализ файлов на наличие обфусцированных зловредов и инъекций.
  • Обнаружение установленного в системе ClamAV для использования его в качестве сканера.
  • Ручное и автоматическое (по крону) обновление сигнатур.
  • Ручное и автоматическое обновление версии самого скрипта.
  • Возможность сканирования недавно добавленных/измененных файлов (например за последние 2 дня).
  • Опция загрузки обнаруженных потенциальных угроз на официальный сайт для анализа.
  • Система отчетов.
  • Очистка файлов от вредоносных инъекций.
  • Крон-заготовки для запуска регулярного сканирования юзерспейсов или других директорий.
  • Наборы исключений по расширениям, сигнатурам и путям.
  • Возможность отправки результатов сканирования на e-mail.
  • Мониторинг в реальном времени созданных/модифицированных/измененных файлов при помощи inotify_watch: мониторинг выбранных пользователей, каталогов или файлов.
  • … и прочее.


Как это работает


Сканирование происходит с использованием собственного скрипта на базе grep, а если в системе установлен ClamAV — то при помощи clamscan. Аналогично с сигнатурами: программа имеет свою базу сигнатур, если же в системе установлен ClamAV, то использует дополнительно и его базу.

Источники сигнатур:

  1. Срез данных сети. Разработчик LMD является администратором хостинга на 35.000 сайтов, данные ежедневно анализируется и обрабатываются. Основной источник сигнатур.
  2. Данные сообщества собранные с антималвар-сайтов.
  3. ClamAV, взаимообмен сигнатурами.
  4. Данные, присылаемые пользователями.


Сигнатуры обновляются практически ежедневно, RSS-лента с обновлениями сигнатур присутствует на официальном сайте.

Результаты сканирования сохраняются в файл, а также могут высылаться на указанный в конфиге e-mail. Интеграции с популярными панелями управления, увы, нет, если же вы хостер — сообщения клиентам придется рассылать вручную.

Интеграция с популярными панелями ISPmanager и Cpanel была бы неплохим вкладом в сообщество (это в случае если кто желает).

Что это дает


  • Позволяет следить за безопасностью ваших сайтов на VDS и DS.
  • Хостерам — ежедневное сканирование и рассылка предупреждений клиентам позволит повысить лояльность клиентов, которые, зачастую, очень далеки от знания кодинга и основ безопасности.
  • Если ваш сайт или сайт клиента будет взломан — вы узнаете об этом либо сразу (если включен мониторинг в реальном времени), либо в течении периода, выбранного для cron-сканирования. Ведь «предупрежден — значит вооружен»: зараженные сайты чаще всего становятся источниками рассылки спама со всеми вытекающими (например, блеклистинг IP в DNSBL).

Типичные примеры обнаружений


Отчет о сканировании выглядит следующим образом:
malware detect scan report for servername:
SCAN ID: 090913-1000.17637
TIME: Sep 9 16:04:40 +0300
PATH: /var/www
RANGE: 2 days
TOTAL FILES: 151224
TOTAL HITS: 5
TOTAL CLEANED: 0

{HEX}php.cmdshell.unclassed.344 : www/user1/data/www/example.com/wp-content/plugins/7ja1i/nxeogyqbd3h.php
{HEX}php.cmdshell.cih.215 : /var/www/user1/data/www/example.com/xyiznwsk/info.php
{CAV}PHP.Trojan.Spambot : www/user1/data/www/example.com/wwp-content/plugins/customize-admin/bannerTQIz.php
{HEX}php.nested.base64.513 : /var/www/user1/data/www/example.com/engine/modules/topnews.php
{HEX}base64.inject.unclassed.6 : /var/www/user1/data/www/example.com/wp-content/plugins/wpematico/app/settings_page.php 
{HEX}gzbase64.inject.unclassed.14 : /var/www/user1/data/director/example.com/wp-content/themes/zenith/404.php


Установка


Качаем:
wget http://www.rfxn.com/downloads/maldetect-current.tar.gz

Распаковываем:
tar -zxvf maldetect-current.tar.gz

Запускаем установку:
sh ./install.sh


При запуске install.sh программа установки размещает файлы LMD в /usr/local/maldetect, заносит исполняемый скрипт в /usr/local/sbin и libinotifytools.so.0 в /usr/lib.

В процессе инсталляции автоматически создаются ежедневные крон-задания для обновления сигнатур и запуска сканирования. По умолчанию в конфигурации указаны типичные пути для сканирования вебспейсов популярных панелей управлений, таких как ensim, psa, DirectAdmin, cpanel, interworx и дефолтных apache-путей размещения сайтов (/var/www/html, /usr/local/apache/htdocs). Для ISPmanager путь /var/www/ придется добавлять вручную.

Настройка


Конфиг LMD находится в файле /usr/local/maldetect/conf.maldet.
Конфиг хорошо документирован и позволяет настроить все, что душе угодно.

На заметку:


ionice -c 3 добавленный к строкам запуска скриптов по поиску и сканированию файлов поможет предотвратить нагрузку на дисковую подсистему выставив наинизший приоритет i/o.

В файле /usr/local/maldetect/maldet
находим:
find="$find"

меняем на:
find="ionice -c 3 $find"

находим:
clamscan="$clamscan"

меняем на:
clamscan="ionice -c 3  $clamscan"

Стоит отметить, что данное решение — своего рода «костыль», данную опцию стоит добавить в апстрим.

Типичные команды


Запускаем сканирование указанного каталога:
# maldet -a /home/user1/exapmle.com


По окончанию получаем результат вида:
maldet(24128): {scan} scan completed on example.com: files 4, malware hits 0, cleaned hits 0
maldet(24128): {scan} scan report saved, to view run: maldet --report 091713-1715.24128


Смотрим отчет:
#maldet --report 091713-1715.24128


Принудительно обновляем базы с rfxn.com:
#maldet -u


Принудительно обновляем версию с rfxn.com:
#maldet -d


Сканируем все изменные за последние X дней файлы (в данном случае 2) в указанном каталоге
#maldet -r /home/user1/ 2


Отправляем неизвестную уязвимость на rfxn.com:
#maldet -c /home/user1/file.php


Помещаем в карантин результаты сканирования SCANID (id из результатов сканирования)
#maldet -q 091713-1715.24128


Пытамся очистить результаты сканирования
#maldet -n, --clean 091713-1715.24128


Программа распространяется по лицензии GNU GPLv2.
Официальная страничка проекта: http://www.rfxn.com/projects/linux-malware-detect Linux Malware Detect.

Имею опыт использования и настройки, на все вопросы с удовольствием отвечу в комментариях.
@vlad7rpk
карма
8,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (47)

  • 0
    Замечу, что если у вас лежит не в тех местах, где крон ждёт, лучше сделать копию крона и настроить вручную, а не патчить оригинал — оригинал перезаписывается при автоапдейте.
  • 0
    Находит ли простейшие шеллы?
    @passthru($_GET['cmd']);

    Находит ли подозрительные файлы (Допустим обфусцированные php,js скрипты) или считает их подозрительными?
    И наконец, если у клиента стоит какая-то проприетарщина (обфусцированная), то как решать эту проблему?
    • 0
      Если в базе есть, то находит. А так нет.
      Новые шелы, или обфусицированные, не находит. Хотя когда джумло/вордпресс ламают, то шелы заливают не один скрипт-киддис, и одни заливают старые шелы (с99 тот-же старый), и maldet срабатывает. Заходишь в папку и наблюдаешь еще парочку неопределяемых шелов. Обычно сразу их отправляю на рассмотрение [maldet -c shell.php]
    • +1
      Находит ли простейшие шеллы?
      @passthru($_GET['cmd']);

      Кастомные шеллы, как этот, LMD не находит, т.к. он ищет совпадения по базе сигнатур. В нем нет анализа кода, если шелла нет в базе и в нем нет обфускации — он его не найдет.
      Находит ли подозрительные файлы (Допустим обфусцированные php,js скрипты) или считает их подозрительными?

      Считает их подозрительными обозначая, например, как base64.inject.unclassed
      И наконец, если у клиента стоит какая-то проприетарщина (обфусцированная), то как решать эту проблему?

      Ложных срабатываний, например на ZendIoncube-кодированных файлов замечено небыло.
      • +1
        Кстате по поводу LMD (названия). Очень очень давно был конструктор вирусов — LMD (Lamer Death). :)
  • –1
    Нда, тогда какой толк от не? взяв любой шелл и дописав в него print ""; — мы обойдем защиту.
    Далее, попробовал просканить каталоги, потом поменял сожерижмое файла и запустил maldet -r /home/user1/ 2 — измененные файлы оно мне не показало. Что я сделал не так?
    • +1
      В сигнатуре идет определение по одной из строк шелла — по уникальной строке, которя позволяет его распознать и не спутать ни с чем другим. Добавление лишней строки не помешает обнаружить вирус.
      измененные файлы оно мне не показало. Что я сделал не так?

      Либо у Вас не работает find /path -mtime, либо файла нет в сигнатурах.
  • +2
    Для FreeBSD нет? (
    • 0
      К сожалению, опыта использования на FreeBSD нет.
    • 0
      Пробовали на фряхе запускать, геморой, завязано на линукс-специфичные либы…
      • +1
        Пока нагуглил что вроде кто-то запускал, проблемы решились установкой баша и изменением путей до него…
        Этого недостаточно на самом деле?
        • +1
          Попробовал сейчас, с поставленным и слинкованным в /bin/ башем поставилось, запускается, но что-то на скорую руку написанные бэкдоры и eval'ы оно никак не реагирует :) Ну его нафиг, буду и дальше по старинке egrep использовать :)
          • 0
            На счет кастомных шеллов ответ Выше
            На такой случай лучше подойдет AIBolit
  • +1
    Можно их в купе с AI-BOLIT'ом использовать (http://revisium.com/ai/).
    • 0
      Ка кто пробовал это творение, у меня он подсветил кучу файлов в которых ни каких проблем не было. Сидеть и разгребать пару сотен подсвеченных файлов, то еще извращение.
      • 0
        При сканировании нужно использовать whitelist — файл для конкретной CMS, он убирает большинство ложных срабатываний.
      • 0
        Недавно лечил человеку сайт, айболит вывалил кучу ложных срабатываний, невзирая на whitelist. И парочку стандартных шеллов. А egrep -r «eval|GET.*cmd » * нашел кучу зараженных бекдорами скриптов, про которые айболит ну слухом, ни духом…
  • 0
    А если скрипт в БД лежит?
  • 0
    Если это — репо проекта, то я не вижу исходников для поставляемых бинарей (inotifywait, libinotifytools.so.0). Нету их и в tar.gz. Это какой-то contrib?
    • 0
      Откуда эти бинари — хороший вопрос. Следует спросить об этом автора.
    • +1
      Эти бинари находятся в пакетах inotify-tools и libinotifytools0 в Debian/Ubuntu, возможно автор их просто взял оттуда.
  • +9
    Господа, не знаю, насколько хорош сам продукт, но его установка — это тихий ужас, который нужно срочно фиксить, иначе никто кроме авторов им пользоваться не сможет.

    Во-первых, вместо переписывания текущей системной библиотеки /usr/lib/libinotifytools.so.0 непонятно какой версией (и как скомпилированной) просто пропишите в README зависимость от пакета inotify-tools (https://github.com/rvoicilas/inotify-tools). В Gentoo он ставится штатно через emerge sys-fs/inotify-tools, думаю в других дистрибутивах этот пакет тоже есть. Ну и таскать свой бинарник inotifywait отпадёт нужда.

    Во-вторых избавьтесь от прошитого в куче мест (не только в install.sh, но и в файлах приложения) пути /usr/local/maldetect — нормальные люди всё-равно предпочтут устанавливать приложение через пакетный менеджер своего дистрибутива, а не install.sh. А разработчики пакетов для дистрибутивов предпочтут устанавливать все файлы в стандартные каталоги вроде /usr/bin/ и /etc/ — так что приложение должно быть готово либо найти свои файлы в стандартных каталогах либо брать пути к ним из конфига.

    Далее, определитесь с названием продукта — maldet или lmd, какой смысл устанавливать два идентичных бинарника (точнее, бинарник и симлинк, но это не важно). Или при вызове с именем lmd приложение работает не так, как при вызове как maldet?

    Про логику «обновления» в install.sh я лучше вообще промолчу. Возможно я чего-то не понимаю, но выглядит это дико и беспощадно: вечное хранение старых версий в соседних каталогах, удаление симлинка .last перед его созданием (ln это сам умеет делать), повторное создание симлинков в /usr/local/sbin/ (интересно, а почему эти решили не удалять перед созданием), копирование старых файлов из tmp/ (что, новая версия действительно нуждается в старых tmp/* файлах и без них будет работать некорректно?).
    • 0
      Замечания дельные, но увы — я не разработчик данного продукта.
  • 0
    Нашел у себя «пачку»!
    Спасибо!
  • 0
    maldet(5097): {scan} signatures loaded: 11272 (9400 MD5 / 1872 HEX)
    maldet(5097): {scan} building file list for /var/www/xxx.org.ua, this might take awhile…
    maldet(5097): {scan} file list completed, found 8630 files…
    maldet(5097): {scan} 8630/8630 files scanned: 0 hits 0 cleaned
    maldet(5097): {scan} scan completed on /var/www/xxx.org.ua: files 8630, malware hits 0, cleaned hits 0
    maldet(5097): {scan} scan report saved, to view run: maldet --report 091913-2217.5097

    В моих проектах я ничего не нашел. Приятно!
  • 0
    unistall.sh ещё бы.
    • 0
      Хотя, вроде хватит:

      $ rm -rf  $instpath  /etc/cron.daily/maldet 
      

  • 0
    Блин, мужики, если в скрипте заменить $instpath на $PWD, то ничё устанавливать не нужно.

    public_scan=1 — чтоб не от рута пускать!

    diff -ur maldetect-1.4.2.orig/files/conf.maldet maldetect-1.4.2/files/conf.maldet
    --- maldetect-1.4.2.orig/files/conf.maldet      2013-04-09 11:17:30.000000000 +0400
    +++ maldetect-1.4.2/files/conf.maldet   2013-09-21 18:59:49.000000000 +0400
    @@ -95,7 +95,7 @@
     # quarantine, session and temporary paths to faciliate scans.
     # These paths are populated through cron every 10min with the
     # /etc/cron.d/maldet_pub cronjob.
    -public_scan=0
    +public_scan=1
     
     ##
     # [ STATISTICAL ANALYSIS ]
    diff -ur maldetect-1.4.2.orig/files/maldet maldetect-1.4.2/files/maldet
    --- maldetect-1.4.2.orig/files/maldet   2013-04-13 08:58:30.000000000 +0400
    +++ maldetect-1.4.2/files/maldet        2013-09-21 18:58:48.000000000 +0400
    @@ -9,7 +9,7 @@
     ##
     #
     ver=1.4.2
    -inspath=/usr/local/maldetect
    +inspath=$PWD
     cnf=$inspath/conf.maldet
     intcnf=$inspath/internals.conf
     datestamp=`date +"%m%d%y-%H%M"`
    


    есессенно с inotify сами разрулите
  • 0
    А никто не знает, зачем этот троян сливает все к себе на FTP?

    host=ftp.rfxn.com
    user=anonymous
    passwd=anonymous
    upath=incoming
    
    
    ftp -v -n -i $host << EOT
    user $user@rfxn.com $passwd
    prompt
    cd $upath
    lcd $lcd
    binary
    put "$file" "$RANDOM.$$.bin"
    ascii
    put "$file" "$RANDOM.$$.ascii"
    bye
    EOT
    

    • 0
      Опция загрузки обнаруженных потенциальных угроз на официальный сайт для анализа.
      • +1
        Спасибо, я выкачал рекурсивно всю директорию, сижу собираю ваши пароли к базам и сайтам :)


        wget -r ftp://ftp.rfxn.com/incoming/*  
        
        • 0
          Файлы заливаются туда руками через
          #maldet -c /home/user1/file.php
          и если кто-то заливает туда на проверку файлы с паролями — ССЗБ.
          • 0
            Ну вот например один ССЗБ уже есть :)
            Надо просто запустить maldet -c /var/www, где флаг -с описан как checkout, а не send-to-remote-analyses
            • 0
              А разве он что-то загружал на rfxn для проверки?
              Еще раз объясню — скрипт ничего «сам» к себе не сливает.
              Для загрузки файла на проверку нужно вызвать функцию загрузки:
              #maldet -c /home/user1/file.php
              • 0
                Еще раз объясняю, запусти
                maldet --checkout /var/www/ 


                Слово checkout переводится как проверять, а не проверить и если чо отправить на АНБшный сервер. Более того, о таких вещах надо предупреждать и делать доп. флаг (типа --yes ), дабы не спрашивать каждый раз.
            • 0
              -c, --checkout FILE
              Upload suspected malware to rfxn.com for review & hashing into signatures
              • 0
                Нет там такого

                 ./maldet 
                Linux Malware Detect v1.4.2
                            (C) 2002-2013, R-fx Networks <proj@r-fx.org>
                            (C) 2013, Ryan MacDonald <ryan@r-fx.org>
                inotifywait (C) 2007, Rohan McGovern <rohan@mcgovern.id.au>
                This program may be freely redistributed under the terms of the GNU GPL v2
                
                signature set: 201309132982
                usage maldet [-h|--help] [-l|--log] [-e|--report] [-p|--purge] [-c|--checkout]
                [-b|--background] [-m|--monitor] [-k|--kill-monitor] [-a|--scan-all] [-r|--scan-recent]
                [-q|--quarantine] [-s|--restore] [-n|--clean] [-u|--update] [-d|--update-ver]
                

                • 0
                  maldet --help
                  • 0
                    Если автор этой поделки такой элитный UNIXойд, то должен знать, что флаги

                    -a — означает ALL (все дефолтные опции),
                    — именно проверка.
                    -r — рекурсия
                    -q — quiet — тихо, без трейса, только результат или даже без него.
                    -d — daemon, а не -b

                    Единственное с чем он попал это kill и update остальное не Unix-way :)
                    • 0
                      Никаких стандартных значений для этих флагов не предусмотрено, не придумывайте. -с обычно обозначает путь к конфигу или выполняемую команду, но не всегда. -a обозначает иногда все действия по какому-то принципу, но «все дефолтные опции» — это уже нонсенс, дефолтные опции и так уже установлены, -d — всё что угодно, например название базы данных.
              • 0
                Ах да, документацию у нас вообще-то редко кто читает :)
                • 0
                  А зря.
  • +2
    В общем народ, стремная эта штука! Выкачаивайте свои сайты и проверяйте на тестовых компах, дома, на виртуалках…
    На боевой сервер, да ещё и в крон сувать… ну не знаю, я очкую. :)
  • 0
    Собрал пакеты под большинство систем, правильно разложив файлы согласно FHS:
    download.etersoft.ru/pub/Korinf/projects/maldetect/

    Прошу ставить, проверять.
    Проверил на своих сайтах, и с удивлением обнаружил ряд вредных инъекций в код.

    Напоролся, что если clamav установлен, а базы к нему ни разу не скачивались, то проверка молча завершится, не сказав о том, что ничего проверять не стали. При использовании clamav там вызывается clamscan, с указанием, чтобы проверять и по базам clamav и по базам maldet.
    • 0
      под большинство rpm-систем) и ни одной deb-ки
      • 0
        Извините, пропустил. Исправился.
        • 0
          maldetect_1.4.1-eter1ubuntu_all.deb не работает, оно конфиги ищет не в тех местах, куда они ставятся пакетом. И вообще с путями лажа какая-то.

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