
The Web Exploit Detector — это приложение на Node.js, используемое для обнаружения возможных заражений, вредоносного кода и подозрительных файлов в средах веб-хостинга.

Детектор веб-эксплойтов — это приложение на Node.js (и NPM-модуль), используемое для обнаружения возможных заражений, вредоносного кода и подозрительных файлов в средах веб-хостинга. Это приложение предназначено для запуска на веб-серверах, обслуживающих один или несколько сайтов. Запуск приложения генерирует список файлов, которые потенциально заражены, вместе с описанием заражения и ссылками на онлайн-ресурсы, связанные с ним.
Начиная с версии 1.1.0 в приложение также включены утилиты для создания и сравнения снимков структуры каталогов, что позволяет пользователям видеть, были ли файлы изменены, добавлены или удалены.
Приложение размещено здесь, на GitHub, чтобы другие могли извлечь из него пользу, а также чтобы другие могли внести свои собственные правила обнаружения.
Самый простой способ установить Web Exploit Detector — установить его как глобальный NPM-модуль:
npm install -g web_exploit_detector
Если вы используете Linux или другую Unix-подобную ОС, возможно, вам потребуется выполнить эту команду от root (например, sudo npm install -g web_exploit_detector).
Модуль следует регулярно обновлять, чтобы все новейшие правила обнаружения были на месте. Запуск вышеуказанной команды всегда загружает последнюю стабильную (протестированную) версию. Чтобы обновить уже установленную версию, просто выполните следующее:
npm update -g web_exploit_detector
Опять же, возможно, вам придётся использовать команду sudo, как указано выше.
Вы также можете клонировать Git-репозиторий и запустить скрипт напрямую, следующим образом:
git clone https://github.com/polaris64/web_exploit_detectorcd web_exploit_detectornpm installЕсли вы установили Web Exploit Detector как NPM-модуль (см. выше), то запуск сканера осуществляется простой командой с указанием пути к вашему веб-руту (расположению файлов вашего сайта):
wed-scanner --webroot=/var/www/html
Доступны и другие параметры командной строки — просто выполните wed-scanner --help, чтобы увидеть сообщение справки с их описанием.
Запуск скрипта таким образом выводит удобочитаемый результат в консоль. Это очень полезно, например, при запуске скрипта через cron, так как вывод можно отправлять по электронной почте при каждом выполнении скрипта.
Скрипт также поддерживает запись результатов в более удобный для машинной обработки формат JSON. Чтобы включить этот вывод, используйте аргумент командной строки --output.
Просто вызовите скрипт через node и укажите путь к вашему веб-руту следующим образом:
node index.js --webroot=/var/www/html
Web Exploit Detector также включает две утилиты, помогающие выявить файлы, которые могли неожиданно измениться. Успешная атака на сайт обычно включает удаление файлов, добавление новых или изменение существующих файлов тем или иным способом.
Снимок (как он используется в этих утилитах) — это JSON-файл, который перечисляет все файлы, а также содержит описание их содержимого на момент создания снимка. Если снимок был создан, например, в понедельник, а затем сайт был атакован во вторник, то последующее сравнение этого снимка с текущими файлами сайта покажет, что один или несколько файлов были добавлены, удалены или изменены. Таким образом, цель этих утилит — позволить создавать эти снимки и выполнять сравнения при необходимости.
Снимок хранит путь к каждому файлу вместе с SHA-256 хешем содержимого файла. Хеш, или дайджест, — это краткое представление сообщения, которым в данном случае является содержимое файла. Если содержимое файла изменяется, даже совсем незначительно, хеш становится полностью другим. Это хороший способ обнаружения любых изменений содержимого файла.
Следующие две утилиты также устанавливаются как часть Web Exploit Detector:
wed-generate-snapshot: эта утилита позволяет создать снимок для всех файлов (рекурсивно) в каталоге, указанном с помощью --webroot. Снимок будет сохранён в файл, указанный в опции --output.wed-compare-snapshot: после создания снимка его можно сравнить с текущим содержимым того же каталога. Снимок для проверки указывается с помощью опции --snapshot. Базовый каталог для проверки хранится внутри снимка, но если базовый каталог изменился с момента создания снимка, можно использовать опцию --webroot.Снимки можно создавать так часто, как это необходимо, но, как правило, их следует создавать, когда сайт находится в чистом (не заражённом) состоянии и когда были внесены легитимные изменения. Для сайтов на CMS, таких как WordPress, снимки следует создавать регулярно, так как новые загрузки приведут к тому, что новое состояние будет отличаться от сохранённого снимка. Для сайтов, файлы которых никогда не должны меняться, можно создать один снимок и затем использовать его бессрочно, чтобы убедиться, что на самом деле ничего не меняется.
Скрипт src/web-exploit-detector.js является ES6-модулем, который экспортирует набор правил как rules, а также ряд функций:
executeTests(settings): выполняет проверку эксплойтов на основе переданного объекта settings. Использование — смотрите в скрипте index.js.formatResult(result): принимает один результат теста result из массива, возвращённого executeTests(), и генерирует строку с результатами, готовую к выводу для этого теста.getFileList(path): возвращает массив файлов из базового пути path, используя readDirRecursive().processRulesOnFile(file, rules): обрабатывает все правила из массива rules для одного файла file (строковый путь).readDirRecursive(path): рекурсивная функция, которая возвращает Promise, разрешаемый массивом всех файлов в и подкаталогах.Скрипт src/cli.js — это простой интерфейс командной строки (CLI) к этому модулю, используемый скриптом wed-scanner, поэтому его чтение покажет один из способов использования этого модуля.
Проект использует Babel для компиляции ES6-модулей из "src" в обычные JavaScript-модули в "lib". Если вы используете старую версию Node.js, модули можно подключать через require() из каталога "lib".
Пакет содержит Babel в качестве dev-зависимости и скрипты "build" и "watch:build". При выполнении скрипта "build" (npm run build) ES6-модули из "./src" будут скомпилированы и сохранены в "./lib", откуда они подключаются скриптами CLI.
Каталог "./lib" включён в репозиторий, чтобы любой пользователь мог клонировать репозиторий и запустить приложение напрямую, без необходимости устанавливать dev-зависимости и собирать приложение.
Иногда правила, особенно помеченные тегом suspicion, могут опознать чистый файл как потенциальный эксплойт. Поэтому реализована система, позволяющая исключать файлы из проверки для определённого правила.
Скрипт wed-results-to-exceptions принимает выходной файл основного детектора (см. опцию --output) и позволяет поочерёдно исключать каждый файл для каждого конкретного правила. Все исключённые файлы сохраняются в файле wed-exceptions.json (в домашнем каталоге пользователя), который читается основным скриптом перед запуском сканирования. Если файл указан в этом файле, то все привязанные правила (по ID) будут пропущены при проверке этого файла.
Для получения инструкций по использованию просто выполните wed-results-to-exceptions. Предварительно вам понадобится выходной JSON-файл от предыдущего запуска основного детектора с использованием опции --output.
Для пользователей, работающих напрямую с Git-репозиторием, выполните node results_to_exceptions.js в корневом каталоге проекта.
Приложение работает с использованием набора "правил", которые загружаются при запуске. Каждое правило состоит из ID, названия, описания, списка URL, тегов, флага устаревания и, что самое важное, набора тестов.
Каждый отдельный тест должен быть одним из следующих:
Поддерживаются следующие типы тестов:
Поскольку веб-эксплойты постоянно развиваются и создаются новые, набор правил также необходимо обновлять. Поскольку я хочу несколько сайтов, я постоянно наблюдаю новые виды эксплойтов и буду добавлять новые правила по мере возможности. Я запускаю этот инструмент на своих серверах, поэтому, конечно, хочу, чтобы он был максимально функциональным!
Это подводит меня к причинам, по которым я сделал это приложение доступным в виде проекта с открытым исходным кодом: во-первых, чтобы вы и другие могли извлечь из него пользу, а во-вторых, чтобы мы все могли совместно добавлять правила обнаружения, чтобы приложение всегда было актуальным.
Если вы обнаружили эксплойт, который не обнаруживается этим инструментом, сообщите мне об этом или, что ещё лучше, напишите собственное правило и добавьте его в сторонний набор правил (rules/third-party/index.js), а затем отправьте мне pull request.
Не волнуйтесь, если вы не знаете, как писать свои правила; самое главное — чтобы правило было добавлено, поэтому не стесняйтесь отправлять мне как можно больше информации об эксплойте, и я постараюсь создать для него своё правило.
Правила сгруппированы, но самый простой способ добавить своё правило — это добавить его в упомянутый выше сторонний набор. ID правил записываются в следующем формате: "author:type:sub-type(s):rule-id". Например, одно из моих правил — "P64:php:cms:wordpress:wso_webshell". "P64" — это я (автор), "php:cms:wordpress" — это группировка (правило, специфичное для PHP, для системы управления контентом (CMS) WordPress), а "wso_webshell" — это конкретный ID правила. При написании собственных правил старайтесь следовать этому формату и замените "P64" на своё имя пользователя GitHub или другой уникальный идентификатор.
Проект содержит набор тестов Jasmine, которые можно запустить с помощью npm test. Также присутствует конфигурация ESLint, и ESLint можно запустить с помощью npm run lint.
Во время разработки тесты можно запускать при каждом изменении исходного файла, выполнив npm run watch:test. Для запуска тестов и ESLint можно использовать скрипт npm run watch:all.
Обратите внимание, что, если у вас ещё не установлены Jasmine и/или nodemon, вам следует выполнить npm install в непродуктивном режиме, чтобы убедиться, что dev-зависимости установлены.
Спасибо пользователю Reddit mayupvoterandomly за предложение функциональности снимков каталогов, добавленной в версии 1.1.0, а также за предложение новых правил, которые будут добавлены в ближайшее время.
Лицензия ISC
Copyright (c) 2017, Simon Pugnet
Настоящим предоставляется разрешение любому лицу, получившему копию данного программного обеспечения и связанных с ним файлов документации ("Программное обеспечение"), безвозмездно использовать Программное обеспечение без ограничения, включая, без ограничения, права на использование, копирование, изменение, слияние, публикацию, распространение, сублицензирование и/или продажу копий Программного обеспечения, а также разрешать лицам, которым предоставляется Программное обеспечение, делать это при соблюдении следующих условий:
Вышеуказанное уведомление об авторских правах и данное уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ» БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОР НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ИНЫЕ ОБЯЗАТЕЛЬСТВА, КАК В ИСКЕ О НАРУШЕНИИ ДОГОВОРА, ГРАЖДАНСКОМ ПРАВОНАРУШЕНИИ ИЛИ ИНЫМ ОБРАЗОМ, ВОЗНИКШИЕ ИЗ ИЛИ В СВЯЗИ С ИСПОЛЬЗОВАНИЕМ ИЛИ ПРОИЗВОДИТЕЛЬНОСТЬЮ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ.
path