内存马的检测研究及实现
-
研究背景
- 随着国内政策驱动,市、省、国家级和行业级网络攻防演习推动了网络安全行业的发展,红蓝对抗双方的攻击与防御手段在不断演进。
- 传统的webshell已无法满足红队在攻防实战中需求,容易被蓝队的各种流量分析、EDR安全设备检测。随之红队创新出了一种新型的内存webshell来绕过蓝队现有的检测工具。
- 为助力网络安全行业发展、企业安全能力建设。本文对jattach开源工具展开分析,研究jattach如何跨namespace在主机、容器场景下对java虚拟机进程进行分析,找出内存中的webshell。
-
Webshell基础
- webshell的概念
- 传统webshell,要求文件落地,存储在web容器能够解析的目录下。通常搭配文件上传、命令执行漏洞上传或写入webshell。演示环境
- 内存webshell,无需文件落地,通过代码执行漏洞将恶意代码写入到web应用本身逻辑当中。java、php、asp等语言实现的内存webshell各不相同,根据语言不同的特性实现内存webshell。演示环境
-
探索jattach
-
jattach介绍
- jattach是一款使用c语言实现、采用Unix Domain Socket的通信方式、通过动态附加机制向JVM进程发送命令的实用程序。
- 它将jmap、jstack、jcmd和jinfo四类java开发工具功能集成在在一起,运行时不需要安装JDK环境,只要求存在JRE环境即可。
- jattach使用setns系统调用切换命名空间,突破NAMESPACE隔离与容器中的JVM交互。在Attach JVM时可避免不同namespace下不同JRE版本和不同JVM实现所带来的影响。
- jattach常用命令
#打印所有类的实例及大小 jattach {PID} inspectheap #打印thread调用栈 jattach {PID} threaddump #转储jvm中的堆到文件,dump文件最终保存在切换命名空间后的/tmp目录下 jattach {PID} dumpheap /tmp/dump.hprof #加载java agent jattach {PID} load instrument false "agent.jar=agentArgs" false:表示jar包为绝对路径 agentArgs:传递给agent.jar的参数 例子:jattach 16346 load instrument false "/tmp/diss-memshellscan-java-1.0.jar=Main"
-
JVM基础及Attach实现原理
-
JVM(Java虚拟机)是一种规范,定义了运行Java字节码的标准接口。根据JVM规范,存在多个实现,以下是一些常见的JVM虚拟机实现:HotSpot、OpenJ9、GraalVM、Zing JVM和JRockit。
-
Java
com.sun.tools.attach
包中的类提供了JVM动态附加(JVM dynamic attach)功能。这个功能允许你连接到正在运行的 Java 虚拟机(JVM)实例,并在运行时执行各种操作,如获取运行时信息、监视 JVM 进程、动态加载代理代理类等。源码分析 - JVM虚拟机底层使用C++实现,源码分析
-
Attach JVM的流程图,来源知乎
-
jattach源码分析
- jattach使用c语言实现,支持Attach HotSpot和OpenJ9两种JVM实现
- 实现流程图
-
使用jattach检测内存马
-
内存马注入环境及工具
- 测试镜像:vulfocus/shiro-cve_2016_4437:latest、tomcat4websehll:1.5、vulhub/weblogic:10.3.6.0-2017。
- 测试工具:tomcat三大组件内存马、冰蝎内存马。
-
基于黑名单检测恶意类
- Dump JVM中所有已加载的类名,
jattach {PID} inspectheap
-
测试环境dump数据
- 在tomcat4webshell环境下,通过上传JSP脚本文件并访问执行注入内存马后,使用jattach获取jvm中所有已加载的类及类实例数据。以jsp形式注入的webshell的类名通常以org.apache.jsp开头,并可在tomcat项目路径下找到对应的.jsp文件。jsp_inject_webshell-inspectheap.txt
- 在shiro环境下,dump所有类的数据shiro-cve-2016-4437_inspectheap.txt
- 在weblogic环境下,dump所有类的数据weblogic_inspectheap.txt
-
开源漏洞利用工具、内存马注入工具类黑名单包名jattach检测截图来源备注com.summersec.x*x.BehinderFilterx.x.{类名}https://github.com/SummerSec/ShiroAttack2https://github.com/j1anFen/shiro_attackshiro命令执行注入内存马net.rebeyond.memshellhttps://github.com/rebeyond/memShell/tree/master命令行注入agent内存马com.itkim.shell、Godzillahttps://github.com/KimJun1010/WeblogicToolweblogic命令执行注入内存马org.apache.jsphttps://github.com/4ra1n/shell-analyzer/tree/master/memshellhttps://github.com/exp1orer/JNDI-Inject-Exploit/tree/masterjsp脚本注入filter、listener和servlet内存马,org.apache.jsp为官方包,所有通过jsp注入的恶意类都在此包下cn.com.x1001https://github.com/keven1z/weblogic_memshell/tree/masterspring框架controller、intercetor内存马org.chabug.memshellhttps://github.com/Y4er/WebLogic-Shiro-shellweblogic\shiro漏洞利用综合工具com.BxFilterShellhttps://github.com/fupinglee/ShiroScanShiro-550图形化检测工具struts2内存马com.memshell.Jetty内存马、jboss(wildfly)内存马、websphere内存马、glassfish内存马
-
使用MAT(Memory Analyzer Tool)分析heapdump文件
- Dump JVM堆数据命令
jattach {PID} dumpheap /tmp/dump.hprof
-
测试环境dump结果
- tomcat4webshell环境dump堆文件tomcat-dump_0818.hprof
- shiro环境dump堆文件shiro-dump_0818.hprof
- weblogic环境dump堆文件weblogic-dump_0818.hprof
- 分析结果截图
-
MAT分析内存马技巧
- 从ClassLoader类加载器开始分析,通过ClassLoader加载的类可以在Class Hierarchy(类层次结构)一眼看清。
- 看thread线程调用栈,如果攻击队正在使用内存马执行系统命令必然能看到对应的恶意类执行记录。
-
优势
- 可以绕过JRE环境的限制,直接attach JVM虚拟机,减少了不同JRE版本的适配工作。
- 支持动态切换namespaces调试目标JVM,避免了多命名空间多JRE环境的干扰。
-
缺点
- 使用c语言实现,不方便开发项目管理,使用golang重写更好。
- github项目作者未提供ARM架构环境编译好的二进制,需要再单独编译。
-
只能dump出jvm中已加载的类名,无法获取类字节码数据进行反编译分析java代码。而xx科技公司是提供dump class字节码的。
-
开发java_agent.jar,通过jattach load命令向JVM注入检测代码
-
-
检测设计与实现
-
目标与检测说明
-
组件需要实现的功能
- 兼容attach主流jdk版本的jvm虚拟机,并提供dump java虚拟机中stack(栈)、heap(堆)上的数据。之后使用黑白名单两种方式对比dump出的数据发现内存webshell。
-
内存webshell扫描方式
- 主动扫描,由用户在产品界面手动对java进程发起内存webshell扫描
- 被动扫描,在客户端采集主机、容器资产时,如遇到java进程时触发扫描
-
基于黑白名单的方式检测内存webshell
- 黑名单,使用入侵规则同步一份内存webshell类黑名单列表
- 白名单(机器学习),在用户设定的周期时间内,按天dump JVM中的所有类名并保存到本地数据库。完成学习模式后,dump JVM的新数据与学习模式得到的数据模型进行对比。