写在前面的话
上期文章介绍了Webshell的基础知识和防护技巧,有兴趣的同学可以前往 你所不知道的Webshell--基础篇 观看。
这期文章我们接着来说说Webshell的检测方法。
检测技巧
目前检测Webshell的方式较多,有基于HTTP流量、基于Web访问日志、基于文件特征等方法,建议相关同学在日常运维、攻防演练等工作中根据业务的实际情况,选择适合的方法,实现对Webshell的检测和处置。
本文主要介绍三种面向主机层面,基于文件进行检测的方法及工具(文中所列工具旨在对检测方法进行说明,请用户结合实际情况选取使用)。
基于文件特征的检测
文件特征检测主要是通过匹配Webshell变量名、危险函数名等特征值,来判断是否为已知的Webshell。
优点:部署方便,一个脚本就可以完成,准确率高,可扩展性强,可以自行添加规则。
缺点:攻击者如果修改文件特征值,将很有可能被绕过。
工具介绍:在互联网上搜索Webshell检查可以找到很多基于文件特征的检测工具,但大多都存在无法跨平台,无法自定义规则,源代码不开放等问题,可信度低,对于在业务系统上运行使用,管理员持谨慎态度。下面介绍一个开源跨平台的检测工具YARA。
Windows/Linux环境通用
YARA由VirusTotal发布,用于研究人员识别和分析恶意样本,基于文本和二进制特征匹配原理,通过命令行界面或带有YARA-Python扩展名的Python脚本使用。
工具下载及安装
01
下载地址:
https://github.com/virustotal/yara/releases/tag/v4.0.1
安装命令:
Debian/Ubuntu:apt-get install yara,或自行编译安装。
Redhat/CentOS:yum install yara(先安装epel-release),或自行编译安装。
Windows:直接运行下载的exe,或自行编译安装。
规则下载
03
YARA的规则分为两种格式:.yara是规则源码,.bin是编译后的规则。
若下载的规则为编译后的规则,可跳过本步骤,直接进入步骤4。
规则源码格式如下:
private rule generic_jsp
{
meta:
source= "https://www.tenable.com/blog/hunting-for-web-shells"
strings:
$ = /Runtime.getRuntime().exec(request.getParameter("[a-zA-Z0-9] "));/ ascii
condition:
all of them
}
规则说明:
格式分为3部分信息,meta是元数据信息,用于描述Webshell来源,strings是特征字符串,condition为匹配条件。
规则获取方式:
在github上使用Webshell YARA关键词即可搜索到大量规则,这里以NSA推荐的规则为例,
下载地址:
https://github.com/nsacyber/Mitigating-Web-Shells/blob/master/core.webshell_detection.yara
https://github.com/nsacyber/Mitigating-Web-Shells/blob/master/core.yara.bin
规则编译
04
规则下载完成后,需要进行编译,也可直接下载编译后的规则。
编译命令:
yara core.webshell_detection.yara core.yara.bin
即可生成编译后的二进制规则core.yara.bin。
直接使用编译后的规则,可以提升检测速度,同时也能防止反病毒软件误将规则文件报为病毒。
检测执行
05
使用检测规则对目标路径进行Webshell检测,
检测命令:
yara –r -C core.yara.bin –r /var/www/html/
参数说明:-r 表示递归查询子目录,-C 指定编译后的规则文件。
结果分析
02
检测结果为与检测特征匹配的Webshell。
结果示例:
b374k /var/www/html/test.php
说明检测到b374k后门。
基于文件哈希的检测
将生产系统中可能受攻击的Web目录与已知的安全Web目录(例:从SVN导出的)进行比较,可以识别出不一致的文件,通过排查新增和修改的文件,再识别出攻击者上传的Webshell。
Windows环境
脚本安装
01
安装PowerShell脚本dirChecker.ps1,此脚本可基于文件hash对文件进行对比。
文件脚本:
param (
[Parameter(Mandatory=TRUE)][ValidateScript({Test-Path _ -PathType 'Container'})][String]
[Parameter(Mandatory=TRUE)][ValidateScript({Test-Path _ -PathType 'Container'})][String]
)
good = Get-ChildItem -Force -Recurse -Path knownGood | ForEach-Object { Get-FileHash -Path
prod = Get-ChildItem -Force -Recurse -Path productionImage | ForEach-Object { Get-FileHash -Path
Write-Host "Any file listed below is a new or changed file.`n"
(Compare-Object good prod -Property hash -PassThru | Where-Object{
注意:
脚本运行需要PowerShell 4.0及以上版本,下载地址:
https://www.microsoft.com/zh-CN/download/details.aspx?id=40855
文件检测
02
使用脚本对源目录与目的目录进行文件对比。
执行命令:
./dirChecker.ps1 -knownGood "d:bakwww" -productionImage " c:inetpubwww"
参数说明:-knownGood表示干净的Web目录,-productionImage 表示生产环境的Web目录。
结果分析
03
检测执行结果会把新建或者变更的文件显示出来,然后需要人工或借助其他工具对标注的文件进行Webshell排查。
结果示例:
Any file listed below is a new or changed file.
c:inetpubwwwtest.aspx
生产环境目录多1个test.aspx文件,需要排查是否为Webshell。
Linux环境
与Windows原理相同,可使用diff命令。
文件检测
01
使用系统命令对源目录与目的目录进行文件对比。
对比命令:
diff -r -q /opt/bak/html /var/www/html
参数说明:-r 表示递归查询子目录,-q 只输出差异部分。
结果分析
02
检测执行结果会把新建或者变更的文件显示出来,然后需要人工或借助其他工具对标注的文件进行Webshell排查。
结果示例:
在 /var/www/html 中存在:test.php
生产环境目录有一个变更或新建的文件:test.php,需要排查此文件是否为Webshell。
基于文件行为的检测
对于大多数正常的Web应用来说,很少会调用ipconfig,netstat等系统管理命令,反倒Webshell会经常产生此类调用。通过分析Web应用服务器关键进程调用日志,监测系统调用或进程调用,可以识别出此类异常行为,进一步排查出Web服务器中的Webshell。
Windows环境IIS
可使用微软发布的系统监测工具System Monitor (Sysmon),对IIS的调用进行监测。该工具能够监测进程创建、文件创建、网络连接等信息,并将监测结果记录到Windows事件日志中。
所以可通过分析sysmon日志信息,识别出系统中的异常活动,确认主机是否存在恶意文件。
工具下载及安装
01
下载地址:
https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon
安装命令:
sysmon64 –i
安装后系统会增加sysmon64服务,并自动运行。
日志查看
02
查看命令:
Get-WinEvent -FilterHashtable @{logname="Micorosft-Windows-Sysmon/Operational";id=1;} |
Where {$_.message -like "*ParentImage: C:WindowsSystem32inetsrvw3wp.exe*"} |
%{$_.properties[4]} |
Sort-Object -Property value –Unique
结果分析
03
在查询日志的结果中,若发现进程调用可疑文件,则需要进一步排查是否正常的Web应用,判断是否为Webshell。
涉及可疑行为的文件名称:
arp.exe,at.exe,bitsadmin.exe,certutil.exe,cmd.exe,dsget.exe,dsquery.exe,find.exe,findstr.exe,fsutil.exe,hostname.exe,ipconfig.exe,nbstat.exe,net.exe,net1.exe,netdom.exe,netsh.exe,netstat.exe,nltest.exe,nslookup.exe,ntdsutil.exe,pathping.exe,ping.exe,powershell.exe,qprocess.exe,query.exe,qwinsta.exe,reg.exe,rundll32.exe,sc.exe,schtasks.exe,systeminfo.exe,tasklist.exe,tracert.exe, ver.exe,vssadmin.exe,wevtutil.exe,whoami.exe,wmic.exe,wusa.exe
Linux环境
可以使用系统自带的auditd审计工具对Apache的调用进行监测。
工具安装
01
若系统默认无auditd服务,可使用以下命令进行安装:
Debian/Ubuntu:apt-get install auditd
Redhat/CentOS:yum install auditd
工具配置
02
1)执行命令:
apachectl -S|grep User:
结果输出:
User: name="apache" id=48
记录结果中的id值48。
2)编辑/etc/audit/rules.d/audit.rules,增加以下规则并修改uid为上面记录的id。
-a always,exit -F arch=b32 -F uid=48 -S execve -k apacheexecve
-a always,exit -F arch=b64 -F uid=48 -S execve -k apacheexecve
3)重启audit服务:service auditd restart。
日志查看及分析
03
1)日志查看命令:
grep "apacheexecve" /var/log/audit/audit.*4
2)在查询的结果中,若发现进程调用可疑文件,则需要进一步排查是否正常的Web应用,判断是否为Webshell。
涉及可疑行为的命令名称:
cat,crontab,hostname,ifconfig,ip,iptables,ls,netstat,pwd,route,uname,whoami
分析示例:
/var/log/audit/audit.log:type=SYSCALL msg=audit(1591243943.172:8817): arch=c000003e syscall=59 success=yes exit=0 a0=98cab0 a1=98cd90 a2=98bb70 a3=7fffcf137c20 items=2 ppid=22600 pid=22611 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="netstat" exe="/usr/bin/netstat" key="apacheexecve"
以上为Web页面调用系统netstat命令时所产生的日志,如果发现类似日志,请用户进行关注。