
Web Exploit Detector 是一个 Node.js 应用程序(和 NPM 模块),用于检测 Web 托管环境中的可能感染、恶意代码和可疑文件。此应用程序旨在运行在托管一个或多个网站的 Web 服务器上。运行该应用程序将生成可能被感染的文件列表,以及感染描述和相关在线资源的引用。
从 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 模块(见上文),则运行扫描器只需运行以下命令,并传入 webroot 的路径(网站文件的位置):
wed-scanner --webroot=/var/www/html
其他命令行选项可用,只需运行 wed-scanner --help 查看描述这些选项的帮助消息。
以这种方式运行脚本将在控制台生成人类可读的输出。例如,在通过 cron 运行脚本时非常有用,因为输出可以在脚本运行时通过电子邮件发送。
该脚本还支持将结果写入更适合计算机处理的 JSON 格式以供后续处理。要启用此输出,请参阅 --output 命令行参数。
只需通过 node 调用脚本并传递 webroot 路径,如下所示:
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):从 executeTests() 返回的数组中获取单个测试 result,并生成一个结果字符串,准备输出该测试。getFileList(path):返回来自基础 path 的文件数组,使用 readDirRecursive()。processRulesOnFile(file, rules):处理数组 rules 中的所有规则,针对单个 file(字符串路径)。readDirRecursive(path):递归函数,返回一个 Promise,该 Promise 将解析为 path 和子目录中所有文件的数组。src/cli.js 脚本是此模块的简单命令行界面(CLI),由 wed-scanner 脚本使用,因此阅读此脚本可以了解使用此模块的一种方式。
该项目使用 Babel 将“src”中的 ES6 模块编译为“lib”中的普通 JavaScript 模块。如果你运行的是较旧版本的 Node.js,则可以改为从“lib”目录 require() 模块。
该包包含 Babel 作为开发依赖项,以及“build”和“watch:build”脚本。运行“build”脚本(npm run build)时,“./src”中的 ES6 模块将被编译并保存到“./lib”中,CLI 脚本会包含它们。
“./lib”目录包含在仓库中,以便任何用户都可以克隆仓库并直接运行应用程序,而无需安装开发依赖项并构建应用程序。
有时,规则(尤其是标记为 suspicion 的规则)会将干净文件识别为潜在漏洞。因此,还包含一个允许文件被排除在规则检查之外的系统。
wed-results-to-exceptions 脚本从主检测器脚本(参见 --output 选项)获取输出文件,并让您选择依次排除每个文件的每个特定规则。所有被排除的文件都存储在一个名为 wed-exceptions.json 的文件中(位于用户的主目录),该文件在主脚本运行扫描之前被读取。如果文件在此文件中列出,则在检查此文件时将跳过所有附加的规则(按 ID)。
有关用法说明,只需运行 wed-results-to-exceptions。您需要先使用 --output 选项从主检测器获得有效的输出 JSON。对于直接使用 Git 仓库的用户,请在项目根目录中运行 node results_to_exceptions.js。
该应用程序使用一组“规则”运行,这些规则在应用程序运行时加载。每个规则包含一个 ID、名称、描述、URL 列表、标签、弃用标志,以及最重要的,一组测试。
每个单独的测试必须是以下之一:
支持以下测试类型:
由于基于 Web 的漏洞不断演变,并且新的漏洞正在被创建,规则集也需要更新。由于我托管了许多网站,我不断观察到新型漏洞,因此我会尽可能添加规则。我在自己的服务器上运行此工具,因此我当然希望它尽可能功能齐全!
这就引出我提供此应用程序作为开源项目的原因:首先是为了让您和其他人能够从中受益,其次是为了我们都能合作贡献检测规则,使应用程序始终保持最新。
如果您发现此工具未检测到的漏洞,请与我联系让我知道,或者更好的是,编写您自己的规则并将其添加到第三方规则集(rules/third-party/index.js)中,然后向我发送拉取请求。
如果您不知道如何编写自己的规则,请不要担心;最重要的是规则被添加,因此请随意向我发送尽可能多的有关该漏洞的信息,我将尝试为其创建自己的规则。
规则归类,但添加自己规则的最简单方法是将其添加到上面提到的第三方规则集。规则 ID 以以下格式编写:“作者:类型:子类型:规则ID”。例如,我自己的一个规则是“P64:php:cms:wordpress:wso_webshell”。“P64”是我(作者),“php:cms:wordpress”是分组(针对 WordPress 内容管理系统的 PHP 特定规则),“wso_webshell”是具体规则 ID。在编写自己的规则时,请尝试遵循此格式,并将“P64”替换为您自己的 GitHub 用户名或其他唯一 ID。
该项目包含一组 Jasmine 测试,可以使用 npm test 运行。它还包含 ESLint 配置,可以使用 npm run lint 运行 ESLint。
开发时,可以通过运行 npm run watch:test 在源文件更改时运行测试。要同时运行测试和 ESLint,可以使用 npm run watch:all 脚本。
请注意,除非您已经安装了 Jasmine 和/或 nodemon,否则您应该以非生产模式运行 npm install,以确保安装了开发依赖项。
感谢 Reddit 用户 mayupvoterandomly 建议在 1.1.0 中添加的目录快照功能,并建议将很快添加的新规则。
ISC 许可证
版权所有 (c) 2017, Simon Pugnet
特此授予任何人出于任何目的使用、复制、修改和/或分发本软件的许可,无论是否收费,前提是上述版权声明和本许可声明出现在所有副本中。
本软件按“原样”提供,作者不承担任何明示或暗示的保证,包括但不限于对适销性和特定用途适用性的暗示保证。在任何情况下,作者均不对因使用本软件而引起的任何特殊、直接、间接、后果性损害或任何损害(包括但不限于使用、数据或利润的损失)承担责任,无论是在合同、疏忽或其他侵权行为中,还是与本软件的使用或性能有关。