Webshell检测方法
2022-1-4 11:47:28 Author: mp.weixin.qq.com(查看原文) 阅读量:7 收藏

一、Webshell概述

Webshell是基于Web的一种应用程序,可以将其视为可在服务器上执行的一种远程访问工具或后门木马文件。Webshell作为一种web后门,通常由攻击者通过常见的Web网站漏洞,如sql注入、文件包含和上传等,上传到服务器,从而为攻击者提供与服务器端进行交互的能力。

根据Webshell的代码长度不同,通常可以将其分为大马、小马和一句话木马。小马通常只有几行甚至一行代码,实现的功能较为单一,如文件传输和权限提升等,攻击者通常将其用作跳板,绕过上传文件大小限制来上传功能更多的大马,大马是具有完整入侵功能的Webshell,它们的体积要大得多,具有用于文件操作,命令执行和数据库连接的友好图形用户界面,它们通常会调用系统功能,以便利用混淆技术来隐藏功能用于逃避检测。一句话木马一种特殊的小马,通常只有一行代码,但其使用场景丰富,可插入其他文件中,隐匿性强,可变形免杀。
Webshell的特点主要有:
  • 存在系统调用的命令执行函数,如eval,system,cmd_shell,assert等;

  • 存在系统调用的文件操作函数,如fopen、fwrite、readdir等;

  • 存在数据库操作函数,调用系统自身的存储过程来连接数据库操作;

  • 具备很深的自身隐藏性、可伪装性,可长期潜伏到web源码中;

  • 衍生变种多,可通过自定义加解密函数、利用xor、字符串反转、压缩、拼接等方法来绕过检测;

  • 访问ip少、访问次数少、页面孤立、传统防火墙无法进行拦截,无系统操作日志记录;

  • 连接webshell的payload流量会记录在web日志中。

二、Webshell检测方法

1、静态特征匹配

静态特征匹配的检测方法通过提取大量已知的Webshell的文件特征,如关键字、高危函数的调用等,通过构建规则库,利用规则匹配或相似性计算方法等实现Webshell的检测,常见的web查杀安全工具D盾使用的就是这种检测方法。此外,还会将已知的Webshell的MD5值保存在特征库中,在检测时对待检测文件进行MD5值的计算,并与特征库进行比较查看是否匹配。
但这种方法常常无法检测到经过加密、编码、拼接等混淆手段的Webshell变形。如下图的代码是经过base64编码混淆后的 Webshell变形,使用静态的检测方法难以对其进行检测。

2、基于统计特征的检测

由于Webshell往往经过了编码和加密,与常规的文件相比,会有一些特别的统计特征,可以根据这些特征统计进行检测。这类检测方法的典型代表: NeoPI ( https://github.com/Neohapsis/NeoPI )
NeoPi使用以下五种特征进行检测:
  • 信息熵(Entropy):通过使用ASCII码表来衡量文件的不确定性,通常经过混淆的Webshell文件信息熵更大;

  • 最长单词(LongestWord):最长的字符串也许潜在的被编码或被混淆;

  • 重合指数(Indexof Coincidence):低重合指数预示文件代码潜在的被加密或被混淆过;

  • 特征(Signature):在文件中搜索已知的恶意代码字符串片段;

  • 压缩(Compression):对比文件的压缩比,Webshell文件压缩比通常比正常文件低;

NeoPi的检测重心在于识别混淆代码,适用于检测经过混淆的Webshell。

3、基于日志的检测

基于日志的检测方法是在攻击发生之后,通过分析大量日志信息,对攻击进行溯源,是在web服务器被入侵之后进行排查的手段。由于攻击者成功上传Webshell后,会通过80端口访问Webshell文件来完成各类恶意操作,因此攻击者对Webshell的访问会被记录在web日志中,通过整合在系统各处的日志,可以对其进行分析,区分正常web网页和Webshell在日志文件中的不同特征,检测是否存在Webshell。
由于Webshell有以下访问特性:1)少量ip对其发起访问;2)总的访问次数少;3)通常Webshell属于孤立页面,可将其用于日志分析中。但由于日志的多样性和复杂性,该方法有可能会产生大量的误报,并且由于日志数量的庞大,大量读写日志很可能会对服务器的性能造成影响。

4、基于流量的检测

基于流量特征的检测是动态检测的一种方法,该方法主要是对网络流量进行抓包与分析,通过区分恶意流量和正常流量,从而检测是否存在Webshell。目前国内外的很多入侵检测和入侵防御系统都采用了这种方法。
基于流量的特征检测虽然能够较好地识别恶意流量,但由于流量信息的庞大,实时监测的难度较大,对系统的吞吐量要求高,很容易产生流量数据包丢失等问题而对检测结果产生一定的影响。

5、基于行为特征的检测

