首页 > 系统相关 >内存马的检测研究及实现

内存马的检测研究及实现

时间:2024-01-29 11:25:02浏览次数:21  
标签:webshell dump 实现 检测 内存 JVM jattach com

  1. 研究背景

  1. 随着国内政策驱动,市、省、国家级和行业级网络攻防演习推动了网络安全行业的发展,红蓝对抗双方的攻击与防御手段在不断演进。
  2. 传统的webshell已无法满足红队在攻防实战中需求,容易被蓝队的各种流量分析、EDR安全设备检测。随之红队创新出了一种新型的内存webshell来绕过蓝队现有的检测工具。
  3. 为助力网络安全行业发展、企业安全能力建设。本文对jattach开源工具展开分析,研究jattach如何跨namespace在主机、容器场景下对java虚拟机进程进行分析,找出内存中的webshell。

 

  1. Webshell基础

  1. webshell的概念
  2. 传统webshell,要求文件落地,存储在web容器能够解析的目录下。通常搭配文件上传、命令执行漏洞上传或写入webshell。演示环境
  3. 内存webshell,无需文件落地,通过代码执行漏洞将恶意代码写入到web应用本身逻辑当中。java、php、asp等语言实现的内存webshell各不相同,根据语言不同的特性实现内存webshell。演示环境

 

  1. 探索jattach

  1. jattach介绍

  1. jattach是一款使用c语言实现、采用Unix Domain Socket的通信方式、通过动态附加机制向JVM进程发送命令的实用程序。
  2. 它将jmap、jstack、jcmd和jinfo四类java开发工具功能集成在在一起,运行时不需要安装JDK环境,只要求存在JRE环境即可。
  3. jattach使用setns系统调用切换命名空间,突破NAMESPACE隔离与容器中的JVM交互。在Attach JVM时可避免不同namespace下不同JRE版本和不同JVM实现所带来的影响。
  4. 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"
    

      

  1. JVM基础及Attach实现原理

  1. JVM(Java虚拟机)是一种规范,定义了运行Java字节码的标准接口。根据JVM规范,存在多个实现,以下是一些常见的JVM虚拟机实现:HotSpot、OpenJ9、GraalVM、Zing JVM和JRockit。
  2. Javacom.sun.tools.attach 包中的类提供了JVM动态附加(JVM dynamic attach)功能。这个功能允许你连接到正在运行的 Java 虚拟机(JVM)实例,并在运行时执行各种操作,如获取运行时信息、监视 JVM 进程、动态加载代理代理类等。源码分析
  3. JVM虚拟机底层使用C++实现,源码分析
  4. Attach JVM的流程图,来源知乎
  1. jattach源码分析

  1. jattach使用c语言实现,支持Attach HotSpot和OpenJ9两种JVM实现
  2. 实现流程图

 

  1. 使用jattach检测内存马

  1. 内存马注入环境及工具

  1. 测试镜像:vulfocus/shiro-cve_2016_4437:latest、tomcat4websehll:1.5、vulhub/weblogic:10.3.6.0-2017。
  2. 测试工具:tomcat三大组件内存马、冰蝎内存马。
  1. 基于黑名单检测恶意类

  1. Dump JVM中所有已加载的类名,jattach {PID} inspectheap
  2. 测试环境dump数据
    1. 在tomcat4webshell环境下,通过上传JSP脚本文件并访问执行注入内存马后,使用jattach获取jvm中所有已加载的类及类实例数据。以jsp形式注入的webshell的类名通常以org.apache.jsp开头,并可在tomcat项目路径下找到对应的.jsp文件。jsp_inject_webshell-inspectheap.txt
    2. 在shiro环境下,dump所有类的数据shiro-cve-2016-4437_inspectheap.txt
    3. 在weblogic环境下,dump所有类的数据weblogic_inspectheap.txt
  3. 开源漏洞利用工具、内存马注入工具类黑名单
    包名 jattach检测截图 来源 备注
    com.summersec.x* x.BehinderFilter x. x.{类名} https://github.com/SummerSec/ShiroAttack2 https://github.com/j1anFen/shiro_attack   shiro命令执行注入内存马  
    net.rebeyond.memshell https://github.com/rebeyond/memShell/tree/master 命令行注入agent内存马
    com.itkim.shell、Godzilla   https://github.com/KimJun1010/WeblogicTool weblogic命令执行注入内存马
    org.apache.jsp   https://github.com/4ra1n/shell-analyzer/tree/master/memshell https://github.com/exp1orer/JNDI-Inject-Exploit/tree/master jsp脚本注入filter、listener和servlet内存马,org.apache.jsp为官方包,所有通过jsp注入的恶意类都在此包下
    cn.com.x1001 https://github.com/keven1z/weblogic_memshell/tree/master spring框架controller、intercetor内存马
    org.chabug.memshell https://github.com/Y4er/WebLogic-Shiro-shell weblogic\shiro漏洞利用综合工具
    com.BxFilterShell https://github.com/fupinglee/ShiroScan Shiro-550图形化检测工具
          struts2内存马
    com.memshell.     qax观星实验室-高度自定义内存webshell生成工具   Jetty内存马、jboss(wildfly)内存马、websphere内存马、glassfish内存马
           
  1. 使用MAT(Memory Analyzer Tool)分析heapdump文件

  1. Dump JVM堆数据命令jattach {PID} dumpheap /tmp/dump.hprof
  2. 测试环境dump结果
    1. tomcat4webshell环境dump堆文件tomcat-dump_0818.hprof
    2. shiro环境dump堆文件shiro-dump_0818.hprof
    3. weblogic环境dump堆文件weblogic-dump_0818.hprof
  3. 分析结果截图
 
  1. MAT分析内存马技巧
    1. 从ClassLoader类加载器开始分析,通过ClassLoader加载的类可以在Class Hierarchy(类层次结构)一眼看清。
    2. 看thread线程调用栈,如果攻击队正在使用内存马执行系统命令必然能看到对应的恶意类执行记录。

 

  1. jattach研究总结

  1. 优势
    1. 可以绕过JRE环境的限制,直接attach JVM虚拟机,减少了不同JRE版本的适配工作。
    2. 支持动态切换namespaces调试目标JVM,避免了多命名空间多JRE环境的干扰。
  2. 缺点
    1. 使用c语言实现,不方便开发项目管理,使用golang重写更好。
    2. github项目作者未提供ARM架构环境编译好的二进制,需要再单独编译。
    3. 只能dump出jvm中已加载的类名,无法获取类字节码数据进行反编译分析java代码。而xx科技公司是提供dump class字节码的。
      1. 开发java_agent.jar,通过jattach load命令向JVM注入检测代码

 

  1. 检测设计与实现

  1. 目标与检测说明

  1. 组件需要实现的功能
    1. 兼容attach主流jdk版本的jvm虚拟机,并提供dump java虚拟机中stack(栈)、heap(堆)上的数据。之后使用黑白名单两种方式对比dump出的数据发现内存webshell。
  2. 内存webshell扫描方式
    1. 主动扫描,由用户在产品界面手动对java进程发起内存webshell扫描
    2. 被动扫描,在客户端采集主机、容器资产时,如遇到java进程时触发扫描
  3. 基于黑白名单的方式检测内存webshell
    1. 黑名单,使用入侵规则同步一份内存webshell类黑名单列表
    2. 白名单(机器学习),在用户设定的周期时间内,按天dump JVM中的所有类名并保存到本地数据库。完成学习模式后,dump JVM的新数据与学习模式得到的数据模型进行对比。

 

  1. 参考

  1. JVM中的监听信号的线程以及Unix域套接字通信的线程
  2. Java内存马查杀GUI工具
  3. MAT分析工具
  4. 从jvm中dump一个类进行反编译
  5. JDK源码官方网址
  6. WeblogicTool GUI漏洞利用工具
  7. ShiroAttack2
  8. JDK快速下载
  9. jattach开源项目地址

