首页 > 其他分享 >CC1,3,6回顾

CC1,3,6回顾

时间:2022-11-13 02:00:11浏览次数:62  
标签:调用 java 回顾 get readObject CC1 handler org

前言

前面陆续学习了CC1,CC3,CC6,以及TemplatesImpl以及改造,有点乱,正所谓温故而知新嘛,所以这篇就回顾一下,捋一捋,解决一些细节问题。

CC1

由于CC1要介绍CC链的几个关键类,所以写了三篇

  1. InvokerTransformer,其transform可以执行任意方法,
  2. ConstantTransformer作用是拿到一个危险类,如RunTime等等,
  3. ChainedTransformer作用是将几个Transformer串联起来

这三种搭配就可以执行任意方法

  1. TransformedMap:用来修饰Map,被修饰过的Map在添加新的元素时,将可以执⾏⼀个回调,也就是说可以调用其他的tramsform

  2. AnnotationInvocationHandler:第四点说了,触发漏洞的核心是向Map加入新的元素,在实际反序列化利用的时候,我们需要找到一个类,它在反序列化的readObject逻辑里有类似的写入操作。这个类刚好符合条件。

到这儿,算是一条完整的CC利用链了。

  1. LazyMap:作用和TransformedMap类似,都是为了执行transform,区别就是TransformedMap是在写入元素的时候执行会transform,而LazyMap是在其get方法中执行的factory.transform
  2. 动态代理:使用了一个动态代理的方法来调用``LazyMap#get,原因是当我们调用某个动态代理对象的方法时,都会触发代理类的invoke`方法,并传递对应的内容

分析一下利用过程:这里1,2,3,4,5是一条利用链,逻辑很清晰。1,2,3,6,7是一条利用链。这里还是比较绕的,分析一下利用过程:

只需要找到某个地方调用了LazyMap#get方法,并且传递了任意值。

首先在readObject时,会触发AnnotationInvocationHandler#readObject方法,其中调用了this.memberValues.entrySet

image-20221112155604794

this.memberValues是构造好的proxyMap,由于这是一个代理对象,所以调用其方法时,会去调用其创建代理时设置的handlerinvoke方法

image-20221112161622170

proxyMap设置的handler为下面这个handler,同样是InvocationHandler这个类,接着会调用他的invoke方法

image-20221112155915255

InvocationHandler#invoke的78行代码中调用了this.memberValues#get,此时的this.memberValues为之前设置好的lazymap,所以这里调用的是lazymap#get,从而触发后边的rce链。

image-20221112160022811

代理后的对象叫做proxyMap,但我们不能直接对其进行序列化,因为我们入口点是 sun.reflect.annotation.AnnotationInvocationHandler#readObject ,所以我们还需要再用 AnnotationInvocationHandler对这个proxyMap进行包裹:

image-20221112163225892

这里还是比较绕的,因为设置了两个handler,但是第一个handler是为了触发lazymap#get,而第二个handler实际上只是为了触发代理类所设置handler的invoke方法

接着解释一些细节的问题:

  1. 为什么这用反射的方式来创建AnnotationInvocationHandler的实例?

    因为AnnotationInvocationHandler并不是public类,所以无法直接通过new的方式来创建其实例。

    image-20221112163416268

2.为什么创建handler时传入的第一个参数是Retention.class?

因为在创建实例的时候对传入的第一个参数调用了isAnnotation方法来判断其是否为注解类:

 public boolean isAnnotation() {
        return (getModifiers() & ANNOTATION) != 0;
    }

而Retention.class正是java自带的一个注解类,所以这里可以直接用上,当然要是换成其他注解类也是ok的。

CC6

CommonsCollections1利用链,两种方法,LazyMap以及TransformedMap,但是在Java 8u71以后,这个利⽤链不能再利⽤了,主要原因是 sun.reflect.annotation.AnnotationInvocationHandler#readObject的逻辑变化了

所以关注点如何调⽤LazyMap#get()

找到的类是org.apache.commons.collections.keyvalue.TiedMapEntry ,在其getValue⽅法中调⽤了 this.map.get,⽽其hashCode⽅法调⽤了getValue⽅法

又在 java.util.HashMap#readObject中就可以找到 HashMap#hash()的调⽤

