rmi远程反序列化rce漏洞_Apache Dubbo Provider默认反序列化远程代

ad0051a06425927894e3ff65e9d1fd6b.png

0ca0cb2aabcb45820100548bc8473aac.png

背景

    近日,Apache Dubbo披露了Provider默认反序列化远程代码执行漏洞(CVE-2020-1948),攻击者可构造恶意请求,从而执行任意代码。具体信息如上图所示。

    在官方邮件中,漏洞报告者还提供了官方的PoC脚本,感兴趣的读者可以自行抓包和学习。本文旨在复现漏洞,找出漏洞利用条件,提出漏洞修复方案。

dubbo基础知识 简 介 

是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

 序列化协议既然是远程过程调用,那必然会使用到Java的序列化和反序列化。Dubbo支持多种序列化协议,包括:

1. dubbo 序列化 

2. hessian2 序列化 

3. json 序列化

4. Java 序列化

由于本文不是序列化相关文章,所以这里对这四种序列化方式不做过多解释,只着重科普一下hessian2 序列化协议。

➤  hessian2反序列化攻击利用分析 gadget分析

在marshalsec工具中,有4种针对该协议的gadgets:

1. SpringCompAdv 2. Resin3. ROME4. XBean

在复现过程中,我们使用了rometools,所以这里只分析ROME,其他几种方式会陆续分析。 

➤  ROME分析

① 常规触发条件(EqualsBean/ToStringBean)

1. 创建一个 EqualBean 对象,设置其obj属性为一个 ToStringBean 的实例;将 ToStringBean 实例的beanClass,obj属性设置为 JdbcRowSetImpl。2. 将最终的对象插入进一个集合中(此时会调用 hashCode() )。3. 调用EqualBean的hashCode() 方法,触发EqualBean obj属性的 toString() 方法,这里即 ToStringBean 的 toString() 方法。4. 此 toString() 方法会调用其beanClass字段中全部 getter 方法,这里即是JdbcRowSetImpl 。其中getDatabaseMetaData() 方法会调用 connect() 方法,即通过 lookup方式触发了RCE。注: JNDI注入参照参考链接5。② 触发代码(参照链接3)

c811d39041c89f0aa009c834f4f02316.png

③ 触发命令执行分析在1中总结了常规的触发条件,可以根据这个条件来编写如下EXP,为了进一步说明1中的常规触发条件跟踪调试一下该EXP,调用栈如下:

1. hessian2在处理map反序列化时调用了 MapDeserializer.java 的 readMap() 方法Dubbo

c9a69d3c700fceae23f4bc8a21a208d9.png

2. 在 readMap() 方法中又调用了hashMap的 put() 方法

3. 在 put() 方法中调用 hash(key) ,该函数会计算对象的hash,即调用了 EqualBean 的 hashCode() 方法。而此方法又会调用obj的 toString() 方法,即调用了 ToStringBean 中的 toString() 方法。

4. 在 toString() 方法中又调用了 beanClass 的全部getter方法,即调用了 JdbcRowSetImpl 中全部的getter方法。

a0b5009034fb763e0e13f3f26987866d.png

f9d0cf46dd5705da8c5b55b521573128.png

8288a362b054bab8217d1fabaa67bf47.png

5. 调用 JdbcRowSetImpl 中的 getDatabaseMetaData() 方法,进而调用 connect() 方法。

5c4f74a1601c0ccbe31a881014b4eb42.png

以上即是ROME Gadget的利用链。

环境搭建 ● ○ 环境搭建主要有两种:1. 如链接1所示,构建 Dubbo Provider 和恶意的 Dubbo Consumer 。2. 如链接2所示,使用官方示例 dubbo-spring-boot-auto-configure-provider-sample 。这里为了方便,我使用的第一种环境搭建方式。复现过程 ● ○ 

复现步骤如下:

1. 下载文件。其中 DubboModules 为服务提供方, dubboconsumer 为服务消费方,此项目使用JDK8,且为了能 够使用ldap来进行JNDI注入,也需要选取指定版本的JDK8,否则可能导致复现不成功。

2. 导入idea中,这一步直接打开项目即可,但有些可能会遇到 Spring 配置文件相关问题,就需要各位自己踩坑了。

3. 开启 zookeeper 服务,这一步各位自行谷歌解决,根据自己的配置对 provider.xml 进行修改。

b042dbd11d609c06def289258a95f16c.png

f0b64e59006d0fc01a93bcab4cdcf71f.png

4. 编写恶意Java代码,这里使用百年不变的弹计算器来演示。

10aff562003f983a6ecb29f0a6f524a5.png

5. 编译恶意代码生成class文件,需要使用被攻击的目标Dubbo同样JDK版本进行编译。

376218f265b3122b132fdb93599ebddf.png

d2357e0c835bfcc65982085d6c46f07c.png

