rmi远程代码执行漏洞_Apache Dubbo 远程代码执行漏洞

Apache Dubbo是一款应用广泛的Java RPC分布式服务框架。Apache Dubbo于2020年6月23日披露在Dubbo Provider中存在一个反序列化远程代码执行漏洞(CVE-2020-1948),攻击者可以构造并发送带有恶意参数负载的RPC请求,当恶意参数被反序列化时将导致远程代码执行。

参考链接:

hxxps://www.mail-rchive.com/dev@dubbo.apache.org/msg06544.html

Apache Dubbo 通过Dubbo协议进行RPC通信时默认使用Hessian进行对象序列化与反序列化,该反序列化方式存在反序列化漏洞,导致在服务端解析序列化数据时产生RCE,该漏洞利用方式分为两种。

第一种是rui0师傅提出的“Java后反序列化漏洞”利用实现,原理是恶意代码执行不是在反序列化过程中触发,而是利用被反序列成对象后大概率会调用的一种对象方法进行任意代码执行。Dubbo中利用ROME的ToStringBean类,该类在反序列化过程中没有黑名单处理,但是反序列化之后的一次抛出异常中输出这个对象信息时隐式调用了它的toString方法导致RCE。位置如图:

0f44b9c973d8dfe65a70c8317c8fe480.png

当调用org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol.class的getInvoker方法时会通过servicekey找对应的对象,找不到时抛出 RemotingException 异常,当抛出该异常时通过toString方法获取对象的字符串信息产生异常信息,而ROME的ToStringBean的toString方法会不断的将通过反射调用其属性类的方法。(2.7.5版本以上异常信息字符串产生变化,无法利用该种方式。)

1a1206012303eb7d771a81390c7270e7.png

于是,进一步利用com.sun.rowset.JdbcRowSetImpl实现JNDI注入。

0db07f94173bcde300ccd50a8e2dbec4.png

函数调用栈如下:

connect:615, JdbcRowSetImpl (com.sun.rowset)getDatabaseMetaData:4004, JdbcRowSetImpl (com.sun.rowset)……invoke:497, Method (java.lang.reflect)toString:158, ToStringBean (com.rometools.rome.feed.impl)valueOf:2994, String (java.lang)toString:4571, Arrays (java.util)toString:241, RpcInvocation (org.apache.dubbo.rpc)valueOf:2994, String (java.lang)append:131, StringBuilder (java.lang)getInvoker:266, DubboProtocol (org.apache.dubbo.rpc.protocol.dubbo)reply:127, DubboProtocol$1 (org.apache.dubbo.rpc.protocol.dubbo)handleRequest:102, HeaderExchangeHandler (org.apache.dubbo.remoting)

第二种利用方式是直接反序列化hessian的数据,反序列化期间对HashMap的操作进入toString实现反序列化。(需要调用正确的service和method)

6c02abda415400a1661c1af27294e739.png

函数代码栈如下:

connect:624, JdbcRowSetImpl (com.sun.rowset)getDatabaseMetaData:4004, JdbcRowSetImpl (com.sun.rowset)invoke:497, Method (java.lang.reflect)toString:158, ToStringBean (com.rometools.rome.feed.impl)toString:129, ToStringBean (com.rometools.rome.feed.impl)beanHashCode:198, EqualsBean (com.rometools.rome.feed.impl)hashCode:180, EqualsBean (com.rometools.rome.feed.impl)hash:338, HashMap (java.util)put:611, HashMap (java.util)doReadMap:145, MapDeserializer (com.alibaba.com.caucho.hessian.io)readMap:126, MapDeserializer (com.alibaba.com.caucho.hessian.io)readObject:92, Hessian2ObjectInput (org.apache.dubbo.common.serialize.hessian2)……callDecode:440, ByteToMessageDecoder (io.netty.handler.codec)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值