Java安全之log4j反序列化漏洞分析


Java安全之log4j反序列化漏洞分析

0x00 前言

前段時間在看某個cms代碼的時候,發現log4j組件版本存在漏洞,並且開啟了端口,但web站點是nginx反向代理的,而在外網並沒有開放到該端口,所以並沒有利用成功。但該漏洞遇到的比較少,就算一些cms中log4j組件版本存在漏洞,但是該漏洞需要使用SimpleSocketServer開啟端口才能夠接受socket中的數據進行反序列化操作,從而才能利用。

0x01 log4j 漏洞簡介

漏洞簡介

log4j用的其實還是比較多,記錄一些Java的日志,這個相信接觸過Java的都知道,在此不做多的贅訴。

漏洞版本:CVE-2019-17571

1.2.4 <= Apache Log4j <= 1.2.17

漏洞原因是因為調用SimpleSocketServer.main開啟一個端口,進行接受數據,進行反序列化操作。

根據官方描述作用是把接受到的LoggingEvent作為本地的日志記錄事件,再使用在服務器端配置的Log4J環境來記錄日志。默認可能會開啟在4560端口中。

0x02 log4j 反序列化分析

漏洞復現

配置漏洞代碼

import org.apache.log4j.net.SimpleSocketServer;
public class log4j {
    public static void main(String[] args) {
        System.out.println("INFO: Log4j Listening on port 1234");
        String[] arguments = {"1234", (new log4j()).getClass().getClassLoader().getResource("log4j.properties").getPath()};
        SimpleSocketServer.main(arguments);
        System.out.println("INFO: Log4j output successfuly.");
    }
}

配置log4j文件

log4j.rootCategory=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.threshold=DEBUG
log4j.appender.stdout.layout.ConversionPattern=[%d{yyy-MM-dd HH:mm:ss,SSS}]-[%p]-[MSG!:%m]-[%c\:%L]%n

然后使用yso生成gadget的序列化數據,直接使用nc進行發送。但是nc發送傳輸有時候會有些問題,有時候傳輸數據缺失,會反序列化失敗。

nc 127.0.0.1 1234 < log4j.curl.bin

漏洞分析

漏洞比較簡單,還是現在漏洞位置先下斷點。

跟進查看

在這里開啟serverSocket進行監聽,也就是socket的服務端,然后new了SocketNode進行傳入。

繼續跟進

而在這里接受了socket的數據。

下一步會來到run的這個方法里面,是因為前面調用了線程的start,而start的底層會調用run

直接就對ois也就是剛剛接受的socket數據,調用readobject進行反序列化。

0x03 工具編寫

在復現的時候,使用nc發送數據時數據傳輸不完整,導致反序列化失敗。就隨手寫了一個小工具,方便下次遇到的時候使用(可能也極少能遇到,比較雞肋)

命令執行:

反彈shell:

POC:


由於比較少見,反序列化回顯暫不構造。

github地址:https://github.com/nice0e3/log4j_POC

動動小手點點star

0x04 結尾

log4j的反序列化漏洞比較簡單,而類似於這種反序列化工具原理其實差不多,只是發包構造的數據包不一樣,分析一下漏洞知道漏洞怎么形成的。原理其實比較簡單,但也會遇到很多細節問題,如回顯方式,或gui的優化問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM