应急响应过程内存WEBSHELL分析与排查

admin 2022年6月1日09:53:50评论1,419 views1字数 3868阅读12分53秒阅读模式

还能冲动,表示你还对生活有激情,总是冲动,表示你还不懂生活。

01
简介

Java内存马在近年来是攻击方常用的攻击手段之一,由于在利用后不会有文件落地,对应急响应过程的排查和分析带来了较大的困难。


本文将主要从工程学的角度而非代码分析的角度,介绍在应急响应过程,如何对内存webshell进行分析和排查。


02
Java 内存马简介

在介绍内存马检测之前,先看看Java Web三大组件:

应急响应过程内存WEBSHELL分析与排查

  • Servlet

Servlet是运行在 Web 服务器或应用服务器上的程序,它是作为来自 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。它负责处理用户的请求,并根据请求生成相应的返回信息提供给用户。Servlet 可以理解为某一个路径后续的业务处理逻辑。


  • Filter

Filter也称之为过滤器,可以动态地修改HttpServletRequest,HttpServletResponse中的头和数据。


  • Listener

Listener也称之为监听器,可以监听Application、Session和Request对象的创建、销毁事件,以及监听对其中添加、修改、删除属性事件,并自动执行自定义的功能。


  • Java Instrument

java.lang.Instrument包是在JDK5引入的,开发者通过修改方法的字节码实现动态修改类代码。利用Instrument,开发者可以开发单独的代理Agent,实现对JVM进程的运行时监控,分析JVM进程运行时内存状态,甚至可以很方便地修改内存中类的字节码,修改或者扩展已有的功能。基于Instrument的Java Agent的使用方式有两种:

   a. 在JVM启动前加载

启动时配置-javaagent参数,会执行Agent中的premain方法。

   b. 在JVM启动后加载

使用com.sun.tools.attach.VirtualMachine包提供的loadAgent方法,将Agent注入到指定的JVM进程中,会执行Agent中的agentmain方法。


  • 内存马分类

内存马根据实现方式,可分为以下两类:

  1. 利用Java Web组件(Servlet,Filter,Listener)

动态地创建Servlet、Filter或者Listener,解析请求参数,实现任意代码执行。在Spring框架利用Controller,Interceptor等组件也是类似的机制。


   2. 修改字节码

利用 Java Instrumentation 技术(JDK 5.0引入),动态修改 JVM 中Class 的字节码,包括类的属性、方法等内容,攻击者利用该技术 Hook 已有容器或 Servlet 代码逻辑,使用动态字节码操作类库实现自定义恶意代码逻辑的插入或修改。冰蝎webshell管理工具也是使用这种方式。


这里主要介绍如何在应急响应过程对内存马进行分析和排查,关于内存马的原理和实现,可参考下面文章:

https://mp.weixin.qq.com/s/lOBXzPk-m_th0yNSHGRxUA

http://blog.nsfocus.net/webshell-interceptor/

https://4ra1n.love/post/Tw0x7xHXx/


03
Java web组件类型内存马排查

这里以shiro反序列化漏洞为例,植入内存webshell进行分析。

应急响应过程内存WEBSHELL分析与排查


植入成功后,我们先用arthas进行分析。对于利用漏洞植入的Servlet类型的内存马,直接查看Servlet可以看到异常:

sc javax.servlet.Servlet

应急响应过程内存WEBSHELL分析与排查


使用cop.jar,也能检测到:

应急响应过程内存WEBSHELL分析与排查


对于Filter类型的,我们也可以使用arthas查看:

应急响应过程内存WEBSHELL分析与排查

sc javax.servlet.Filter

应急响应过程内存WEBSHELL分析与排查


使用cop.jar,也能看到:

应急响应过程内存WEBSHELL分析与排查


在实际应急过程,如果从cop.jar的结果中无法直观地看出异常,我们可以把里面的文件复制出来查看内容,搜索关键字或者使用其他工具进行扫描。


首先将所有导出的java文件复制到目录java_file(目录可以自己随意创建):

for file in `find .copagent/ -type f -name *.java`;do cp  $file java_file/;done

然后使用grep 搜索关键字:

grep -r  -E "String k|String xc|shell|memshell|agentshell|exploit|payload|rebeyond|metasploit" java_file/


这里之所以复制出来查看,是因为dump的有些类里面可能包含$符号,直接用命令行的一些工具会报错。


在实际分析过程,可能还会用到arthas的一些其他命令,下面是一些常用的命令:

sc javax.servlet.Servlet  查看servlet
sc javax.servlet.Filter  查看Filter
sc javax.servlet.ServletRequestListener  查看Listener
sc org.apache.catalina.valves.ValveBase  Valve型