标签:webshell,dump,实现,检测,内存,JVM,jattach,com
From: https://www.cnblogs.com/lmg0/p/17994096

相关文章

  • Spring WebSocket实现实时通信的详细教程
    简介WebSocket是基于TCP/IP协议,独立于HTTP协议的通信协议。WebSocket连接允许客户端和服务器之间的全双工通信,以便任何一方都可以通过已建立的连接将数据推送到另一方。我们常用的HTTP是客户端通过「请求-响应」的方式与服务器建立通信的,必须是客户端主动触发的行为,服务端只是......
  • 异常检测、自动告警,业务问题分钟级识别
    跨国业务覆盖范围广、用户多、业务量大,运维面临巨大挑战?应用平台AppStage运维中心来助力!本文分享自华为云社区《异常检测、自动告警,业务问题分钟级识别》,作者:开天aPaaS小助手。跨国业务覆盖范围广、用户多、业务量大,运维面临巨大挑战?应用平台AppStage运维中心来助力!异常检测......
  • 面试官:说一下零拷贝技术的实现原理?
    零拷贝(Zero-copy)技术是一种计算机操作系统中用于提高数据传输效率的优化策略。在传统的数据传输过程中,需要将数据从一个缓冲区拷贝到另一个缓冲区,然后再传输给目标。这涉及到多次的CPU和内存之间的数据拷贝操作,会消耗CPU的时间和内存带宽。而零拷贝技术通过直接共享数据的内......
  • 利用Mybatis拦截器实现自定义的ID自增器
    原生的Mybatis框架是没有ID自增器,但例如国产的MybatisPlus却是支持,不过,MybatisPlus却是缺少了自定属性的填充;例如:我们需要自定义填充一些属性,updateDate、createDate等,这时MybatisPlus自带的ID自增器就无法满足需求;这种时候我们就需要自定义的ID增加器,可以自定义ID增长策略同时......
  • 【Lazy ORM 整合druid 实现mysql监控】
    LazyORM整合druid实现mysql监控JDK17LazyORM框架地址up、up欢迎start、issues当前项目案例地址框架版本描述spring-boot3.0.7springboot框架wu-framework-web1.2.2-JDK17-SNAPSHOTweb容器Lazy-ORM1.2.2-JDK17-SNAPSHOTORMmysql-connector-j8.0.33mysql驱动druid-spring-boo......
  • go中间件实现登录验证
    一、概述在java中可以使用过滤器、拦截器实现登录验证(验证token的有效性、判断哪些路径需要登录、哪些路径不需要登录)等等的一些公共性的验证操作。go语言中有没有类似的东西呢,答案是有的,go语言中可以使用中间件来完成这个操作。接下来使用gin+中间件的形式来验证t......
  • 在K8S中,怎样实现数据持久化?
    在Kubernetes(简称K8s)中,数据持久化是通过Volume机制来实现的。Volume是一个抽象概念,它代表了Pod能够访问的存储资源,这些资源可以是本地磁盘、网络文件系统(NFS)、云提供商提供的块存储或对象存储等。以下是Kubernetes实现数据持久化的关键组件和过程:Volume:Volume为Pod提供了一......
  • java冒泡排序的三种实现方法
    第一种通过简单的比较相邻的元素,如果他们的顺序是错误的,则交换它们的位置。重复这个步骤,直到没有更多要交换的元素为止。j变量代表未排序数组范围的右边界,j以后的已经排序publicstaticvoidbubble(int[]nums,intj){if(j==0){return;}......
  • 倾斜单体化模型技术实现
    目录1概述2详论2.1切割单体化2.2矢量单体化2.3ID单体化2.4模型重建单体化3总结1概述为了改进倾斜摄影模型数据在实际GIS场景应用中诸多的缺点,一个非常热门的优化方向就是单体化。所谓单体化,是指让倾斜摄影数据像矢量数据那样,具备要素特征,进而可以关联属性,进行空间查询和......
  • JVM对象创建与内存分配
    对象创建流程对象内存分配对象内存分配流程图对象栈上分配我们通过JVM内存分配可以知道JAVA中的对象都是在堆上进行分配,当对象没有被引用的时候,需要依靠GC进行回收内存,如果对象数量较多的时候,会给GC带来较大压力,也间接影响了应用的性能。为了减少临时对象在堆内分配的数量,JV......