6. 启动http服务,此时应该启动http服务的目录应为恶意class文件所在的目录 

7. 启动ldap服务,这里为了方便使用 marshalsec这里有几个点需要注意:

1. 8000为启动的HTTP服务监听的端口

2. EvilObject为恶意class文件的名称

3. 7777为ldap服务的监听端口,应与exp文件中的端口对应

8. 运行恶意消费者,然后弹计算器成功

ccfdf73a292b5ba5a496f6370d4e70ff.png

b2ee98a6d04d8d8f8364064a56885246.png

70a21d1a7d07aefe4c94cf7eaa35b2af.png

到此为止,复现了漏洞利用过程。有兴趣的可以使用发现者提供的PoC去体验一波,这里就不过多展开了,发现者的分析为链接6。漏洞利用与修复 ● ○ 

➤ 漏洞利用总结

整个漏洞利用流程是很典型的反序列化利用流程,利用该类漏洞的难点在于找到gadgets chain。在上述复现过程中,我们构造了完整的服务消费者和服务提供者。根据漏洞报告者的文章,官方Exp如下所示:

3ad93aba6c8623374e138e1175340362.png

在复现过程中,我们通过注册中心获取service信息并用来进行攻击,所以我们实际上是利用了hessian 协议的漏洞,因为该序列化协议自身并没有针对rometools的gadgets的防护。而dubbo出现此次漏洞的原因,根据官方修复可以推断出是现在的版本没有对进入的service方法进行签名之类的验证,所以不用获取注册中心权限以掌握service信息就可以实施攻击。

➤ 漏洞修复建议
  • 升级到dubbo最新版本,但官方提供的修复只是增加反序列化前的service name的判断,如果能控制中间注册中心还是会存在攻击风险。

  • 对hessian协议进行扩展,主流方法就是增加对应的黑名单过滤器,维护一个黑名单,过滤可以触发gadget的类,如下图所示,详情可参照sofa-hessian(链接7)的处理。

b87fe2c6522e829d20b34eb201670d27.png

c533b915ed22311992b5544dd70bd347.png

编辑: 陈峰卫 审校: 李 东 参考链接● ○ 

1. https://gist.github.com/OneSourceCat/01277dceba635eefbc010af36d3704d7

2. https://www.mail-archive.com/dev@dubbo.apache.org/msg06544.html

3. https://blog.csdn.net/u011721501/java/article/details/79443598

4. https://www.jianshu.com/p/93c00a391e09

5. https://www.mi1k7ea.com/2019/09/15/%E6%B5%85%E6%9E%90JNDI%E6%B3%A8%E5%85% A5/

6. https://www.tuicool.com/articles/bYRveej

7. https://github.com/sofastack/sofa-hessian

Thanks!

团队简介:

民生科技公司智能云技术部应用安全组,主要负责公司自营业务相关的安全规划、安全建设,保障项目的安全开发和系统的安全运营。

目前团队成员包括:李东,陈峰卫,安战超

2284a1e36942d3e3a1f77622efceb804.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java非对称加密KeyPairGenerator类

Java加密的常用的加密算法类型有三种 1单向加密: 也就是不可逆的加密,例如MD5,SHA,HMAC 2对称加密: 也就是加密方和解密方利用同一个秘钥对数据进行加密和解密,例如DES,PBE等等 3非对称加密: 非对称加…

操作痕迹包括那些_高级消防设施操作员专题之:走近气体灭火系统

按照《消防设施操作员职业技能标准》的规定,安装有气体灭火系统的单位,应当配置高级消防设施操作员。由于这些单位通常情况下都是消防安全重点单位、火灾高危单位,可以预见,高级消防设施操作员作为消防行业的高技能人才&#xff0…

请求头Content-Type:application/json,java后端如何接收数据

Content-Type的类型 1.application/x-www-form-urlencoded ​ 常用RequestParam(“参数名称”)也可以不写使用springMvc自己根据参数名称自动赋值 2.multipart/form-data ​ 这个和上个差不多吧,如果是multipart类型的文件,记得在后端接收参数是直接…

flutter不支持热更新_Flutter 在安卓上可以实现热更新了

本文由 句号君 授权投稿原文链接:https://blog.csdn.net/qizewei123/article/details/102963340Flutter 官方在 GitHub 上声明是暂时不支持热更新的,但是在 Flutter 的源码里,是有一部分预埋的热更新相关的代码,并且通过一些我们自…

jar包在windows后台运行,通过.bat文件

jar包在windows后台运行.bat 一、IDEA打成jar包 这里不再赘述 二、在windows后台运行jar包 在cmd中可以使用java -jar xxxxx.jar方式运行一个jar文件,这种方法运行一旦关闭该cmd界面就会停止运行。编辑.bat文件,使用javaw方式运行不用担心文件会在不小…