jad --source-only  查看源代码
help 查看所有帮助信息
其他需要检查的类:
javax.servlet.http.HttpServlet
org.springframework.web.servlet.handler.AbstractHandlerMapping

classloader  加上-t参数,有时候有内存马的情况下会报空指针错误。


如果是tomcat环境,也可以用脚本tomcat-memshell-scanner.jsp(项目地址:https://github.com/c0ny1/java-memshell-scanner)进行扫描,但上面的测试过程发现利用反序列化漏洞植入的Servlet和Filter类型的内存马没有扫描出来:

应急响应过程内存WEBSHELL分析与排查


使用哥斯拉客户端植入的内存马,本质还是servlet类型:

应急响应过程内存WEBSHELL分析与排查

jsp脚本可以扫描到:应急响应过程内存WEBSHELL分析与排查


arthas servlet无法直接看到异常,但在org.apache.coyote开头的类里面会存在痕迹(具体类名可能会发生变化):

应急响应过程内存WEBSHELL分析与排查


使用jad命令,可以看到哥斯拉的代码痕迹:

jad --source-only org.apache.coyote.ser.impl.PropertySerializerMap

应急响应过程内存WEBSHELL分析与排查

使用cop.jar,也能找到可疑的类,我们同样也可以对dump出来的java代码进行分析:

应急响应过程内存WEBSHELL分析与排查


对于servlet,Filter及Listener类型的内存马,重启服务可达到清理的效果。虽然不太优雅,但是简单直接且高效,有时候也没必要太过于追求完美,能有效解决问题即可。


04
Java Agent类型内存马

冰蝎客户端注入的为agent类型的内存马:

应急响应过程内存WEBSHELL分析与排查


冰蝎客户端植入的内存马,查看servlet无法直接发现异常,但在javax.servlet.http.HttpServlet类中会存在痕迹,我们可以使用arthas查看:

应急响应过程内存WEBSHELL分析与排查



使用jad查看源代码,可以发现冰蝎webshell代码的痕迹:

jad --source-only javax.servlet.http.HttpServlet

应急响应过程内存WEBSHELL分析与排查

通过查看所有类加载器,然后搜索关键字,也能发现痕迹:
应急响应过程内存WEBSHELL分析与排查


使用cop.jar,也能发现:

应急响应过程内存WEBSHELL分析与排查


另外,冰蝎如果使用了防检测参数,则工具无法注入到jvm进程进行分析,需重启服务解决:

应急响应过程内存WEBSHELL分析与排查


还有一种方法是使用jmap dump jvm内存,再通过查找关键字或者使用webshell扫描工具对结果进行检查:

在下面的例子中,我们dump进程97541的jvm内存:

jmap -dump:live,format=b,file=/tmp/dump.hprof 97541

然后搜索关键字:

strings dump.hprof |grep -E "String k|String xc|shell|memshell|agentshell|exploit|payload|rebeyond|metasploit"


对于利用反序列化漏洞直接植入的内存马,这种方法无效,因为没有上下文,可能存在误报。

对于通过哥斯拉客户端植入也无效,因为没有明显的和内存马相关的关键字,文件webshell执行,也会在内存中留下特征:
应急响应过程内存WEBSHELL分析与排查


对于通过冰蝎客户端植入,能看到内存马相关的关键字,以及文件webshell执行过的痕迹(不注入内存马也存在,但没有上面2个类):

应急响应过程内存WEBSHELL分析与排查


要查看内存马的URL,可使用arthas的mbean命令(冰蝎客户端植入的看不到),下图是哥斯拉客户端植入内存马的mbean:

应急响应过程内存WEBSHELL分析与排查


使用反序列化漏洞直接植入,也可以看到,但实际环境是否存在误报暂不确定:
应急响应过程内存WEBSHELL分析与排查


05
总结

上面介绍的几种方法,在某些场景可能需要对漏洞利用工具,或者不同类型webshell代码提前有一定的了解才能识别出内存马。但在实际应急过程,我们可以结合全流量日志,终端如EDR等日志综合分析(进程调用链和访问日志中的时间关联),没必要只纠结于通过jvm定位内存webshell。


希望这篇文章对大家有所帮助,如果有任何疑问或者建议,可在后台给我留言。


参考资料


https://github.com/alibaba/arthas/

https://github.com/c0ny1/java-memshell-scanner

https://github.com/LandGrey/copagent


应急响应过程内存WEBSHELL分析与排查
转载是一种动力 分享是一种美德

原文始发于微信公众号(Lycoris Security):应急响应过程内存WEBSHELL分析与排查

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月1日09:53:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   应急响应过程内存WEBSHELL分析与排查http://cn-sec.com/archives/1074217.html

发表评论

匿名网友 填写信息