scr34m / php-malware-scanner
扫描 PHP 文件中的恶意软件和已知威胁
Requires
- php: >=5.2.0
README
遍历目录以查找具有 php 扩展名的文件,并将文件与文本或正则表达式规则进行测试,规则基于自行收集的样本和公开可用的恶意软件/webshells。目标是找到感染文件并与儿童对抗,因为规则很容易被绕过。
如何安装?
只需克隆存储库或使用 composer 全局安装 composer global require scr34m/php-malware-scanner。
如何使用?
Usage: php scan.php -d <directory>
-h --help Show this help message
-d <directory> --directory Directory for searching
-e <file extension> --extension File Extension to Scan
-E --scan-everything Scan all files, with or without extensions
-i <directory|file> --ignore Directory of file to ignore
-a --all-output Enables --checksum,--comment,--pattern,--time
-b --base64 Scan for base64 encoded PHP keywords
-m --checksum Display MD5 Hash/Checksum of file
-c --comment Display comments for matched patterns
-x --extra-check Adds GoogleBot and htaccess to Scan List
-l --follow-symlink Follow symlinked directories
-k --hide-ok Hide results with 'OK' status
-r --hide-err Hide results with 'ER' status
-w --hide-whitelist Hide results with 'WL' status
-n --no-color Disable color mode
-s --no-stop Continue scanning file after first hit
-p --pattern Show Patterns next to the file name
-t --time Show time of last file change
-L --line-number Display matching pattern line number in file
-o --output-format Custom defined output format
-j <version> --wordpress-version Version of wordpress to get md5 signatures
--combined-whitelist Combined whitelist
--custom-whitelist Loads whitelist from specified file and merge with existing
--disable-stats Disable statistics output
可以多次使用 ignore 参数,并接受 glob 风格的匹配,例如:"cache*","??-cache.php" 或 "/cache" 等。
extension 参数默认为 ".php",也可以多次使用。
--base64是一种替代扫描模式,它忽略主模式文件并使用大量已转换为 base64 的 php 关键字和函数。速度较慢且易出现误报,但提供了额外的 base64 扫描覆盖。这些模式文件位于 base64_patterns 目录中,并基于 php 7 关键字和函数生成。不包含许多 PHP 扩展。--comment标志将显示出现在匹配模式之前的模式文件中的最后一条注释,因此记录模式文件很重要。
输出格式
默认输出取决于指定的参数,但完整的格式是 "%S %T %M # {%F} %C %P # %L" 并使用 ANSI 颜色。
可能的变量是
%S- 匹配指示器,可能的值是 OK、ER、WL%T- 文件更改时间%M- 文件 md5 哈希值%F- 带路径的文件%P- 模式%C- 模式注释%L- 匹配模式行号
模式
有三个主要模式文件,涵盖不同类型的模式匹配。每行都有一个模式。所有以 "#" 为首字符的行被视为注释,不作为模式使用。模式文件中的空白字符不使用。
patterns_raw.txt- 原始字符串匹配patterns-iraw.txt- 不区分大小写的原始字符串匹配patterns-re.txt- 正则表达式匹配。
白名单
请参阅 whitelist.txt 文件,其中包含预定义的 MD5 哈希列表。仅使用行的前 32 个字符,忽略其余部分,因此可以自由添加注释。
Wordpress md5 求和白名单
您可以通过指定 --wordpress-version 或 -j 作为参数来自动添加从 wordpress 核心文件中获取的 md5sum。示例
scan -d . -j 4.9.2
这将自动从 wordpress API (https://api.wordpress.org/core/checksums/1.0/?version=x.x.x) 获取 md5sum 并将其添加到白名单中。要检查您的版本,只需检查 wp-includes/version.php 文件即可。
组合白名单
此列表是针对开源项目的预生成数据库,更多信息请参阅 https://scr34m.github.io/php-malware-scanner/ 网站。扫描器检查数据库哈希的有效性,并且仅在它不同时才下载,当然,当使用参数时。
工具
text2base64.py
接收明文字符串作为输入,并返回3个对应的base64字符串。需要从终端执行此Python脚本才能使用。
值得注意的是,在一段文本块中存在这三个输出字符串之一并不能100%保证该字符串原本存在于原始代码中。可以保证的是,如果主题字符串原本存在于原始代码中,那么在base64版本中这三个输出字符串之一一定会存在。
$ python tools/text2base64.py 'base64_decode'
YmFzZTY0X2RlY29kZ
Jhc2U2NF9kZWNvZG
iYXNlNjRfZGVjb2Rl
例如:'YmFzZTY0X2RlY29kZ' 的存在并不能保证 'base64_decode' 在明文代码中。
可以保证的是,如果 'base64_decode' 存在于明文代码中,那么这三个base64字符串中至少有一个会存在。在代码块中 'YmFzZTY0X2RlY29kZ' 的存在可能是因为 'ase64_decod' 存在于原始代码中。
注意缺失的边缘字符,这是由于位错位和字符溢出造成的。
作为库使用
scan.php 执行时检查是否是通过命令行调用,因此作为库使用时,请使用与 scan.php 本身不同的目录。
<?php require_once '../scan.php'; $scan = new MalwareScanner(); $scan->setFlagHideWhitelist(true); $scan->setFlagHideOk(true); $scan->run('../samples/test');
资源
许可
PHP恶意软件扫描器遵循GNU通用公共许可证v3 许可协议。