/ Web安全

Linux系统下WebShell监控

0x01 Webshell检测

这一段时间一直想做机器学习识别webshell,但是两周过去了,直到今天检测效果不佳,对于存在混淆的webshell的检测成功率几乎为0,本来是想写一篇机器学习检测webshell的博客,但是发现目前做的结果意义不大,查阅了一些资料,发现在Linux上有一个审计系统Audit,它可以跟踪Linux系统上的安全事件,通过预先设置一定的规则,甚至可以之间达到检测webshell的目的。于是我想干脆就来学习学习这个吧。

0x02 Linux审计系统

审计(audit)是linux安全体系的重要组成部分,他是一种“被动”的防御体系。在我大学期间上Unix系统课程的时候,老师给我们说过很多关于Unix系统安全的原因,大多是在与Windows进行比较的场景下进行分析,没有介绍更详细的技术细节,市面上有一本书《LINUX安全体系分析与编程》对Linux的安全体系进行了比较详细的说明,本文中关于Audit的介绍和使用有参考这本书得出,这本书还提供了很多相关编程的介绍,对于需要在Linux上开发相关安全产品可以参考此书。我在文末附了相关的参考链接。

Linux提供了用来记录系统安全信息的审计系统,审计系统分为用户空间和内核空间设计系统,用户空间审计系统用来设置规则和审计系统状态、将内核审计系统传来的审计信息写入log文件。内核审计系统用于产生和过滤内核的各种审计信息。

Linux审计系统架构

0x03 Audit

在用户空间,Linux审计系统通过auditd后台进程接收内核审计系统传送来的审计信息,将信息写入到/var/log/audit/audit.log 中,audit.log的路径可在/etc/auditd.conf 中指定。当auditd没有运行时,内核将审计信息传送给 syslog,这些消息通常保存在/var/log/messages文件中,可以用dmesg命令查看。如果要启用内核中的审计功能,必须在系统启动时将audit=1传递给内核。也可以在运行时,使用下列命令来启用内核审计功能:auditctl -e 1。审计系统后台应用程序auditd是Linux审计系统的用户空间部件,它负责将审计记录写入到硬盘中。ausearch或aureport工具用来查看写在文件中的审计记录,auditctl工具用来设置审计规则。系统启动时,auditctl读取/etc/audit.rules中的规则,审计后台可以通过auditd.conf文件定制配置。

通过man auditctf可以看到更多命令的细节介绍
下面我们要用到的几个参数, -a 添加规则,

linux审计系统audit命令参数

我们要记录webshell的命令执行,我们记录在系统调用退出后记录-a exit,always
-F指定规则,我常用的是nginx+php-fpm的架构,查看php-fpm的启动用户,是apache(可以通过配置文件或者ps进程查看),再通过/etc/passwd查看用户的uid
-F uid=48

-S指定记录那些系统调用,我们记录所有 -S all

最后的命令就是

auditctl -a exit,always -F uid=48 -S all

然后在web目录下写一个system调用cat /etc/passwd的php文件

webshell文件

通过web访问后,查看audit日志

linux系统审计日志

查找EXECVE类型日志,看到上面的日志记录,相关系统调用记录,执行的命令和在哪个目录下,通过内核审计系统进行审计,不论木马混淆与否,最后的调用还是会变回原形,因此我们就可以通过Audit来检测Webshell。再配合Auesearch检索日志,将更容易检索出恶意行为。

0x04 完善规则

上面的规则是比较粗糙的一种做法,仔细研究Auditctl的命令帮助,它还为我们提供了能够将日志的粒度细化的各类规则细节。在上面的测试中我们通过-S all来记录所有的系统调用,这种情况下我们会发现在audit.log中存在大量的其他日志,我们可以通过ausyscall --dump查看可以所有的syscal选项

其他linux可以审计的系统的调用

可以看到支持308种具体的调用,前面的数字是其编号,在-S也可以使用数字编号指定具体的系统调用。
在Linux系统审计的基础上,通过制定不同的日志规则,配合其他日志管理系统对审计日志进行处理,可以说发现Webshell还是比较容易的。

linux服务——auditd
linux安全体系分析与编程_倪继利
浅谈变形PHP WEBSHELL检测