waja/maldetect

GitHub: waja/maldetect

这是一款专为Linux共享托管环境设计的恶意软件检测工具,通过MD5哈希、HEX模式匹配和统计分析检测传统杀毒软件容易遗漏的用户空间威胁,支持实时文件监控、自动隔离与恶意代码清除。

Stars: 60 | Forks: 15

Linux Malware Detect v1.6.5 (C) 2002-2023, R-fx Networks (C) 2023, Ryan MacDonald 本程序可在 GNU GPL v2 条款下自由重新分发 :::::::::::::::::::::::::::::::::: :: 目录 :: .: 1 [ 描述 ] .: 2 [ 功能 ] .: 3 [ 威胁源数据 ] .: 4 [ 版本更新 ] .: 4.1 [ 签名更新 ] .: 5 [ 检测到的威胁 ] .: 6 [ 威胁共享 ] .: 7 [ 配置 ] .: 8 [ 忽略选项 ] .: 9 [ CLI 使用方法 ] .: 10 [ 每日定时任务 ] .: 11 [ INOTIFY 监控 ] .: 12 [ MODSECURITY2 上传扫描 ] .: 13 [ 清除规则 ] :::::::::::::::::::::::::::::::::: .: 1 [ 描述 ] Linux Malware Detect (LMD) 是一款遵循 GNU GPLv2 许可证发布的 Linux 恶意软件扫描器,专为应对共享托管环境中面临的威胁而设计。它利用来自网络边缘入侵检测系统的威胁数据,提取攻击中活跃使用的恶意软件并生成用于检测的签名。此外,威胁数据还来源于用户通过 LMD checkout 功能提交的内容以及恶意软件社区资源。LMD 使用的签名为 MD5 文件哈希和 HEX 模式匹配,它们也很容易导出至任何数量的检测工具(如 ClamAV)。 推动开发 LMD 的原因是,目前针对 Linux 系统且专注于恶意软件检测的开源/无限制工具非常有限,更重要的是,这些工具中能准确完成检测的更是少之又少。许多在 Linux 上执行恶意软件检测的杀毒产品在检测威胁方面的表现非常糟糕,尤其是那些针对共享托管环境的威胁。 共享托管环境中的威胁形势与标准杀毒产品的检测套件有着独特之处,因为标准杀毒产品主要检测操作系统(OS)级别的木马、rootkits 和传统的文件感染型病毒,却忽略了用户账号级别上日益增多的各种恶意软件,而这些往往被用作攻击平台。 使用 CYMRU 恶意软件哈希注册表(它为 30 款主要杀毒产品提供恶意软件检测数据),我们可以证明当前威胁检测中的这一缺陷。以下是对 LMD 1.5 中提供的 8,882 个 MD5 哈希值的分析,以及目前主要杀毒产品对这些哈希值的检测百分比。 已知恶意软件: 1951 % 杀软检测率 (平均): 58 % 杀软检测率 (最低): 10 % 杀软检测率 (最高): 100 未知恶意软件: 6931 这些信息意味着,在这 8,883 个哈希值中,有 78%(即 6,931 个)恶意软件威胁未被排名前 30 的杀毒产品检测到。已被检测到的 1,951 种已知恶意软件威胁,在前 30 名杀毒产品中的平均检测率为 58%,最低和最高检测率分别为 10% 和 100%。这清楚地表明,排名前 30 的杀毒产品目前在用户空间恶意软件检测方面存在显著不足。正是出于这个原因,LMD 应运而生,以填补这一空白,特别是针对共享托管环境。 .: 2 [ 功能 ] - MD5 文件哈希检测,用于快速识别威胁 - 基于 HEX 的模式匹配,用于识别威胁变种 - 统计分析组件,用于检测混淆威胁(如:base64) - 集成 ClamAV 检测,将其作为扫描引擎以提高性能 - 使用 -u|--update 集成签名更新功能 - 使用 -d|--update-ver 集成版本更新功能 - scan-recent 选项,仅扫描在过去 X 天内添加/更改的文件 - scan-all 选项,用于基于完整路径的扫描 - checkout 选项,将可疑恶意软件上传至 rfxn.com 以供审查/哈希处理 - 完整的报告系统,可查看当前和以前的扫描结果 - 隔离队列,以安全的方式(无任何权限)存储威胁 - 隔离批处理选项,用于隔离当前或过去扫描的结果 - 隔离恢复选项,将文件恢复至原始路径、所有者和权限 - 隔离暂停账号选项,用于 Cpanel 暂停或撤销用户的 shell 权限 - 清除规则,尝试移除注入的恶意软件字符串 - 清除批处理选项,尝试对以前的扫描报告进行清除 - 清除规则,移除 base64 和 gzinflate(base64 注入的恶意软件) - 基于每日定时任务的扫描,针对用户主目录中过去 24 小时内的所有更改 - 每日 cron 脚本兼容原生 RH 风格系统、Cpanel 和 Ensim - 基于 kernel 的 inotify 实时文件扫描,针对已创建/修改/移动的文件 - kernel inotify 监控器,可从 STDIN 或 FILE 获取路径数据 - kernel inotify 监控器便捷功能,用于监控系统用户 - kernel inotify 监控器可限制为可配置的用户 html root - kernel inotify 监控器带有动态 sysctl 限制,以实现最佳性能 - kernel inotify 通过每日和/或可选的每周报告进行告警 - 通过 mod_security2 inspectFile 钩子进行 HTTP 上传扫描 - 每次扫描执行(手动和每日)后的电子邮件告警报告 - 基于路径、扩展名和签名的忽略选项 - 后台扫描器选项,用于无人值守的扫描操作 - 详细的日志记录和所有操作的输出 .: 3 [ 威胁源数据 ] LMD 的显著区别在于,它不仅仅基于他人生成的签名/哈希来检测恶意软件,而是一个全面的项目,能够主动追踪现实中的威胁,并基于当前流传的真实威胁生成签名。 生成 LMD 签名的恶意软件数据有四个主要来源: - 网络边缘 IPS:通过作为我日常工作一部分来管理的网络(主要与 Web 托管相关),我们的 Web 服务器每天接收到大量的滥用事件,所有这些都由我们的网络边缘 IPS 记录下来。IPS 事件经过处理以提取恶意软件 URL、解码 POST payload 和 base64/gzip 编码的滥用数据,最终检索到该恶意软件,对其进行审查、分类,然后酌情生成签名。LMD 的绝大多数签名都是从 IPS 提取的数据中衍生出来的。 我管理的网络托管了超过 35,000 个网站,因此每天都会遭受大量的滥用行为,所有这些都由我们的网络边缘 IPS 记录下来。这些 IPS 事件经过处理以提取恶意软件 URL、解码 POST payload 和 base64/gzip 编码的滥用数据,最终检索出恶意软件,进行审查、分类,然后酌情生成相应的特征码。LMD 的绝大多数特征码都是从 IPS 提取的数据中派生出来的。 - 社区数据:数据从多个社区恶意软件网站(如 clean-mx 和 malwaredomainlist)聚合而来,随后经过处理以检索新的恶意软件、进行审查、分类并生成特征码。 - ClamAV:监控 ClamAV 的 HEX 和 MD5 检测特征码,寻找适用于 LMD 目标用户群的相关更新,并酌情将其添加到项目中。迄今为止,大约有 400 个特征码从 ClamAV 移植过来,而 LMD 项目也通过提交超过 1,100 个特征码回馈给 ClamAV,并且仍在持续进行中。 - 用户提交:LMD 具有一项 checkout 功能,允许用户提交可疑恶意软件以供审查,这已发展成一项非常受欢迎的功能,平均每周会收到大约 30-50 份提交。 .: 4 [ 版本更新 ] LMD 发行版的更新不会自动安装,但可以使用 --update-ver 选项进行安装。不自动安装是有充分理由的,我实在不想一一列举,所以大家稍微自己思考一下就明白了。 发行版中的最新更改始终可以在以下网址查看: http://www.rfxn.com/appdocs/CHANGELOG.maldetect .: 4.1 [ 签名更新 ] LMD 签名通常每天更新一次,或根据来自 LMD checkout 功能、IPS 恶意软件提取以及其他来源的传入威胁数据提高更新频率。LMD 安装程序中签名的更新通过默认的 cron.daily 脚本配合 --update 选项每天执行,该选项也可以随时手动运行。 提供用于追踪恶意软件威胁更新的 RSS 和 XML 数据源: RSS 最近签名: http://www.rfxn.com/api/lmd XML 最近签名: http://www.rfxn.com/api/lmd?id=recent XML 所有签名: http://www.rfxn.com/api/lmd?id=all .: 5 [ 检测到的威胁 ] LMD 1.6 总共有 11,061 个(9,121 个 MD5 / 1,940 个 HEX)签名(更新前),以下是 LMD 检测到的前 60 种流行威胁列表。 base64.inject.unclassed bin.dccserv.irsexxy bin.fakeproc.Xnuxer bin.ircbot.nbot bin.ircbot.php3 bin.ircbot.unclassed bin.pktflood.ABC123 bin.pktflood.osf bin.trojan.linuxsmalli c.ircbot.tsunami exp.linux.rstb exp.linux.unclassed exp.setuid0.unclassed gzbase64.inject html.phishing.auc61 html.phishing.hsbc perl.connback.DataCha0s perl.connback.N2 perl.cpanel.cpwrap perl.mailer.yellsoft perl.ircbot.atrixteam perl.ircbot.bRuNo perl.ircbot.Clx perl.ircbot.devil perl.ircbot.fx29 perl.ircbot.magnum perl.ircbot.oldwolf perl.ircbot.putr4XtReme perl.ircbot.rafflesia perl.ircbot.UberCracker perl.ircbot.xdh perl.ircbot.xscan perl.shell.cbLorD perl.shell.cgitelnet php.cmdshell.c100 php.cmdshell.c99 php.cmdshell.cih php.cmdshell.egyspider php.cmdshell.fx29 php.cmdshell.ItsmYarD php.cmdshell.Ketemu php.cmdshell.N3tshell php.cmdshell.r57 php.cmdshell.unclassed php.defash.buno php.exe.globals php.include.remote php.ircbot.InsideTeam php.ircbot.lolwut php.ircbot.sniper php.ircbot.vj_denie php.mailer.10hack php.mailer.bombam php.mailer.PostMan php.phishing.AliKay php.phishing.mrbrain php.phishing.ReZulT php.pktflood.oey php.shell.rc99 php.shell.shellcomm .: 6 [ 威胁共享 ] 为了我自己或他人的理智,我坚信不要重复造轮子。因此,所有独特的威胁数据都会提交给 CYMRU 和 ClamAV,以便整个开源和反恶意软件社区都能从这个项目中获益。 .: 7 [ 配置 ] LMD 的配置通过 /usr/local/maldetect/conf.maldet 文件进行处理,所有选项都附有详细的注释,以便于配置。 默认情况下,LMD 禁用了文件的自动隔离,这意味着您需要对检测到的任何威胁采取手动行动,或者将 SCANID 传递给 '-q' 选项以批量隔离结果。要更改此设置,请在 conf.maldet 中设置 quarantine_hits=1。 .: 8 [ 忽略选项 ] 系统提供了四个忽略文件,其细分如下: /usr/local/maldetect/ignore_paths 一个以行为间隔的文件,用于存放要从搜索结果中排除的路径 忽略条目示例: /home/user/public_html/cgi-bin /usr/local/maldetect/ignore_file_ext 一个以行为间隔的文件,用于存放要从搜索结果中排除的文件扩展名 忽略条目示例: .js .css /usr/local/maldetect/ignore_sigs 一个以行为间隔的文件,用于存放应从文件扫描中移除的签名 忽略条目示例: base64.inject.unclassed /usr/local/maldetect/ignore_inotify 一个以行为间隔的文件,用于存放要从 inotify 监控中排除的正则表达式路径 忽略条目示例: ^/home/user$ ^/var/tmp/#sql_.*\.MYD$ .: 9 [ CLI 使用方法 ] 安装 LMD 后,可以通过 'maldet' 命令运行它,'--help' 选项提供了详细的使用选项摘要: ``` -b, --background Execute operations in the background, ideal for large scans e.g: maldet -b -r /home/?/public_html 7 -u, --update [--force] Update malware detection signatures from rfxn.com -d, --update-ver [--force] Update the installed version from rfxn.com -m, --monitor USERS|PATHS|FILE Run maldet with inotify kernel level file create/modify monitoring If USERS is specified, monitor user homedirs for UID's > 500 If FILE is specified, paths will be extracted from file, line spaced If PATHS are specified, must be comma spaced list, NO WILDCARDS! e.g: maldet --monitor users e.g: maldet --monitor /root/monitor_paths e.g: maldet --monitor /home/mike,/home/ashton -k, --kill Terminate inotify monitoring service -r, --scan-recent PATH DAYS Scan files created/modified in the last X days (default: 7d, wildcard: ?) e.g: maldet -r /home/?/public_html 2 -a, --scan-all PATH Scan all files in path (default: /home, wildcard: ?) e.g: maldet -a /home/?/public_html -c, --checkout FILE Upload suspected malware to rfxn.com for review & hashing into signatures -l, --log View maldet log file events -e, --report SCANID email View scan report of most recent scan or of a specific SCANID and optionally e-mail the report to a supplied e-mail address e.g: maldet --report e.g: maldet --report list e.g: maldet --report 050910-1534.21135 e.g: maldet --report SCANID user@domain.com -E, --dump-report SCANID Similar to -e/--report except dumps the report to stdout instead. e.g: maldet --dump-report e.g: maldet --dump-report 050910-1534.21135 -s, --restore FILE|SCANID Restore file from quarantine queue to orginal path or restore all items from a specific SCANID e.g: maldet --restore /usr/local/maldetect/quarantine/config.php.23754 e.g: maldet --restore 050910-1534.21135 -q, --quarantine SCANID Quarantine all malware from report SCANID e.g: maldet --quarantine 050910-1534.21135 -n, --clean SCANID Try to clean & restore malware hits from report SCANID e.g: maldet --clean 050910-1534.21135 -U, --user USER Set execution under specified user, ideal for restoring from user quarantine or to view user reports. e.g: maldet --user nobody --report e.g: maldet --user nobody --restore 050910-1534.21135 -co, --config-option VAR1=VALUE,VAR2=VALUE,VAR3=VALUE Set or redefine the value of conf.maldet config options e.g: maldet --config-option email_addr=you@domain.com,quarantine_hits=1 -p, --purge Clear logs, quarantine queue, session and temporary data. ``` .: 10 [ 每日定时任务 ] 由 LMD 安装的 cronjob 位于 /etc/cron.daily/maldet,用于执行每日签名更新,将 session、临时文件和隔离数据保留期限限制在 14 天以内,并对近期的文件系统更改运行每日扫描。 每日扫描支持各种控制面板系统或标准的 Linux /home*/user 路径。 如果您正在运行监控模式,则将跳过每日扫描,取而代之的是发布包含所有监控事件的每日报告。 如果您需要扫描其他路径,应查看该 cronjob 并使用其中一个自定义钩子文件(例如usr/local/maldetect/cron/custom.cron')来编写自定义扫描执行脚本。对于基于配置的 cron 更改,您可以在 '/etc/sysconfig/maldet' 或 '/usr/local/maldetect/cron/conf.maldet.cron' 中重新定义任何 conf.maldet 变量。 .: 11 [ INOTIFY 监控 ] inotify 监控功能旨在实时监控用户的文件创建/修改/移动操作。此选项需要支持 inotify_watch (CONFIG_INOTIFY) 的内核,该功能在 2.6.13+ 内核和 CentOS/RHEL 5 中默认提供。如果您正在运行 CentOS 4,则应考虑使用以下链接进行收件箱式升级:http://www.rfxn.com/upgrade-centos-4-8-to-5-3/ 监控功能可以在三种模式下执行,它们与监控的目标相关,分别是 USERS|PATHS|FILES。 例如:maldet --monitor users 例如:maldet --monitor /root/monitor_paths 例如:maldet --monitor /home/mike,/home/ashton 各选项的细分如下: USERS - users 选项将获取所有系统用户中 UID 大于 inotify_minuid 的用户的主目录并进行监控。如果设置了 inotify_webdir,则将仅监控用户的 webdir(如果存在)。 PATHS - 以逗号分隔的监控路径列表 FILE - 以行为间隔的监控路径文件列表 一旦您在监控模式下启动 maldet,它将根据指定的选项预处理路径,随后启动 inotify 进程。启动 inotify 进程可能是一项耗时的任务,因为它需要为受监控路径下的每个文件设置一个监控钩子。尽管启动过程可能会暂时增加负载,但该进程一旦启动,就会将其所有资源维护在内核内存中,并在内存或 CPU 使用率方面具有非常小的用户空间占用。 监控的扫描组件监视来自 inotify 进程的通知,并默认每 30 秒对要扫描的项目进行批处理。如果您需要对扫描计时器进行更严格的控制,可以在 conf.maldet 中编辑 inotify_stime。 监控模式下文件命中的告警通过每日报告处理,而不是在每次命中时发送电子邮件。由 LMD 安装的 cron.daily 作业将调用 --alert-daily 标志,并发送过去一天命中的告警。另外还有一个 --alert-weekly 选项可供使用,只需在 /etc/cron.daily/maldet 中编辑 cron,将 --alert-daily 更改为 --alert-weekly 即可。 终止 inotify 监控需要向 maldet 传递 '-k|--kill-monitor' 选项,它将触碰一个由 maldet 监控的文件句柄,并在监控服务的下一个唤醒周期中,终止自身及所有 inotify 进程。 .: 12 [ MODSECURITY2 上传扫描 ] 通过 mod_security2 的 inspectFile 钩子提供了对 HTTP 上传扫描的支持。 此功能允许使用验证脚本来允许或拒绝上传。 用于实现此目的的便捷脚本名为 hookscan.sh,位于 /usr/local/maldetect 安装路径中。默认设置是运行标准的 maldet 扫描,不支持 clamav,不执行清除规则,并启用隔离;这些选项是在性能与准确性之间权衡后设置的,这是一个合理的折衷方案。 如果需要,可以在 hookscan.sh 文件中修改扫描选项,默认的扫描选项如下: --config-option quarantine_hits=1,quarantine_clean=0,clamav_scan=0 --modsec -a "$file" 在这种使用场景中,禁用 clamav 扫描会带来明显的性能差异。原生 LMD 扫描引擎在单文件扫描方面的速度远远快于 clamav 扫描引擎。使用 clamav 进行单文件扫描平均大约需要 3 秒,而 LMD 扫描引擎只需 0.5 秒或更短的时间。 要使用 mod_security2 启用上传扫描,您必须在 conf.maldet 中设置启用 scan_user_access 选项(scan_user_access=1),然后将以下规则添加到您的 mod_security2 配置中。在 cpanel 服务器上,这些规则最好放在您的 modsec2.user.conf 文件中,或者在适合您设置的规则文件顶部。 /usr/local/apache/conf/modsec2.user.conf(或类似的 mod_security2 规则文件): SecRequestBodyAccess On SecRule FILES_TMPNAMES "@inspectFile /usr/local/maldetect/hookscan.sh" \ "id:'999999',log,auditlog,deny,severity:2,phase:2,t:none" 如果使用 ModSecurity >=2.9,应在 'SecRule FILES_TMPNAMES' 行之前设置 'SecTmpSaveUploadedFiles On'。 进行这些更改后,需要重新启动 Apache 服务。 当上传被判定为恶意软件时,该上传将被拒绝,并且 mod_security2 的 SecAuditLog 文件中将出现一条记录。在 cpanel 服务器和大多数配置中,这是位于 /usr/local/apache/logs 或 /var/log/httpd 下的 modsec_audit.log。 日志记录将类似于以下内容: Message: Access denied with code 406 (phase 2). File "/tmp/20121120-....-file" rejected by the approver script "/usr/local/maldetect/hookscan.sh": 0 maldet: {HEX}php.cmdshell.r57.317 /tmp/20121120-....-file [file "/usr/local/apache/conf/modsec2.user.conf"] [line "3"] [severity "CRITICAL"] 将应用默认的告警选项,并且在发现命中时将发送一封电子邮件。可以通过编辑 --config-option 值在 hookscan.sh 脚本中更改此设置。 要禁用告警,请将 email_alert=0 附加到 --config-option 值中: --config-option quarantine_hits=1,quarantine_clean=0,clamav_scan=0,email_alert=0 要更改上传命中的告警电子邮件地址,请将 email_addr=you@domain.com 附加到 --config-option 值中: --config-option quarantine_hits=1,quarantine_clean=0,clamav_scan=0,email_addr=you@domain.com 上传的性质决定了它们要么在运行 HTTP 服务的用户下执行,要么在 suexec 样式设置(即:phpsuexec)的系统用户下执行。这就要求更改 LMD 存储 session、临时文件和隔离数据的方式,以允许非 root 用户执行扫描。 鉴于 maldetect 安装路径属于 root 用户,我们要么需要将一个 pub 路径设置为全局可写(777),要么用用户拥有的路径来填充 pub 路径。将任何路径设置为全局可写都是不可取的,因此创建了一项填充路径数据的功能。此功能由 --mkpubpaths 标志控制,并每 10 分钟从 cron 执行一次,只有在 conf.maldet 中启用了 scan_user_access 变量时它才会执行。因此,务必确保在 conf.maldet 中将 scan_user_access 变量设置为启用(1),建议手动运行 'maldet --mkpubpaths' 以预先填充用户路径。此后,cron 将确保新用户在创建后不超过 10 分钟内生成相应路径。 所有非 root 扫描(例如在 mod_security2 下执行的扫描)都将存储在 /usr/local/maldetect/pub/username 目录树下。隔离路径是相对于执行扫描的用户的,因此用户 nobody 的文件将位于 pub/nobody/quar/ 下。可以在上传命中的电子邮件报告中验证文件被隔离的实际路径以及执行扫描的用户。 要恢复在非 root 用户下隔离的文件,您必须向 LMD 传递 -U|--user 选项,例如,如果要恢复用户 nobody 隔离的文件,可以按如下方式进行: maldet --user nobody /usr/local/maldetect/pub/nobody/quar/20121120-file-SFwTeu.22408 或者,一如既往,可以使用扫描 ID 来进行恢复 maldet --user nobody 112012-0032.13771 .: 13 [ 清除规则 ] 清除功能会在 clean/ 路径下查找以签名命名的规则,这些规则可以包含任何旨在清除文件中恶意软件的命令。清除规则必须使得文件能够通过扫描而不触发命中(HIT),否则它会将清除操作归类为 FAILED。 让我们暂时假设有一个我们想要清除的恶意软件,它触发了签名 "{HEX}php.cmdshell.r57.89"。其中实际的签名字符串是 "php.cmdshell.r57","{HEX}" 仅定义格式,而 ".89" 是变体编号。因此,要为 php.cmdshell.r57 创建清除规则,我们需要添加一个文件 'clean/php.cmdshell.r57',并且该规则将对任何命中同名签名的文件执行。 规则的实际内容应该是一个单行命令,它将针对命中的文件执行,例如,其执行方式类似于: YOUR_COMMAND MALWARE_FILE 因此,对于基于字符串的恶意软件注入,您可以轻松地在规则文件中加入 'sed -i' 命令,并使用适当的模式从文件中剥离该字符串。一旦清除命令运行完毕,将对文件重新进行扫描,如果它再次导致命中,则清除将被标记为 FAILED。成功的清除操作总是会在可能的情况下将文件恢复到其原始路径、所有者和模式。 重要的一点是,清除功能是隔离功能的一个子功能,因此如果隔离被禁用,那么在默认情况下,将不会对恶意软件命中尝试进行清除。除了显而易见的打开隔离并重新扫描(这浪费时间)之外,还有两种解决方法。最佳方法是启用隔离,然后使用 -q|--quarantine 标志对扫描结果进行批处理,这将隔离并清除文件。第二种是使用 -n|--clean 标志,它将尝试就地清除文件,无论是在隔离区还是文件的原始路径中,只要能找到该文件即可。 例如:maldet -q SCANID 例如:maldet --clean SCANID
标签:ClamAV集成, Debian打包, HEX模式匹配, Inotify, LMD, Malware Detect, MD5特征, Web安全, 共享主机安全, 后门检测, 威胁情报, 子域名枚举, 应用安全, 开发者工具, 文件监控, 无服务器架构, 木马检测, 端点安全, 签名提取, 系统安全, 自定义DNS解析器, 蓝队分析, 补丁管理, 防病毒