/*
	Gadget chain:
	    java.io.ObjectInputStream.readObject()
          java.util.HashMap#readObject
                   java.util.HashMap#hash()
                    org.apache.commons.collections.keyvalue.TiedMapEntry.hashCode()
                    org.apache.commons.collections.keyvalue.TiedMapEntry.getValue()
                        org.apache.commons.collections.map.LazyMap.get()
                            org.apache.commons.collections.functors.ChainedTransformer.transform()
                            org.apache.commons.collections.functors.InvokerTransformer.transform()
                            java.lang.reflect.Method.invoke()
                                java.lang.Runtime.exec()
*/

而ysoserial中使用HashSet.readObject()来调用

  java.util.HashSet.readObject()
                java.util.HashMap.put()
                java.util.HashMap.hash()

逻辑也很清晰

这条链是Java7和8高版本通杀

CC3

首先利⽤TemplatesImpl链是可以通过TemplatesImpl#newTransformer()执行代码的。

在一个为了绕过⼀些规则对InvokerTransformer的限制。所以CC3并没有使⽤到InvokerTransformer来调⽤任意⽅法,⽽是⽤到了另⼀个 类, com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter

这个类的构造⽅法中调⽤(TransformerImpl) templates.newTransformer(),免去了我们使⽤InvokerTransformer⼿⼯调⽤newTransformer()⽅法这⼀步

⽤到⼀个新的Transformer,就是 org.apache.commons.collections.functors.InstantiateTransformerInstantiateTransformer也是⼀个实现了Transformer接⼝的类,他的作⽤就是调⽤构造⽅法.

利⽤InstantiateTransformer来调⽤到TrAXFilter的构造⽅法,再利⽤其构造⽅法⾥的templates.newTransformer()调⽤到TemplatesImpl⾥的字节码

小结

知识点比较多,每一个都捋清楚后,就可以重分发散思维,各种组合利用

标签:调用,java,回顾,get,readObject,CC1,handler,org
From: https://www.cnblogs.com/gk0d/p/16884172.html

相关文章

  • 一周干货回顾&总结(附论文、源码、链接)
    ​作者:Edison_G本周我们“计算机视觉研究院”主要推送了目标检测干货及中国人工智能大会内容,今天给大家总结一下!公众号ID|ComputerVisionGzq学习群|扫码在主页获取加入方式​......
  • 【11.5-11.11】博客精彩回顾
    一、优秀文章推荐1.​​线程池中多余的线程是如何回收的?​​2.​​最近特火的爱心代码来了​​3.​​Docker容器实战十四:DockerCompose介绍​​4.​​Java中线程的生命周期......
  • Study Notes 之 回顾 HTML 基础
    LZ-Says:终于明白了鸡大说的,技术,沉淀,所谓的孤寂以及背后的坚持。比心,祝好~前言搞前段也搞了有一段日子,感觉嘛,还好。还是有很多的属性,有点蒙,写起来还是不能行云流水。大佬说......
  • java安全之CC1浅学(1)
    前言由于CC链还是比较复杂的,我们可以先看命令执行的部分payload之后再加上反序列化部分组成一个完整的payload调试一项目导入依赖,这里使用3.1版本<!--https://mvnrepo......
  • OpenMLDB Meetup No.6 回顾 | OpenMLDB+37手游:一键查收特征计算场景案例及进阶使用攻略
    OpenMLDBMeetupNo.6回顾会议内容OpenMLDB社区于2022年9月24日举行了第六期meetup,会议相关视频及资料如下:OpenMLDBPMCcoremember卢冕,以《开源机器学习数据库O......
  • 首届第四范式 Tech Day 回顾
    第四范式于2022年8月11日举办了首届第四范式TechDay活动,线上活动的相关视频及资料如下:主论坛——决策AI:企业智能化转型“新生产力”01✦第四范式联合创始人、首......
  • 卷妹带你回顾Java基础(一)每日更新Day8
    卷妹带你回顾Java基础(一)每日更新Day8......
  • 梁胜博士:软件供应链安全两手抓,既要安全左移也要全链路防护丨活动回顾
    11月1日下午,由深圳金融科技协会主办的湾区湾区金科(Fintech)沙龙(第四十期)——敏捷开发安全与软件供应链安全实践探讨专场圆满举办,逾1500名业界人士线上线下同步参加。数澈......
  • 回顾你过去将近3年的学习经历
    (1) 当初你报考的时候,是真正喜欢计算机这个专业吗?  是的。你现在后悔选择了这个专业吗?没有。你认为你现在最喜欢的领域是什么(可以是计算机的也可以是其它领域)?计算......
  • 本周回顾-面向对象
    编程思想1.面向过程编程 过程即流程面向过程就是按照固定的流程解决问题 eg:截止ATM为止使用的几乎都是面向过程编程注册功能登录功能转账功能......