Java 安全之 CC4 链

Andrew2020-11-05 11:09:44

0x00 前言

继续来分析一波CC4的链,在写该文前,看到网上大部分的文章都只给了一个调用链和POC。其实看CC4调用链的时候,能看出来CC4的调用链用到的也是前面的一些类去构造,只不过把CC2 和CC3的链给拼接了一下。

Java安全之Commons Collections2分析

https://www.cnblogs.com/nice0e3/p/13860621...

Java安全之Commons Collections3分析

https://www.cnblogs.com/nice0e3/p/13854098...

0x01 POC

package com.test;

用网上的POC做了一个小小的改动。前面的一大段代码,在这里就不分析了,因为在CC2和CC3的链中,都是一样的。

Transformer[] trans = new Transformer[]{

CC4链中在这段代码中就做了一个简单的修改。

第一步是new了一个ConstantTransformer对象存储在Transformer[]数组中传入的参数是TrAXFilter.class

如果调用到ConstantTransformer实例化对象的transform方法会直接返回一个TrAXFilter对象。

第二步new了一个InstantiateTransformer对象传入的是Templates.class和构造的恶意templates实例化对象。

第三步是使用了ChainedTransformer的修饰器将Transformer[]数组传入参数,当调用transform方法将给Transformer[]数组给遍历调用transform方法。

第四步将ChainedTransformer修饰后的对象再使用TransformingComparator修饰器给修饰一遍,这里再使用TransformingComparator来修饰一下,这样等调用到该实例化对象的compare,方法的时候就会去遍历调用Transformer[]transform方法。

Field com = PriorityQueue.class.getDeclaredField("comparator");

这里反射获取PriorityQueue的成员变量comparator,然后设置PriorityQueuecomparator值为transCom

其他的都和前面的一模一样,这里就不做具体分析了,感兴趣的可以去看看前面3条链的一个调试和分析过程。下面来做CC链的调试。

0x03 POC调试

该链中利用的也是通过PriorityQueuereadObject作为入口点。在该readObject复写点打个断点进行跟踪。

readObject会调用到heapify方法。跟进一下heapify方法。

heapify方法会再去调用siftDown方法。

在这里如果comparator不为空,还会继续调用siftDownUsingComparator方法,comparator在这里是被修饰的Transformer[]数组。前面使用反射去进行设置的。继续跟进siftDownUsingComparator方法。

到了这一步后,就会调用comparatorcompare方法,在前面使用到了TransformingComparator来修饰,所有调用到TransformingComparatorcompare方法。

在被TransformingComparator修饰前,还使用了ChainedTransformer修饰器进行修饰,在this.transformerChainedTransformer的实例化对象。所以这里调用的是ChainedTransformertransform。前面也提过该方法会遍历调用Transformer[]数组的transform方法。

在第一次遍历调用transform方法时i,因为前面Transformer[]存储的第一个是ConstantTransformerConstantTransformertransform会直接返回TrAXFilter对象。

第二次调用的时候则是传入TrAXFilter调用InstantiateTransformertransform方法。

这里的this.iParamTypestemplates,而this.iArgs为构造的恶意TemplatesImpl实例化对象。

那么这一步就是获取TrAXFiltertemplates的构造方法。然后调用该构造方法实例化对象,并且传入TemplatesImpl恶意类。跟进到TrAXFilter构造方法里面,查看一下具体实现。

在他的构造方法里面还会对传入的对象调用newTransformer方法。

此时传入的是恶意的TemplatesImpl实例化对象。调用的则是TemplatesImplnewTransformer方法。继续跟进。

在该方法还会调用到getTransletInstance方法。继续跟进。

到了这里会判断_class为空的话就会去调用defineTransletClasses进行赋值。跟踪一下defineTransletClasses方法查看是如何赋值的。

_bytecodes_class进行赋值。_bytecodesRuntime类执行命令代码的字节码。在执行完方法后,来到下一步。

_class进行newInstance,进行实例化对象。执行完这一步后,就会弹出计算器,也就是说执行了我们前面构造好的命令执行代码。

调用链

getTransletInstancePriorityQueue.readObject->PriorityQueue.heapify

0x04 结尾

在CC1和CC3里面只能在低版本执行,而CC2和CC4可以在1.8的版本下执行,调试CC1,3用的是JDK7u21版本,而2和4使用的是jdk8U181版本,亲测可用。

CC4的链在一开始并不想去做一个分析,因为和前面分析的链基本一样。但是还是需要把它给记录下来,也可以去加深一下影响。

原创: Keefe SecIN技术平台
原文链接:https://mp.weixin.qq.com/s/pWjK-nndbIAoDBy...

本作品采用《CC 协议》,转载必须注明作者和本文链接
Java 安全 CC4
2020-11-05 11:09:44
第二步new了一个InstantiateTransformer对象传入的是和构造的恶意templates实例化对象。0x03 POC调试 该中利用的也是通过PriorityQueue的readObject作为入口点。在该readObject复写点打个断点进行跟踪。继续跟进siftDownUsingComparator方法。在被TransformingComparator修饰前,还使用了ChainedTransformer修饰器进行修饰,在为ChainedTransformer的实例化对象。ConstantTransformer的transform会直接返回TrAXFilter对象。第二次调用的时候则是传入TrAXFilter调用InstantiateTransformer的transform方法。此时传入的是恶意的TemplatesImpl实例化对象。_bytecodes对_class进行赋值。_bytecodes为Runtime类执行命令代码的字节码。在执行完方法后,来到下一步。
Java安全反射
2022-11-22 10:36:15
前言关于Java安全,反序列化漏洞一直是一个热门话题,而反序列化漏洞?可以从反射开始说起。通过反射,对象可以通过反射获取他的类,类可以通过反射拿到所有?附加上动态特性。入门有以下三种方法获取?个“类”,也就是java.lang.Class对象://1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object类型的对象,而我不知道你具体是什么类,用这种方法
java反射机制是什么
Thymeleaf SSTI漏洞分析
2021-11-11 12:56:34
要了解SSTI漏洞,首先要对模板引擎有所了解。下面是模板引擎的几个相关概念。 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的文档。 模板引擎的本质是将模板文件和数据通过模板引擎生成最终的HTML代码。 模板引擎不属于特定技术领域,它是跨领域跨平台的概念。 模板引擎的出现是为了解决前后端分离
本篇文章是WebLogic中间件漏洞复现,记录了近几年来爆出的WebLogic中间件漏洞主要分为六个部分:WebLogic简介、WebLogic安装、WebLogic漏洞复现、WebLogic SSRF联动Redis、WebLogic实战和WebLogic防御措施。
本篇文章是Fastjson框架漏洞复现,记录了近几年来爆出的Fastjson框架漏洞,主要分为四个部分:Fastjson简介、Fastjson环境搭建、Fastjson漏洞复现、Fastjson工具介绍。 本篇文章由浅入深地介绍了Fastjson的一系列反序列化漏洞,基于RMI或LDAP方式反序列化漏洞利用对Fastjson进行RCE。在学习Fastjson过程中阅读了几十篇中英文Fastjson
接着定义 Person 类实现前面的接口:public?XStream 序列化是调用?unmarshall : xml-> object 解码两个重要的实现类:?Mapper 映射器简单来说就是通过 mapper 获取对象对应的类、成员、Field 属性的 Class 对象,赋值给 XML 的标签字段。Converter 转换器XStream 为 Java 常见的类型提供了 Converter 转换器。EventHandler 类EventHandler 类为动态生成事件侦听器提供支持,这些侦听器的方法执行一条涉及传入事件对象和目标对象的简单语句。EventHandler 类是实现了 InvocationHandler 的一个类,设计本意是为交互工具提供 beans,建立从用户界面到应用程序逻辑的连接。
安全从业者更是有着一般的计算机从业人员所没有的风险,需要步步小心,可能某些行为会游走在法律边缘,稍有不慎便会越界,这不是在危言耸听。
最近在分析JDK7u21的Gadgets,有两个不解处,阅读前辈们的文章发现并未提起。1.为什么有的POC入口是LinkedHashSet,有的是HashSet,两个都可以触发吗?
Andrew
暂无描述