圆周分孔计算公式表图_在圆上分孔怎么计?

2017-05-17为什么中国多制造方孔圆钱?关于方孔圆钱外圆内方的形制,一直是钱币学中颇有争议的问题。有人认为秦始皇迷信方士而采用;有人说是为了穿绳成串,便于携带;有人认为为了减轻铜钱的重量。然而,有三种较为认同的…

java 枚举(enum) 全面解读

枚举类型是单例模式的。你需要实例化一次,然后再整个程序之中就可以调用他的方法和成员变量了。 枚举类型使用单例模式是因为他的值是固定的,不需要发生改变。 简介 枚举是Java1.5引入的新特性,通过关键字enum来定义枚举类。枚举类是一种特殊…

修改表名_面试官:如何批量修改mysql表字段、表、数据库字符集和排序规则

概述目前数据库字符集统一用的utf8,由于项目需要,引进了表情,但是utf8mb5才支持表情字符,所以需统一修改数据库字符集,下面介绍批量修改数据库字符集的办法。修正顺序是字段级别>表级别>库级别。一、批量修改整个…

Linux - nohup - 实现后台运行程序及查看(nohup与)

1. 后台执行 一般运行linux上的程序都是执行 .sh 文件(./sh文件),那如果不影响当前CMD窗口的操作,需要后台运行怎么办呢? 这时就需要借助 nohup 和 & 命令来实现。 nohup java -server -Xms128M -Xmx512M -XX:M…

量化评价和质化评价举例_量化评价和质性评价异同点

量化评价和质性评价在理论上有分歧,但它们不是两种对立的方法,在课程评价中是非常必要和不可缺少的。它们的分歧能在课程评价实践中统一起来,互相弥补各自的缺点。1.量化评价的特点 量化评价的优点是逻辑性强,标准化和精确化程度…

Maven命令 install 和 package的区别

Maven命令 install 和 package的区别 Maven是目前十分流行的项目构建工具以及依赖解决工具,其提供的常用指令中有两个很容易引起使用者的疑惑, 那就是 install 和 package , 那么这两个命令到底有啥区别呢? Maven install 安装…

如何重启_消费市场按下重启键,企业该如何提前布局

2020广发卡携手企业和消费者,共同按下重启键,让我们放下包袱,轻松前行。当疫情结束后,你想做什么?也许是去见想见的人,和他一起去吃想吃的美食;也许是约上三五好友,或带着最亲的家人…

Linux中使用netstat命令的基本操作,排查端口号的占用情况

Linux中netstat命令详解 Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情…

与context的关系_Android-Context

一.简介Context 翻译为上下文环境,是一个应用程序环境信息的接口。如果以 Android 系统角度来看可以理解为某一与操作系统的交互的具体场景,比如 Activity 的具体功能,Service 的后台运行等。如果以程序的角度看,Context 是一个抽…

Linux中sudo、su和su -命令的区别

Linux中sudo、su和su -命令的区别小结 我们知道,在Linux下对很多文件进行修改都需要有root(管理员)权限,比如对/ect/profile等文件的修改。下面这篇文章主要给大家总结介绍了关于Linux中sudo、su和su -命令的区别的相关资料&…

mybatis可以生成不重复的id吗_Mybatis面试题吐血总结

标签,逐一定义数据库列名和对象属性名之间的映射关系。第二种是使用 sql 列的别名功能,将列的别名书写为对象属性名。有了列名与属性名的映射关系后,mybatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回&#xff0c…

如何根据进程号去查端口号?

1.查出进程号 eg: ps -ef |grep conet- 2.根据当前进程号获得端口号: eg: netstat -anp |grep 4118 得到当前的端口是8761

Linux中如何查看某个端口是否被占用的方法

LINUX中如何查看某个端口是否被占用的方法 之前查询端口是否被占用一直搞不明白,现在总结下: 1.netstat -anp |grep 端口号 如下,我以3306为例,netstat -anp |grep 3306(此处备注下,我是以普通用户操作&…

Maven构建分布式项目时子模块相互依赖打包技巧

场景 最近在学习使用Jenkins自动化部署分布式微服务的时候,需要将微服务打成Jar包发送到服务器制作成镜像供Jenkins拉取运行,了解到 spring-boot-maven-plugin 插件可以完成Maven工程的打包任务。 问题 直接在父pom文件引入如下插件将会导致Maven打的…

apache目录遍历漏洞利用_Apache漏洞—多后缀名解析、目录遍历和(CVE-2017-15715)

文章目录一、Apache httpd 多后缀解析漏洞漏洞原理漏洞复现漏洞修复二、Apache httpd 换行解析漏洞(CVE-2017-15715)漏洞原理漏洞复现漏洞修复三、Apache 目录遍历漏洞原理漏洞修复Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以…