前言
前段时间看到普元 EOS Platform 爆了这个洞,Apache James,Kafka-UI 都爆了这几个洞,所以决定系统来学习一下这个漏洞点。
JMX 基础
JMX 前置知识
JMX(Java Management Extensions,即 Java 管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX 可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
可以简单理解 JMX 是 java 的一套管理框架,coders 都遵循这个框架,实现对代码应用的监控与管理。
JMX 的结构一共分为三层:
1、基础层:主要是 MBean,被管理的资源。分为四种,常用需要关注的是两种。
-
standard MBean 这种类型的 MBean 最简单,它能管理的资源(包括属性、方法、时间)必须定义在接口中,然后 MBean 必须实现这个接口。它的命令也必须遵循一定的规范,例如我们的 MBean 为 Hello,则接口必须为 HelloMBean。
-
dynamic MBean 必须实现 javax.management.DynamicMBean 接口,所有的属性,方法都在运行时定义。2、适配层:MBeanServer,主要是提供对资源的注册和管理。3、接入层:Connector,提供远程访问的入口。
JMX 基础代码实践
以下代码实现简单的 JMX demo,文件结构
代码解读
复制代码
├── HelloWorld.java ├── HelloWorldMBean.java └── jmxDemo.java
HelloWorldMBean.java
csharp
代码解读
复制代码
package org.example;public interface HelloWorldMBean { public void sayhello(); public int add(int x, int y); public String getName();}
HelloWorld.java
java
代码解读
复制代码
package org.example;public class HelloWorld implements HelloWorldMBean{ private String name = "Drunkbaby"; @Override public void sayhello() { System.out.println("hello world" + this.name); } @Override public int add(int x, int y) { return x + y; } @Override public String getName() { return this.name; }}
jmxDemo.java
java
代码解读
复制代码
package org.example;import javax.management.MBeanServer;import javax.management.ObjectName;import javax.management.remote.JMXConnectorServer;import javax.management.remote.JMXConnectorServerFactory;import javax.management.remote.JMXServiceURL;import java.lang.management.ManagementFactory;import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;public class jmxDemo { public static void main(String[] args) throws Exception{ MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName mbsName = new ObjectName("test:type=HelloWorld"); HelloWorld mbean = new HelloWorld(); mBeanServer.registerMBean(mbean, mbsName); // 创建一个 RMI Registry Registry registry = LocateRegistry.createRegistry(1099); // 构造 JMXServiceURL,绑定创建的 RMI JMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"); // 构造JMXConnectorServer,关联 mbserver JMXConnectorServer jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceURL, null, mBeanServer); jmxConnectorServer.start(); System.out.println("JMXConnectorServer is ready"); System.out.println("press any key to exit."); System.in.read(); }}
其中
-
Probe Level:创建了 HelloWorldMBean 实例 mbean
-
Agent Level:创建了 MBeanServer 实例 mbs
-
Remote Management Level: 创建了JMXServiceURL,绑定到本地 1099 rmi