基于行为的分析检测也是目前常用一种的动态检测Webshell的手段,在入侵检测中应用广泛,该方法通过对恶意代码的行为进行捕捉与分析,检测异常行为,从而进行恶意代码的识别。
RASP产品就使用了这一检测方法,通过插桩等技术在应用程序运行过程中对执行危险操作的函数进行hook,检查其执行的参数,从而检测并阻止恶意代码运行。
php类型的Webshell检测一般通过php扩展对opcode进行hook,jsp类型的Webshell检测一般通过java agent的方式实现字节码的动态修改,从而对恶意行为进行检测。

三、内存马查杀

1、内存马的分类

2、php内存马

将该段代码上传至php服务器并访问,会在同一目录下循环生成shell.php的一句话木马文件。其查杀方式有:

 1)在条件允许情况下,重启服务器;

 2)kill掉www-data用户所有子进程:ps aux | grep www-data | awk '{print $2}' | xargs kill -9

3、python flask内存马

Python内存马可利用flask框架中ssti注入来实现,flask框架中在web应用模板渲染的过程中用到render_template_string()进行渲染但未对用户传入的参数进行过滤,就可以通过注入恶意代码来实现python内存马的注入。以下payload利用ssti注入注册了一个/shell的路由,路由对应的逻辑为执行cmd参数值命令。

查杀方式:找到恶意路由并删除或重启服务器。

4、java内存马

在java web中,客户端发起的web请求会依次经过Listener、Filter、Servlet三个组件,只要在这个请求的过程中做手脚,在内存中修改已有的组件或者动态注册一个新的组件,插入恶意的shellcode,就可以注入内存马。

根据内存马注入的方式,大致可以将内存马划分为以下两类:

1)servlet-api型:通过命令执行等方式动态注册一个新的listener、filter或者servlet,从而实现命令执行等功能。特定框架、容器的内存马原理与此类似,如spring的controller内存马,tomcat的valve内存马

2)agent型:通过java的instrumentation动态修改已有代码,进而实现命令执行等功能。

本文主要以Servlet内存马为例来介绍其原理和查杀方式。
  • Servlet内存马

Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。它负责处理用户的请求,并根据请求生成相应的返回信息提供给用户。 
在注入内存马的过程当中,可能需要用到反射机制,例如注入一个servlet型的内存马,需要使用反射机制来获取当前的context,然后将恶意的servlet添加到当前的context的children中。
servlet内存马注入过程如下:首先创建一个恶意的servlet,然后获取当前的StandardContext;再将恶意servlet封装成wrapper添加到StandardContext的children当中,最后添加ServletMapping将访问的URL和wrapper进行绑定。
执行上述操作后,访问指定的URL路径就可以进行命令执行了。

以哥斯拉的servlet内存马为例,在getshell后生成servlet内存马并绑定指定的url进行注入,接着就可以直接使用绑定的url进行内存马的连接。
  • Java内存马检测工具

(1)java-memshell-scanner

通过jsp扫描应用中所有的filter和servlet,然后通过名称、对应的class是否存在来判断是否是内存马

通常内存马的恶意servlet和filter等式动态注册的,在ClassLoader目录下没有对应的class文件

(2)cop.jar工具

可以识别异常的类,在结果中会显示所有运行的类以及危险等级,比较高的可以进入目录查看代码进行分析,在java目录下或class文件夹下会保存木马以及运行的类,可以用D盾等webshell查杀工具进行扫描。

(3)arthas-boot.jar工具

是阿里开源的Java诊断工具,可以实时监控jvm状态。mbean命令可查看可疑的servlet和filter节点,sc命令可以查看JVM已加载的类信息,若有可疑的类,可通过jad命令反编译得到源码进行排查。

四、总结

总的来说,无论是常见的Webshell,还是经过加密、编码、拼接等混淆的Webshell变形、内存马等,都需要利用Web应用的各种漏洞进行上传,如命令执行、反序列化RCE、文件上传等等,Webshell一旦被上传,无论通过流量、文件特征进行检测并查杀,都只是应急手段,无法从根源上防止攻击。
因此,最好的防护方法就是加强边界防护,减少暴露在外的应用漏洞。但是目前0day漏洞频出,边界突破手段防不胜防,因此,许多安全厂商和互联网大厂都在研究RASP技术,该技术通过注入应用程序内部实现安全防护,对比其他检测方法来说,它可以在程序通过Webshell执行恶意命令前对其进行检测和阻断,但该技术的应用目前仍在起步阶段,未来随着RASP技术的发展,针对Webshell的检测与防护可能会有新的突破。

文章来源: https://mp.weixin.qq.com/s?__biz=Mzg3NDY3NjcxOA==&mid=2247483967&idx=1&sn=e9c5889129660c5f8b4df34732e7b43f&chksm=cecc6abef9bbe3a8cfee0c409a48162267614f7817a8494d015d93a054fe0f4b7cd383836f82&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh